java gc日志乱码_GC算法及垃圾收集器

  1. 概述
  • 垃圾收集通常被称为GC,内存立即回收主要集中于java堆和方法区中;
  1. 对象存活的判断

(1)判断方式:

  • 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收;此方法简单,无法解决对象相互循环引用的问题;
  • 可达性分析:从GC Roots开始向下搜索,搜索所走过的路径称为引用链;当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的;

(2)GC Root对象:

  • 虚拟机栈中引用的对象;
  • 方法区中类静态属性实体引用的对象;
  • 方法区中常量引用的对象;
  • 本地方法栈中JNI引用的对象;
  1. 垃圾收集算法

(1)标记-清除算法(Mark-Sweep)

  • 描述:算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象;
  • 特点:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片;
e3388eaf58ce0eaca6ec325f37ca70bc.png

(2)复制算法(Copying)

  • 描述:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块;当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉;
  • 特点:每次都是对其中的一块进行内存回收,不用考虑内存碎片的,内存缩小为原来的一半,持续复制长生存期的对象则导致效率降低;
f857b110cb29f7bb75a0bc47d7cd6269.png

(3)标记-整理算法(Mark-Compact)

  • 描述:标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存;
  • 特点:结合了上面两种算法的优点;
7122ca72a1f0c117cdd312a36ba2f548.png

(4)分代收集算法(Generational Collection)

  • 把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法;
  • 新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法;
  • 老年代中,因为对象存活率高、没有额外空间对它进行分配担保,就使用“标记-清理”或“标记-整理”算法来进行回收;
  1. 垃圾收集器

(1)Serial收集器

  • 概念:串行收集器,单线程收集,采用复制算法实现,回收过程会stop the world
  • 特点:稳定、效率高、但会长时间停顿,适合新生代回收
  • 参数控制:-XX:+UseSerialGC(Serial收集器)
99e7530716ddbc43b3e84da3399e5473.png

(2)ParNew收集器

  • 概念:ParNew收集器其实就是Serial收集器的多线程版本;
  • 特点:适合新生代回收;
  • 参数控制:-XX:+UseParNewGC(ParNew收集器)、-XX:ParallelGCThreads(限制线程数量)
45d1eb09e1f1810cbff7f0fad61f7dce.png

(3)Parallel收集器

  • 概念:类似ParNew收集器,Parallel收集器更关注系统的吞吐量;
  • 特点:可以通过参数来打开自适应调节策略,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量,适合新生代回收
  • 参数控制:-XX:+UseParallelGC(Parallel收集器)

(4)Serial Old收集器

  • 概念:是 Serial收集器的老年代版本,单线程收集,使用标记-整理算法;
  • 特点:适合老年代收集
  • 参数控制:-XX:+UseSerialOldGC(Serial Old收集器)

(5)Parallel Old收集器

  • 概念:是 Parallel收集器的老年代版本,多线程收集,使用标记-整理算法;
  • 特点:适合老年代收集
  • 参数控制:-XX:+UseParallelOldGC(Parallel Old收集器)

(6)CMS收集器(Concurrent Mark Sweep)

  • 概念:是一种以获取最短回收停顿时间为目标的收集,基于标记-清除算法实现,多线程收集;
  • 特点:适合老年代收集,并发手机、低停顿、但会产生大量空间碎片;
  • 步骤:初始标记(CMS initial mark):Stop The World并发标记(CMS concurrent mark):GC Roots Tracing重新标记(CMS remark):Stop The World并发清除(CMS concurrent sweep)
  • 参数控制:-XX:+UseConcMarkSweepGC: 使用CMS收集器-XX:+ UseCMSCompactAtFullCollection :Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长`-XX:+CMSFullGCsBeforeCompaction: 设置进行几次Full GC后,进行一次碎片整理-XX:ParallelCMSThreads :设定CMS的线程数量(一般情况约等于可用CPU数量)
5aaba8863c94f992b101c12ee5ac8632.png

(7)G1收集器

  • 概念:G1收集器采用标记-整理算法,Java堆的内存布局与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔阂了,它们都是一部分(可以不连续)Region的集合;
  • 特点:空间整合:G1采用标记整理算法,不会产生空间碎片;可预测停顿:G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为N毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒;
  • 步骤:初始标记:stop the world,出现在一次正常的年轻代GC上,标记可能有引用指向老年代对象的survivor区(根 region);扫描根区域:扫描survivor区中引用到老年代的引用,此阶段应用程序的线程会继续运行,在年轻代GC可能发生之前此阶段必须完成;并发标记:在整个堆中查找活着的对象,此阶段应用程序的线程照常运行,此阶段可以被年轻代GC打断;再次标记:stop the world,完成堆内存中存活对象的标记,使用一个叫snapshot-at-the-beginning(SATB,起始快照)的算法,比CMS使用的算法快很多;清理:stop the world,并发执行,在存活对象和完全空闲的区域上执行统计,stop the world擦写Remembered Sets,重置空heap区并将他们返回给空闲列表;拷贝:stop the world,产生STW事件来转移或拷贝存活的对象到新的未使用的heap区,只有在年轻代范省市日志会记录为GC pause young,在年轻代he老年代一起执行则被日志记录为GC pause mixed;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值