java 垃圾回收总结和面试和应用

父文章

   1. 面试 fei33423

    2. 人人都是面试_个人渣记录仅为自己搜索用的博客-CSDN博客

 3. p6 p7 - 博客园

子文章 为什么 cms 新生代垃圾回收时能做到不全表扫描,G1能做到回收控制 - fei33423

 1. 总结性文章   

 JVM中垃圾回收算法及分代垃圾收集器 


1.1 新生代用什么垃圾回收算法, cms是新生代的算法么, 几个步骤, 暂停几次, cms 的全称. 详见上面链接文章

1.2 "gcRoots"  ( 详见 gcRoots详解 和 为什么 cms 新生代垃圾回收时能做到不全表扫描,G1能做到回收控制_个人渣记录仅为自己搜索用的博客-CSDN博客 ,包含 类静态,常量, 栈Stack Local, threadLocal,jni native),

1.2  "cardTable" 的用法(主要和老生代和新生代关联,存活对象多): 新生代从 GcRoots到老生代cardTable,就可以不用继续遍历下去了. cms 老生代的遍历直接从cardTable然后接着遍历即可.

2.重点讲解cms 

知道哪些未分配,哪些分配了,在分配里的里面找到死循环的量.

CMS之promotion failed&concurrent mode failure - 简书

JVM新生代、老年代的默认比值真的是1:2吗?

不可错过的CMS学习笔记 | 并发编程网 – ifeve.com

   作用于老年代 ,内含"浮动垃圾",7个过程,两次stop word ,(内含 cardTable 和cms无关,是ygc的一个能力. )  CMS垃圾回收器详解 - ZT丶 - 博客园n​​​​

2.1 哪两个阶段会stw? why  1.初始  2.再标记.  尽可能多清除垃圾,能保证新分配的内存不被误清除,但会出现浮动垃圾.  

2.2 既然新增的对象都会记录下来,不stw行不行?

 2.2.1.  不stop the word, 标记何时是个头,可能无法停止.

2.2.2  重定位期间, 不stop读可能读到错误的数据

  ZGC详解_复习 标记-复制(整理)算法

2.3 新对象 如何避免被误删?  jvm 对已分配内存和未分配内存是知道的. 新对象是将未分配内存到已分配内存中.  详见 JVM 三色标记法与读写屏障 

2.4 设置为null后然后又被链接到黑色对象上去. 如何避免误删?  详见   JVM 三色标记法与读写屏障  和 JVM垃圾收集之三色标记算法详解 增量更新  本质上误标记对象的挪动,链接(增量更新)到黑色对象,从灰色/白色对象上断链接.(原始快照)

   cms,其他步骤不stop word不会误回收的原因是会记忆变动的内存分配,留在下次再清理,故会存在浮动垃圾. 第二次再次stop word再标记的原因是尽可能多的清理垃圾, 但后面清理期间还是会出现新的内存分配和释放,保证不误清除,但是会多出浮动垃圾.

  CMS垃圾回收器基于标记-清除算法实现,那么使用该算法的最大缺点也显而易见——大量的内存碎片。内存碎片过多时会给大对象分配带来麻烦,即会存在空间足够,但是连续的空间太小,这样的话就会触发Full GC,CMS发送FGC就会使用SerialOld进行老年代回收,这个过程如果内存比较大的话,就会产生很长的STW(几个小时-几天的STW)

CMS收集器的GC周期主要由7个阶段组成,其中有两个阶段会发生stop-the-world,其他阶段都是并发执行的。(亦有4个阶段、6个阶段等说法)

 浮动垃圾 解释的不好. 浮动垃圾即标记后删除, . 在之前的标记中已经被标记过了, 后面被清空了, 本来应该被回收, 但是本次不会被回收.  本来应该回收的垃圾不会被回收.

  和cms stop 原因是, 避免标记过后链接上新节点.  和浮动垃圾相反.  避免没标记到但其实已经create了, 会被回收.

  子文章 基于日志理解 cms 原理,为什么remark要stop the world?(理解CMS GC日志.)_个人渣记录仅为自己搜索用的博客-CSDN博客_cms原理

3. G1

  相关文章 为什么 cms 新生代垃圾回收时能做到不全表扫描,G1能做到回收控制 - fei33423

 文章1   垃圾回收器之 G1 垃圾回收器_嘿,鱼骨头^O^的博客-CSDN博客_g1垃圾回收器并发标记应该是会触发的.

 文章2  CMS垃圾回收器和G1垃圾回收器区别_shlgyzl的博客-CSDN博客_垃圾回收g1  

