JVM有一个称为垃圾回收器的低级线程,这个线程在后台不断地运行,自动寻找在Java程序中不再被使用的对象,并释放这些对象的内存。这种内存回收的过程被称为垃圾回收(Garbage Collection)
堆的分配

注意:所有的new 出来的对象,初始位置都是Eden
Eden : Survive(from:to) 的内存是: 8 : 2(1:1)
新生代:老年代 = 1 :2
具体的回收
图解
文字步骤
第一次回收:
当Eden空间满了,GC线程,将会检查每个对象的使用次数标记,当标记为0时,表示该对象已经没有被引用,可以被GC回收。
当前标记不为0时,表示该对象依旧有被引用,不能被回收,将使用 “复制算法” 将对象复制到From区间,并记录它的复制次数为1
第二次回收:
当Eden再次空间满了,GC线程,将同时检查Eden以及From区间,
判断每个对象的使用次数标记,当标记为0时,表示该对象已经没有被引用,可以被GC回收。
当前标记不为0时,表示该对象依旧有被引用,不能被回收,将使用 “复制算法”将
对象复制到To区间,并记录它的复制次数为2 或 1
并将From 改名为To ,将To 改名为From
第三次回收
当Eden再次空间满了,GC线程,将同时检查Eden以及From区间,
判断每个对象的使用次数标记,当标记为0时,表示该对象已经没有被引用,可以被GC回收。
当前标记不为0时,表示该对象依旧有被引用,不能被回收,将使用 “复制算法”将
对象复制到To区间,并记录它的复制次数为3 或 2 或 1
并将From 改名为To ,将To 改名为From
第N次回收,效果一样
但是对象不能永远都在新生代,当对象的复制次数 > 15 ,依旧再被引用。此时对象将被复制到老年代
老年代如果满了,就麻烦大了,将会触发:Full GC(全量垃圾回收)
垃圾回收的算法
标记算法:标记对象的引用次数 当次数>0 表示对象正在被使用,当==0时,表示对象可以被清理
清理算法:就是将对象从内存中干掉,一般来讲清理之后,会有内存的碎片,需要整理
复制算法:就是将对象在转移时,copy复制一份,同样要记录复制次数
如何回收对象
Object类是所有Java类的子类,实例化的对象,本身也会继承Object类中的方法,其中有一个方法【
finalize()】就是用来回收本对象的方法
System.gc()/Runtime.gc()
程序员可以通过System.gc()或者Runtime.gc(),通知JVM开始回收垃圾。这也是程序员唯一可以参与垃圾回收的地方
注意:System.gc()或者Runtime.gc() 并不一定,就正儿八经可以让JVM进行GC回收,原因是:JVM回收有它自己的条件(Eden满,或老年代满)
有总比没有强!!!
