1、需要GC的内存区域:JAVA堆和方法区
2、GC的对象:引用计数和可达性分析
(1)引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
(2)可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。
在Java语言中,GC Roots包括:虚拟机栈中引用的对象。方法区中类静态属性实体引用的对象。方法区中常量引用的对象。本地方法栈中JNI引用的对象。
3、什么时候触发GC:程序调用System.gc。程序内存大小不足。
GC又分为 minor GC 和 Full GC (也称为 Major GC )
Minor GC触发条件:当Eden区满时,触发Minor GC。
Full GC触发条件: a.调用System.gc时,系统建议执行Full GC,但是不必然执行 b.老年代空间不足 c.方法去空间不足 d.通过Minor GC后进入老年代的平均大小大于老年代的可用内存 e.由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
4、GC做了什么事: 主要做了清理对象,整理内存的工作。Java堆分为新生代和老年代,采用了不同的回收方式。
网友评论