java GC基本知识

java垃圾回收机制(Garbage Collection)是java一个基本的知识点,无论是在工作中还是在找工作的面试中都是一个重要的知识点。掌握GC不止包括理解GC原理,还包括如何对GC调优,如何与GC交互等。

了解java GC之前,先认识一下“堆”。在java中,所有使用new关键字创建的对象都是在堆中分配内存空间的,堆被划分为新生代、老年代和永久代,其中新生代又被分为Eden和Survivor区,而Survivor由FromSpace和ToSpace组成。永久代存放类常量和字符串常量等数据。


通俗地讲,GC就是回收不再使用的对象所占用的内存空间,那这就需要理解何时触发GC,如何确定对象不再使用,如何收回其所占用的空间。

何时触发GC

新创建的对象的内存空间位于新生代的Eden区。当Eden空间满后,会进行GC(此处的GC成为minor GC),主要做两件事:1.释放无用对象的空间,2.将活跃对象移动到survivor中。survivor空间中的对象在经过多次minor GC后如果依然活跃,则被移动到Tenured空间中,而Tenured空间的GC过程称为Major GC或者Full GC。一般而言,老年代的空间占满后会触发GC。
需要指出的是GC时间由系统决定,不可预测,即使调用System.gc()方法也不能确保立即执行。

如何确定对象不再使用

确定对象不再使用的算法有:引用计数法,根搜索法。
引用计数法指给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值加1;当引用失效时,计数器的值减;当该对象的计数器的值为0时,标志该对象失效。
根搜索法指通过一系列的名为“GCRoots”的对象作为起始点,从这些节点开始向下搜索,搜索过的路径称为引用链,当一个对象到GCRoots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达)时,则证明对象是不可用的。

如何收回空间

在minor GC过程中,Eden中活跃对象被移动到From Space或者To Space,需要指出的是From Space和To Space两个空间不能同时非空,即只有当一个占满后,再次通过minor GC将活跃对象移动到另一个空间。在执行机制上JVM提供了串行GC(SerialGC)、并行回收GC(ParallelScavenge)和并行GC(ParNew):串行GC指在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定。并行回收GC指在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数。并行GC与老年代的并发GC配合使用。
在Major GC过程中,采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并、要么标记出来便于下次进行分配,总之目的就是要减少内存碎片带来的效率损耗。主要方法有Serial GC、Parallel GC、Parallel Old GC (Parallel Compacting GC)、Concurrent Mark & Sweep GC  (or “CMS”)、Garbage First (G1) GC。Serial GC针对于单核机器,在老年代空间中的GC采取称之为”mark-sweep-compact“的算法。算法的第一步是标记老年代中依然存活对象。(标记)第二步,从头开始检查堆内存空间,并且只留下依然幸存的对象。(清理)最后一步,从头开始,顺序地填满堆内存空间,并且将对内存空间分成两部分:一个保存着对象,另一个空着(压缩)。Parallel GC使用多个线程,因此parallel GC更高效。这种GC在内存充足以及多核的情况下会很有用,因此我们也称之为”throughput GC“。Parallel Old GC分为三步:标记-汇总-压缩(mark – summary – compaction)。汇总(summary)步骤与清理(sweep)的不同之处在于,其将依然幸存的对象分发到GC预先处理好的不同区域,算法相对清理来说略微复杂一点。GMS和G1算法更加复杂,待后续分享。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值