为什么G1可以更快? 类似concurrentHashMap分段的作用. 但是区别是哪怕是想回收1个新生代块,也需要全局stop world .不然你不知道是不是被gc root关联到.  能降低stop the world时间的根本原因还是利用了层级结构,不需要遍历所有的对象. 即card table . 本质上是学习了cms里cardStable用法. 但G1的old区会多一些. 

  https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html

If a garbage collector does not collect the entire heap (an incremental collection), the garbage collector needs to know where there are pointers from the uncollected part of the heap into the part of the heap that is being collected. 

每个区域都可以独立的作为伊甸园、幸存区还有老年代,有一个相关的参数叫
-XX:G1HeapRegionSize=size
,就是设置它这个区域的大小,当然设置这个区域必须设成1 / 2 / 4 / 8 / 16 这样的大小,其实从这
可以想象到,如果堆内存过大,那肯定是回收速度越来越慢,因为那要涉及到对象的复制包括标记,内存大确
实会对这两项速度都会造成影响,而把它分成小的区域来进行管理,化整为零,那么这样呢就可以进行一些优化,
加快它的标记包括拷贝的速度。

Full GC触发机制:

  • 调用System.gc时,系统建议执行Full GC,但是不必然执行
  • 老年代空间不足
  • 方法区空间不足
  • 通过Minor GC后进入老年代的平均大小大于老年代的可用内存
  • 由Eden区、survivor space1(From Space)区向survivor space2(To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
  • 当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载

4. zgc

    颜色指针和读屏障(拦截器)  { phil注 cms和g1都是写屏障(拦截器,即dirtyTable) }  和 concurrentHashMap 很像,最终切换之前. 每个节点通过forwardNode 到迁移上真正的map上读取. 停顿的时间仅仅是当前这个指针. 

ZGC详解_fedorafrog的博客-CSDN博客_zgc详解

 ZGC有什么缺点? - 知乎

新一代垃圾回收器ZGC的探索与实践

java 定位实战_个人渣记录仅为自己搜索用的博客-CSDN博客

1. 原理概念理解. 并发,并行. 浮动垃圾.cms二次回收.

2. 组合关系,为啥不能组合. 对应的jvm配置

3. 细节调优, cms 的几种fail .内存大小

4. zgc 和 机房迁移, redis迁移的相关性?

  机房迁移把数据要分成key/Value的业务和,list业务. 退款业务,业务上一定要锁根对象.即order  创建具备迁移属性/多机房属性 的分布式id , zgc 和迁移_个人渣记录仅为自己搜索用的博客-CSDN博客

#并行和并发

  • 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
  • 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行。而垃圾收集程序运行在另一个CPU上。

#吞吐量(Throughput)

吞吐量就是CPU用于运行用户代码的时间CPU总消耗时间的比值,即

吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间)。

假设虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

#垃圾回收大图及组合关系

#总结表格

收集器参数来自官网 串行、并行or并发新生代/老年代算法目标适用场景
Serial

-XX:+UseSerialGC

串行新生代复制算法响应速度优先单CPU环境下的Client模式
Serial Old

作为cms的兜底. 

串行老年代标记-整理响应速度优先单CPU环境下的Client模式、CMS的后备预案
ParNew

-XX:+UseParNewGC 当-XX:+UseConcMarkSweepGC 时,该参数自动打开.

并行新生代复制算法响应速度优先多CPU环境时在Server模式下与CMS配合
Parallel Scavenge

-XX:+UseParallelGC 会自动打开UseParallelOldGC.

并行新生代复制算法吞吐量优先在后台运算而不需要太多交互的任务
Parallel Old

-XX:+UseParallelOldGC 会自动打开UseParallelGC.

并行老年代标记-整理吞吐量优先在后台运算而不需要太多交互的任务
CMS自动打开ParNew并且把Serial Old作为兜底.并发老年代标记-清除响应速度优先集中在互联网站或B/S系统服务端上的Java应用
G1 跨代.并发both标记-整理+复制算法响应速度优先面向服务端应用,将来替换CMS

原理:

     新生代stw么?

        需要,且很快. 依赖cardTable

     浮动垃圾是啥?

        标记后,又被set null的垃圾.         

     cms remark阶段为啥要要stopTheWord?       

        不remark的话,可能会误删除某些数据

     浮动垃圾和cms为啥不矛盾?

        如上解释

     垃圾回收分位allocated和free两大块. 浮动垃圾是在remark后的free块上生成的,而remark之前的阶段和用户线程是并发的,所以不能锁死哪些是free,哪些是allocated?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值