目录介绍

  • 01.如何对对象划分
  • 02.年轻代对象说明
  • 03.年老代对象说明
  • 04.GC中对象的六种可触及状态
  • 05.垃圾回收器的类型

好消息

  • 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢!
  • 链接地址:https://github.com/yangchong211/YCBlogs
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!

01.如何对对象划分

  • 将对象按其生命周期划分
    • 年轻代(Young Generation)
    • 年老代(Old Generation)
    • 持久代(Permanent Generation)
    • 其中持久代主要存放的是类信息,所以与java对象的回收关系不大,与回收息息相关的是年轻代和年老代。

02.年轻代对象说明

  • 年轻代
    • 是所有新对象产生的地方。
    • 年轻代被分为3个部分——Enden区和两个Survivor区(From和to)
    • 当Eden区被对象填满时,就会执行Minor GC。并把所有存活下来的对象转移到其中一个survivor区(假设为from区)。Minor GC同样会检查存活下来的对象,并把它们转移到另一个survivor区(假设为to区)。这样在一段时间内,总会有一个空的survivor区。经过多次GC周期后,仍然存活下来的对象会被转移到年老代内存空间。通常这是在年轻代有资格提升到年老代前通过设定年龄阈值来完成的。需要注意,Survivor的两个区是对称的,没先后关系,from和to是相对的。

03.年老代对象说明

  • 年老代
    • 在年轻代中经历了N次回收后仍然没有被清除的对象,就会被放到年老代中,可以说他们都是久经沙场而不亡的一代,都是生命周期较长的对象。对于年老代和永久代,就不能再采用像年轻代中那样搬移腾挪的回收算法,因为那些对于这些回收战场上的老兵来说是小儿科。这时候MajsorGC会清理些老年代垃圾,通常会在老年代内存被占满时将会触发Full GC,回收整个堆内存。
    • 持久代:用于存放静态文件,比如java类、方法等。持久代对垃圾回收没有显著的影响。

04.GC中对象的六种可触及状态

  • GC中对象的六种可触及状态
    • 1.强可触及:对象可以从根结点不通过任何引用对象搜索到
    • 2.软可触及:对象不是强可触及的,但是可以从根结点开始通过一个或多个(未被清除的)软引用对象触及
    • 3.弱可触及:对象既不是强可触及也不是软可触及的,但是从根结点开始
    • 4.可复活的:对象既不是强可触及、软可触及,也不是弱可触及,但是仍然可能通过执行某些终结方法复活到这几种状态之一
    • 5.影子可触及:不上以上任何可触及状态,也不能通过终结方法复活,并且它可以从根结点开始通过一个或多个影子引用对象触及(影子引用不会被垃圾收集器清除,由程序明确地清除)
    • 6不可触及:就是已经准备回收的状态

05.垃圾回收器的类型

  • Java 提供多种类型的垃圾回收器。 JVM 中的垃圾收集一般都采用“分代收集”,不同的堆内存区域采用不同的收集算法,主要目的就是为了增加吞吐量或降低停顿时间。
    • Serial 收集器:新生代收集器,使用复制算法,使用一个线程进行 GC,串行,其它工作线程暂停。
    • ParNew 收集器:新生代收集器,使用复制算法,Serial 收集器的多线程版,用多个线程进行 GC,并行,其它工作线程暂停。 使用 -XX:+UseParNewGC 开关来控制使用 ParNew+Serial Old 收集器组合收集内存;使用 -XX:ParallelGCThreads 来设置执行内存回收的线程数。
    • Parallel Scavenge 收集器:吞吐量优先的垃圾回收器,作用在新生代,使用复制算法,关注 CPU 吞吐量,即运行用户代码的时间/总时间。 使用 -XX:+UseParallelGC 开关控制使用 Parallel Scavenge+Serial Old 收集器组合回收垃圾。
    • Serial Old 收集器:老年代收集器,单线程收集器,串行,使用标记整理算法,使用单线程进行GC,其它工作线程暂停。
    • Parallel Old 收集器:吞吐量优先的垃圾回收器,作用在老年代,多线程,并行,多线程机制与 Parallel Scavenge 差不错,使用标记整理算法,在 Parallel Old 执行时,仍然需要暂停其它线程。
    • CMS(Concurrent Mark Sweep)收集器:老年代收集器,致力于获取最短回收停顿时间(即缩短垃圾回收的时间),使用标记清除算法,多线程,优点是并发收集(用户线程可以和GC线程同时工作),停顿小。 使用 -XX:+UseConcMarkSweepGC 进行 ParNew+CMS+Serial Old 进行内存回收,优先使用 ParNew+CMS,当用户线程内存不足时,采用备用方案 Serial Old 收集。

其他介绍

01.关于博客汇总链接

02.关于我的博客