目录
1.什么是内存垃圾
2.什么是垃圾回收 GC(garbage collection)
JDK自带的jvisualvm工具,安装Visual GC插件
3.对象与指针的关系
4. 指针是可以传递的
5. 禁止直接操作对象中的属性, 用成员方法封装操作对象属性的过程
6.JVM运行时概况
7.方法区(Method Area--->JDK1.8后改名为元空间Meta Space)
栈区(Stack Area)
堆区(Heap Area)
8.JVM垃圾回收算法(GC)
Minor GC和Major GC/Full GC的区别
9.创建商品类Goods
1.什么是内存垃圾
内存中创建的对象,Java启动后不再使用后被称为内存垃圾:(方法区中的类信息,堆中的类对象),常量(常量池),对象(堆)。
2.什么是垃圾回收 GC(garbage collection)
创建对象时,需要在对应的内存区域分配内存空间,如果该区域不足,就触发该区域的gc.
System.gc()----手动回收垃圾jdk提供了一个gc函数,调用这个函数,就完成对JVM虚拟机内存进行一次GC
自动gc,当JVM虚拟机启动后,后台会自动运行一个gc程序,负责内存的gc操作
这个后台的gc程序定时做gc操作,或者当jvm内存不够的时候,会立刻触发gc
JDK自带的jvisualvm工具,安装Visual GC插件(查看内存)
3.对象与指针的关系
java指针被严格管理不能任意操作指针,只能通过指针访问对象,或者对指针之间赋值,这很好保证java对象不受意外破坏和保证了安全性,java称这种指针为引用,引用和指针本质上相同的。
同一个对象可以被多个指针同时指向
一个指针可以指向不同的对象,但是同一时刻只能指向同一个对象
测试当对象有指针指向的的时候,对象不会被垃圾回收器回收
当对象没有指针指向的时候,对象会被垃圾回收器回收(不是立即回收,在后台的gc程序定时做gc操作,或者当jvm内存不够)
4. 指针是可以传递的
从栈中传递到堆区
随机生成堆区的对象后, 将对象的指针传递到数组中进行存储
从栈中传递到另一个栈中
到killOk方法中, 这样可以在killOk方法中通过怪物的指针获取到被杀死的怪物对象中的信息
5. 禁止直接操作对象中的属性, 用成员方法封装操作对象属性的过程
对象中的属性被private封装了
所有操作都应该提供成员方法, 用指针去调用成员方法来操作
例如: 当宠物攻击或被攻击, 怪物攻击或被攻击, 都应该提供对应的成员方法进行调用
6.JVM运行时概况
7.方法区(Method Area--->JDK1.8后改名为元空间Meta Space)
存储字节码文件
栈区(Stack Area)
不需要垃圾回收
栈区中的局部变量不能共享
堆区(Heap Area)
生存者1区
生产者2区
老年区
程序运行过程中很多的对象都是朝生夕死
小对象出生在伊甸园区,gc后,如果能存活下来就会被转移到幸存者区,对象的年龄计数器会+1
当对象经历了16次回收后依然能够存活,会进入老年代
重对象/大对象一出生就在老年代
8.JVM垃圾回收算法(GC)
Minor GC和Major GC/Full GC的区别
Minor GC发生在新生代的GC, 速度很快
Major GC/Full GC发生在老年代的GC,通常Major GC发生的时候都伴随着Minor GC的发生,速度比较慢
在JVM虚拟机执行GC的时候,所有的线程都会暂停运行,有一句叫做“stop the world!”
9.创建商品类Goods
属性 注意考虑商品属性的数据类型
商品名称 name
商品价格 price
商品描述 description
商品库存 stock
商品分类 category
商品状态 state
//商品名称 name
private String name;
//商品价格 price
private Double prise;
//商品描述 description
private String description;
// 商品库存 stock
private Character stock;
//商品分类 category
private String category;
//商品状态 state
private Boolean state;
成员方法 show
作用打印商品对象信息
public void show(){
System.out.println("****欢迎光临****");
System.out.println("**"+"商品名称"+this.name+"**");
System.out.println("**"+"价格:"+this.prise+"**");
System.out.println("**"+"商品描述"+this.description+"**");
System.out.println("**"+"商品库存"+this.stock+"**");
System.out.println("**"+"商品分类"+this.category+"**");
System.out.println("**"+"商品状态"+this.state+"**");
}
构造方法
public Goods(String name, Double prise, String description, Character stock, String category, Boolean state) {
this.name = name;
this.prise = prise;
this.description = description;
this.stock = stock;
this.category = category;
this.state = state;
}
setter/getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrise() {
return prise;
}
public void setPrise(Double prise) {
this.prise = prise;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Character getStock() {
return stock;
}
public void setStock(Character stock) {
this.stock = stock;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Boolean getState() {
return state;
}
public void setState(Boolean state) {
this.state = state;
}
创建测试类Demo
静态变量声明商品数组, 初始长度为10
静态变量控制台输入
static Goods[] goodsArr = new Goods[10];
static Scanner sc = new Scanner(System.in);
添加商品方法1 - addGoods1()
使用构造方法初始化商品对象数据 (注意: 数组长度不够了要提示去扩容)
控制台接受用户输入商品信息
使用全参构造方法构造商品对象
商品对象存入商品数组中
添加商品方法 2 - addGoods2() 使用设值器set方法初始化商品对象数据 注意: 数组长度不够了要提示去扩容
控制台接受用户输入商品信息
使用无参构造方法构造商品对象
使用商品对象的设值器set方法存入商品数据到商品对象中
商品对象存入商品数组中
遍历商品方法 - display() 注意: 遇到数组中null的元素要判断, 防止出空指针异常
遍历商品数组, 取出每个商品对象, 调用对象的show()方法打印商品信息
商品数组扩容方法
main方法
使用do.while循环打印菜单
1. 添加商品1
2. 添加商品2
3. 查看商品
4. 商品数组扩容
5. 退出
接受用户输入的菜单编号
使用switch.case 判断用户选择的菜单, 调用对应的方法



