4.GC细节
来源:互联网 发布:歌曲变调软件下载 编辑:程序博客网 时间:2024/06/03 11:26
什么时候进行GC
(1)程序调用System.gc时可以触发。
(2)系统自身来决定GC触发的时机。
系统判断GC触发的依据:根据Eden区和From Space区的内存大小来决定。当内存大小不足时,则会启动GC线程并停止应用线程。
具体过程:当GC线程启动时,会通过可达性分析法把Eden区和From Space区的存活对象复制到To Space区,然后把Eden Space和From Space区的对象释放掉。当GC轮训扫描To Space区一定次数后,把依然存活的对象复制到老年代,然后释放To Space区的对象。
GC分类
新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具
备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。
老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Major GC,经常
会伴随至少一次的 Minor GC(但非绝对的,在 ParallelScavenge 收集器的收集策略里
就有直接进行 Major GC 的策略选择过程) 。MajorGC 的速度一般会比 Minor GC 慢 10
倍以上。
Minor GC ,Full GC 触发条件
Minor GC触发条件:
当Eden区满时,触发Minor GC。
Full GC触发条件:
(1)调用System.gc时,系统建议执行Full GC,但是不必然执行
(2)老年代空间不足
(3)方法区空间不足
(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
新生代的GC
HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。
在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。
对象进入老年代的判定
大对象直接进入老年代(阀值可以通过参数进行设定),为了避免E区和S区之间发生大量的内存复制。
长期存活的对象进入老年代,虚拟机给每个对象定义了一个年龄计数器,在E区中的对象经过一次GC仍然存活并能够被S区容纳,设置此对象的年龄为1,在S区中的对象,每熬过一次GC,就将年龄加1,当年龄达到一定的程度(默认是15,可以通过参数进行设置)就会进入老年代,
动态年龄判断,不一定只有年龄达到阀值才会进入老年代,当相同年龄的对象的总大小大于S空间的一半,则大于等于这个年龄的对象将会进入老年代。
- 4.GC细节
- 4. GC 算法(实现篇) - GC参考手册
- 4. GC 算法(实现篇) - GC参考手册
- gc()
- GC
- GC
- GC
- GC
- GC
- GC
- GC
- GC
- Gc
- GC
- GC
- GC
- GC
- GC
- 计算机网络读书笔记——数据链路层(3)
- spring整合Hibernate
- ACM 二分 Aggressive cows & 尺取 Subsequence
- 万能Asp防注入代码
- Java(二)输入/输出语句
- 4.GC细节
- build Variants创建不同配置的app(图文详解)
- JAVA数组找最大和最小的方法
- 打开一个进程的方法
- Linux学习总结 unit02文件管理
- HDU-1598 find the most comfortable road (并查集+枚举+贪心)
- Windows Server2012R2 FTP服务器配置
- 使用memwatch检查内存泄漏
- PHP连接MySQL数据库