1、前文回顾

1、G1中有新 、老、大三种Region

2、新生代回收条件:新生代Eden区满的时候

3、新生代GC仍然采用复制算法

4、控制停顿时间,对Region进行挑选回收

5、进入老年的条件:

(1)熬过了一定次数的GC

(2)动态年龄判定规则

(3)存活对象在Survivor放不下

比先前的垃圾收集器少了:大对象直接进入老年代,G1中的大对象不占用老年代的份额。但大对象确实又占了堆,即极端情况下,老年代或新生代的最大值是达不到的。

2、什么时候触发新生代+老年代的混合垃圾回收?

-XX:InitiatingHeapOccupancyPercent,默认值是45%,表示如果老年代占据了堆内存的45%的Region的时候,触发混合回收

??问题:默认老年代占40%,而混合回收的条件是‘老年代占堆的45%’,也就是说默认情况下永远不会触发混合回收?

答:没说老年代默认是40%,新生代不足60%的时候,老年代会到达45%的。DS:默认设置下,老年代并不是1-60%=40%,而应该是堆内存的40%到95%(1-5%=95%),5%是新生代默认初始占比,60%是新生代默认最大占比

3、G1垃圾回收的过程

老年代:

初始标记 - STW,标记一下GC  Roots直接能引用的对象,很快

并发标记 - 和应用并行,进行GC Roots追踪存活对象,并记录新建和失去引用对象

最终标记 - STW,根据并发标记阶段的结果,最终标记垃圾对象

混合回收

1、预估:这个阶段计算老年代中每个Region中的存活对象数量,存活对象的占比,垃圾回收的预期性能和效率

2、STW回收:选择性价比最高的Region进行回收,这个阶段会为了降低对应用的影响, 将回收操作默认分成了8次(-XX:G1MixedGCCountTarget控制),即MaxGCPauseMills时间 = 8次回收时间之和

3、细分8次,5%停止:默认情况下,有可能回收次数不会达到8次,因为回收过程中,回收的Region数量到达了堆空间的5%(-XX:G1HeapWastePercent控制)就会停止回收。意思是:回收空间应该够用了,停下来让应用程序去执行吧。

? ? 文中没有提到什么时候进行老年代单独GC,是不是可以认为和CMS一样,每次MajorGC都会伴随着一次MinorGC,在G1里就是MixedGC?

答:对的,可以这么认为。

??文中提到混合回收阶段,会对老年代进行计算和评估,那么什么时候对新生代空间中对象和大对象Region的计算和评估?

答:就在混合回收阶段的过程中,几次标记之后就会计算

4、G1垃圾回收器的一些参数

-XX:G1MixedGCLiveThresholdPercent 必须是存活对象低于85%的Region才可以进行回收,回收存活大于85%的复制成本很高。

5、回收失败时的Full GC

新/老代进行回收采用的都是复制算法,如果空闲的Region不够用,则STW,然后采用单线程进行标记、清理和压缩整理,速度极其慢

??回收失败时进行FullGC ,此时回收时间受MaxGCPauseMills次数约束么,什么时候会结束?

答:不受影响,务必回收完毕再说

6、本文总结

触发MixedGC条件:老年代占堆的45%;

G1的GC过程:

老年代GC:

初始标记STW,并发标记,最终标记

MixedGC:

预估;细分8次STW回收;回收到堆的5%停止

本文是《从 0 开始带你成为JVM实战高手》内容总结,版权问题,特此声明。详细内容:

如果购买,成功后加QQ群找群主返现10元

