文章目录

  • 关于java程序性能
    • 响应能力
    • 吞吐量
  • G1 Garbage Collector
    • g1收集器的设计目标:
    • G1的设计规划,是要替换掉CMS。
    • 之前的GC收集器对Heap的划分:
    • G1对Heap的划分:
    • **G1内存的分配**
    • 何时使用G1(-XX:+UseG1GC)
  • G1垃圾回收步骤详解
    • G1 Young GC(STW)
    • G1 Mix GC
    • g1 对老年代回收-总结:

关于java程序性能

当我们调优java程序时,通常的目标有两个:
响应能力 或者 吞吐量

响应能力

响应能力指一个程序或者系统对请求的是否能够及时响应。
比如:
一个桌面UI能多快的响应一个事件;
一个网站能够多快返回一个页面请求;
数据库能够多快返回查询的数据;

对于这类对响应能力敏感的场景,长时间的停顿是无法接受的。

吞吐量

吞吐量关注的是,在一个指定的时间内,最大化一个应用的工作量。
如下方式来衡量一个系统吞吐量的好坏:

在一小时内同一个事务(或者任务、请求)完成的次数(tps)。
数据库一小时可以完成多少次查询;

对于关注吞吐量的系统,卡顿是可以接受的,因为这个系统关注长时间的大量任务的执行能力,单次快速的响应并不值得考虑。

应用程序运行实际/实际时间(开始时间戳-结束时间戳)

understanding TPS

G1 Garbage Collector

G1垃圾收集器

g1收集器是一个面向服务端的垃圾收收集器,适用于多核处理器、大内存容量的服务端系统。
它满足短时间gc 停顿的同时达到一个高的吞吐量。JDK7以上版本适用。

g1收集器的设计目标:

与应用线程同时工作,几乎不需要stop-the-world(与CMS类似);
整理剩余空间,不产生内存碎片;(CMS只能在full-GC时,用stop-the-world整理碎片内存)
GC停顿更加可控;
不牺牲系统的吞吐量;
gc不要求额外的内存空间(CMS需要预留空间存储浮动垃圾);

G1的设计规划,是要替换掉CMS。

G1在某些方便弥补了CMS的不足,比如,CMS使用的是mark-sweep算法,自然会产生内存碎片;然而G1基于copying算法,高效的整理剩余内存,而不需要使用free-list去管理内存碎片。
另外,G1提供了更多手段,以达到对gc停顿时间可控。

之前的GC收集器对Heap的划分:

G1对Heap的划分:

heap被划分为一个个相等的不连续的内存区域(regions),每个region都有一个分代的角色:eden、survivor、old(old还有一种细分 humongous,用来存放大小超过 region 50%以上的巨型对象)。

但是对每个角色的数量并没有强制的限定,也就是说对每种分代内存的大小,可以动态变化(默认年轻代占整个heap的5%)。

G1最大的特点就是高效的执行回收,优先去执行那些大量对象可回收的区域(region)。

另外,G1使用了gc停顿可预测的模型,来满足用户设定的gc停顿时间,根据用户设定的目标时间,g1会自动的选择哪些region要清楚,一次清除多少个region。

G1从多个region中复制存活的对象,然后集中放入一个region中,同时整理、清除内存(copying收集算法)。

注意对比之前的垃圾收集器(主要是CMS):
对比使用mark-sweep的CMS,g1使用的copying算法不会造成内存碎片
对比ParallelScavenge(基于copying )、ParallelOld收集器(基于mark-compact-sweep),Parallel
会对整个区域做整理导致gc Pause会比较长,而g1只是特定的整理几个region。

值得注意:g1不是一个实时的收集器,与parallelScavenge一样,对gc 停顿时间的设置并不绝对生效,只是g1有较高的几率保证不超过设定gc停顿时间。与之前的gc收集器对比,g1会根据用户设定的gc停顿时间,智能评估一下哪几个region需要被回收可以满足用户设定。

G1内存的分配

1.TLAB(TLAB占用年轻代内存). 默认使用TLAB加速内存分配,之前文章已经讲过,不赘述。
2.Eden.如果TLAB不够用,则在Eden中分配内存生成对象。
3.Humongous.如果对象需要的内存超过一个region的50%以上,会忽略前两个步骤直接在老年代的humongous中分配(连续的Region)。

何时使用G1(-XX:+UseG1GC)

1.大内存中为了达到低gc延迟.
比如:heap size >=6G,gc pause <=0.5s
2.FullGC时间太长,或者太频繁。

调优参数:
-XX:MaxGCPauseMillis=200
用户设定的最大gc 停顿时间,默认是200ms.
-XX:InitiatingHeapOccupancyPercent=45
默认是45,也就是heap中45%的容量被使用,则会触发concurrent gc。

G1垃圾回收步骤详解

G1提供了两种GC模式,Young GC和Mixed GC,两种都是Stop The World(STW)的

G1 Young GC(STW)

1.当eden数据满了,则触发g1 YGC
2.并行的执行:
YGC 将 eden region 中存活的对象拷贝到survivor,或者直接晋升到Old Region中;将Survivor Regin中存活的对象拷贝到新的Survivor或者晋升old region。
3.计算下一次YGC eden、Survivor的尺寸

G1 Mix GC

在G1 GC中,它主要是为Mixed GC提供标记服务的,并不是一次GC过程的一个必须环节。global concurrent marking的执行过程分为五个步骤:

初始标记(initial mark,STW)
在此阶段,G1 GC 对根进行标记。该阶段与常规的 (STW) 年轻代垃圾回收密切相关。

根区域扫描(root region scan)
G1 GC 在初始标记的存活区扫描对老年代的引用,并标记被引用的对象。该阶段与应用程序(非 STW)同时运行,并且只有完成该阶段后,才能开始下一次 STW 年轻代垃圾回收。

