什么是内存垃圾?
JVM堆内存中,已经确认不再被使用的内存对象。
什么是垃圾回收 GC(garbage collection)
创建对象时,需要在对应的内存区域分配内存空间,如果该区域不足,就触发该区域的gc.
System.gc()----手动回收垃圾jdk提供了一个gc函数,调用这个函数,就完成对JVM虚拟机内存进行一次GC
手动gc,JDK提供了一个gc函数,调用这个函数,就完成对JVM虚拟机内存进行一次GC
自动gc,当JVM虚拟机启动候,后台会自动运行跟一个gc程序,负责内存的gc操作
这个后台的gc程序会定时做gc操作,
jdk自带的jvisualvm工具 ,安装 Visual GC插件
对象与指针的关系
同一个对象可以被多个指针同时指向
一个指针可以指向不同的对象,但是同一时刻只能指向一个对象
测试当对象有指针指向的时候,对象不会被垃圾回收期回收
当对象没有指针指向的时候,对象会被垃圾回收器回收(不会立即回收)
方法区(Method Area--->JDK1.8后改名为元空间Meta Space)
存储字节码文件
栈区Stack Area
不需要垃圾回收
栈区中的局部变量不能共享
堆区 Heap Area
新生代(回收最频繁的区域)
伊甸园区
老年区
幸存者1区
幸存者2区
程序运行中很多对象都是朝生夕死
小对象出生在伊甸园区, gc后,如果能存活下来会被转移到幸存者区,对象的年龄计数器会+1
当对象经历了16次回收依然能够存活,会进入老年代
重对象/大对象一出生就在老年代
引用数据类型 (称为指针)
Minor GC和Major GC/Full GC的区别
Minor GC 发生在新生代的GC,速度很快
Major GC/Full GC 发生在老年代的GC,通常Major GC发生的时候都伴随着Minor GC的发生,速度比较慢
在执行GC的时候,所有的线程都会暂停运行,有一句叫做“stop the world ”
栈区中的栈帧也是一个对象(不需要垃圾回收)
元空间
里面是字节码
常量池
常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。
一个对象可以同时被多个指针指向 一个指针可以指向不同的对象, 但是同一时刻只能指向1个
指针是可以传递的
从栈中传递到堆区 例如: 领养宠物成功后, 将宠物对象的指针传递到宠物数组中进行存储 随机生成怪物对象后, 将怪物对象的指针传递到怪物数组中进行存储 从栈中传递到另一个栈中 例如: 宠物杀死怪物成功后, 调用宠物的killOk方法, 并把怪物的指针传递 到killOk方法中, 这样可以在killOk方法中通过怪物的指针获取到被杀死的怪物对象中的信息
禁止直接操作对象中的属性, 用成员方法封装操作对象属性的过程 对象中的属性被private封装了 所有操作都应该提供成员方法, 用指针去调用成员方法来操作 例如: 当宠物攻击或被攻击, 怪物攻击或被攻击, 都应该提供对应的成员方法进行调用
指针不指向对象的时候,就会被栈区销毁