031、jvm实战总结:动手实验:线上系统部署如果采用G1垃圾回收器,应该如何设置参数?相关推荐

  1. 程序员搞事!动手实战优化自己公司线上系统JVM,结果。。。

    Java性能调优都是老生常谈的问题,特别当"糙快猛"的开发模式大行其道时,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 比如,下面这些典型的性能问题,你肯定或多或少 ...

  2. jvm性能调优 - 07线上应用部署JVM实战_栈内存与永久代预估与设置

    文章目录 Pre 基于案例,说说不合理设置内存的反面示例 大促期间,流量激增 少数请求需要几十秒处理,导致老年代内存占用变大 老年代对象越来越多导致频繁垃圾回收 小结 如何合理设置永久代大小? 如何合 ...

  3. jvm性能调优 - 06线上应用部署JVM实战_堆内存预估与设置

    文章目录 Pre 核心参数 如何在启动系统的时候设置JVM参数? 百万交易系统JVM设置案例 业务 系统的压力在哪里? 每秒钟需要处理多少笔支付订单? 每个支付订单处理要耗时多久? 每个支付订单大概需 ...

  4. jvm性能调优 - 20G1垃圾回收器应该如何设置参数

    文章目录 Pre 什么时候触发新生代+老年代的混合垃圾回收? G1垃圾回收的过程 初始标记 并发标记 最终标记 混合回收 G1垃圾回收器的一些参数 回收失败时的Full GC 思考 Pre 上篇文章大 ...

  5. JVM面试必问:G1垃圾回收器

    摘要:G1垃圾回收器是一款主要面向服务端应用的垃圾收集器. 本文分享自华为云社区<JVM面试高频考点:由浅入深带你了解G1垃圾回收器!!!>,原文作者:Code皮皮虾 . G1垃圾回收器介 ...

  6. jvm性能调优实战 - 30使用jmap和jhat摸清线上系统的对象分布

    文章目录 Pre 使用jmap了解系统运行时的内存区域 jmap -heap PID 使用jmap了解系统运行时的对象分布 jmap -histo PID 使用jmap生成堆内存转储快照 使用jhat ...

  7. 036、JVM实战总结:糟糕!运行着的线上系统突然卡死无法访问,万恶的JVM GC!

    提醒大家复习时,只看标题进行回想并尝试回答,然后再看内容. 1.前文回顾 前5周分析了JVM核心原理.出现GC的问题情形. 2.基于JVM运行的系统最怕什么? STW 造成的卡顿问题 3.年轻代gc到 ...

  8. 线上系统的JVM内存是否设置的越大越好?

    "线上系统的JVM内存是否设置的越大越好?"乍一听到这个问题,我第一个反应就是"NO",但是,具体为什么不行,又说不出什么所以然来. 其实,说一个东西不行,我们 ...

  9. JVM第六讲:线上环境 FGC 频繁,如何解决?

    本文是JVM第六讲:线上环境 FGC 频繁,如何解决?重点:得靠经验来解决 文章目录 1.问题背景 2.遇到的问题及解决方案 2.1.pinpoint 打点存在大批量300ms以上 2.2.应用 cp ...

最新文章

  1. 【视频课】先搞懂你用的模型,深度学习模型分析课程来了!
  2. 机房网络 与 LVS
  3. Windows使用筛选器来处理异常
  4. 动态规划 —— 树形 DP
  5. Python学习笔记简单数据类型之字符串
  6. Java案例:Java版生命游戏
  7. java cookie包_Java cookie的使用
  8. cmd进入mysql界面的命令
  9. iOS 蓝牙开发中数据收发的坑
  10. hilbert滤波器 matlab,用MATLAB实现Hilbert变换
  11. 树莓派PICO使用MicroPython + HX1838 接收遥控器数据 NEC解码
  12. PHP导出Excel单元格内换行
  13. 普通文档怎么换成php,wps只读文档怎么修改为普通文档
  14. Markdown编辑器-初始模板参考
  15. 怎样在大公司混成中层干部
  16. 认真学习数据结构之树
  17. linux搭建泰拉瑞亚(Terraria)服务器
  18. NOJ1055叙拉古猜想——水题
  19. 使用jquery做一个简单的当月日历插件
  20. C1-见习工程师能力认证-02

热门文章

  1. Linux 文件传输
  2. mysql解压版配置win8_Windows安装mysql8解压版
  3. yum用法及程序编译安装
  4. tomcat配置mysql数据源_Tomcat中配置mysql数据源
  5. springboot实体映射到数据库_SpringBoot 操作 ElasticSearch 详解
  6. eclipse修改git账号信息
  7. ireport模块之间的动态传参及拼接SQL
  8. 指针传递和strcpy的实现
  9. P5112 FZOUTSY
  10. Python调用Tushare抓取上证指数并作初步分析示例