并发标记(Concurrent Marking)
G1 GC 在整个堆中查找可访问的(存活的)对象。该阶段与应用程序同时运行,可以被 STW 年轻代垃圾回收中断

最终标记(Remark,STW)
该阶段是 STW 回收,帮助完成标记周期。G1 GC 清空 SATB 缓冲区,跟踪未被访问的存活对象,并执行引用处理。

清除垃圾(Cleanup,STW)
在这个最后阶段,G1 GC 执行统计和 RSet 净化的 STW 操作。在统计期间,G1 GC 会识别完全空闲的区域和可供进行混合垃圾回收的区域。清理阶段在将空白区域重置并返回到空闲列表时为部分并发。

g1 对老年代回收-总结:

1.并发标记阶段(Concurrent Marking Phase):
在不产生stop-the-world,与程序进程并发的情况下,活跃度(可达性分析)被分析出来。
活跃度越低,代表回收的效率越高,越值得优先回收。
2.复制、清理阶段(Copying/Cleanup Phase)
年轻代、老年代在这个阶段同时被回收掉。老年代被回收的region,是根据这个region的存活度来选择的。

更多详细信息请点击

深入理解JVM 一GC(下) G1 Garbage Collector相关推荐

  1. 深入理解JVM(2)——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  2. 深入理解JVM——虚拟机GC

    对象是否存活 Java的GC基于可达性分析算法(Python用引用计数法),通过可达性分析来判定对象是否存活.这个算法的基本思想是通过一系列"GC Roots"的对象作为起始点,从 ...

  3. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  4. 深入理解JVM垃圾收集机制,下次面试你准备好了吗

    程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收.垃圾回收主要是针对 Java 堆和方法区进行. 判断一个对 ...

  5. 面试篇之JVM(GC 可达性分析 回收算法 卡表 G1)

    面试篇之JVM 面试篇之JVM GC 对象存活判断 分代回收理论 常见回收算法 HotSpot实现细节 记忆集与卡表 读写屏障 回收器 并发标记 G1 面试篇之JVM GC 美团 1.JVM怎么判断一 ...

  6. Java生产环境下性能监控与调优详解 第7章 JVM层GC调优

    第7章 JVM层GC调优 7-1 JVM的内存结构 7-2 常见的垃圾回收算法 7-3 垃圾收集器-1 7-4 垃圾收集器-2 7-5 GC日志格式详解 7-6 可视化工具分析GC日志 7-7 Par ...

  7. 双/三色标记法的垃圾回收(GC)原理解析和缺陷解决方案(Go,Lua以及jvm的CMS和G1垃圾回收器中使用的回收算法)

    标记-清除算法 go和lua虚拟机以及jvm的CMS和G1垃圾回收器的回收算法的思想均来自于标记-清除算法(Mark-Sweep),它们的gc有重要的两部分: 1.从根节点遍历所有对象,如果可达到,则 ...

  8. jvm对象从新生代到老年代_深入理解jvm内存模型以及gc原理

    整体架构 Jvm = 类加载器 + 执行引擎 + 运行时数据区域 类加载器 ● 作用 类加载器是将编译好的class文件加载到内存中,并进行验证.初始化等步骤,形成能被jvm直接使用的类型. ● 加载 ...

  9. JVM、GC看这一篇就够了!

    Class类加载 - 加载Loading 通过全限定类名,把一个类从二进制的Class文件加载到内存当中 - 类加载器 Bootstrap:启动类加载器.加载lib/rt.jar charset.ja ...

最新文章

  1. 盖茨透露自己曾犯下4000亿美元的错:给了安卓机会
  2. 酷狗音乐、艺龙旅行等42款APP被曝违规收集用户信息
  3. QT编译错误:invalid application of 'sizeof' to incomplete type 'Qt3DRender::QPickEvent'
  4. java for mat,在Java绑定中通过OpenCV Mat进行循环
  5. C#WPF制作仿QQ截图工具
  6. windows服务器虚拟机 全屏,win7虚拟机的安装|vmware中win7虚拟机怎么设置全屏显示...
  7. 一线明星纷纷失业,数据告诉你今年的演员有多难
  8. MTK平台创建Vendor方法(最大化复用代码)
  9. 计算机二级ms试题讲解,计算机二级MSOffice考试真题与答案解析(全套)
  10. 28个在线游戏编程学习网站
  11. 在Oracle中,如何得到真实的执行计划?
  12. 【LeeCode】赛题02:Python解答大衍数列题目
  13. 全能型终端神器——MobaXterm安装教程
  14. 《仓鼠球online》80%策划案
  15. Cris 带你快速入门 Flink
  16. 软考中级系统集成项目管理工程师自学好不好过?
  17. dayjs 常用方法
  18. Zephyr应用笔记:mcuboot引导zephyr镜像
  19. Kubernetes 1.22.9搭建 和 部署dashboard可视化UI
  20. unity游戏开发入门-声音控制游戏

热门文章

  1. QML类型——Row
  2. 开源CMSIS-DAP,资料合集
  3. RestTemplate POST请求发送文件
  4. c语言字母和空格占的字节数,C语言之计算字符串最后一个单词的长度,单词以空格隔开...
  5. 500元左右的耳机什么好?四款平价好用蓝牙耳机推荐
  6. 【简单搜索02】生日蛋糕
  7. 美通社日历 | 会展及重要事件信息、企业财报发布,节假日备忘(4月19日—4月25日)...
  8. 一个免费测网站速度的站
  9. 【源码】MATLAB绘制各类箭头标志的函数arrow
  10. 趣学算法系列-分支限界法