老大难的GC原理及调优,这全说清楚了
2019/9/26 13:34:22
【51CTO.com原创稿件】本文介绍 GC 基础原理和理论,GC 调优方法思路和方法,基于 Hotspot jdk1.8,学习之后你将了解如何对生产系统出现的 GC 问题进行排查解决。
内容主要如下:
GC 基础原理,涉及调优目标,GC 事件分类、JVM 内存分配策略、GC 日志分析等。 CMS 原理及调优。 G1 原理及调优。 GC 问题排查和解决思路。
GC 基础原理
GC 调优目标
大多数情况下对 Java 程序进行 GC 调优,主要关注两个目标:
响应速度(Responsiveness):响应速度指程序或系统对一个请求的响应有多迅速。
比如,用户订单查询响应时间,对响应速度要求很高的系统,较大的停顿时间是不可接受的。调优的重点是在短的时间内快速响应。
吞吐量(Throughput):吞吐量关注在一个特定时间段内应用系统的最大工作量。
例如每小时批处理系统能完成的任务数量,在吞吐量方面优化的系统,较长的 GC 停顿时间也是可以接受的,因为高吞吐量应用更关心的是如何尽可能快地完成整个任务,不考虑快速响应用户请求。
GC 调优中,GC 导致的应用暂停时间影响系统响应速度,GC 处理线程的 CPU 使用率影响系统吞吐量。
GC 分代收集算法
现代的垃圾收集器基本都是采用分代收集算法,其主要思想: 将 Java 的堆内存逻辑上分成两块:新生代、老年代,针对不同存活周期、不同大小的对象采取不同的垃圾回收策略。
新生代(Young Generation)
新生代又叫年轻代,大多数对象在新生代中被创建,很多对象的生命周期很短。
每次新生代的垃圾回收(又称 Young GC、Minor GC、YGC)后只有少量对象存活,所以使用复制算法,只需少量的复制操作成本就可以完成回收。
新生代内又分三个区:一个 Eden 区,两个 Survivor 区(S0、S1,又称From Survivor、To Survivor),大部分对象在 Eden 区中生成。
当 Eden 区满时,还存活的对象将被复制到两个 Survivor 区(中的一个);当这个 Survivor 区满时,此区的存活且不满足晋升到老年代条件的对象将被复制到另外一个 Survivor 区。
对象每经历一次复制,年龄加 1,达到晋升年龄阈值后,转移到老年代。
老年代(Old Generation)
在新生代中经历了 N 次垃圾回收后仍然存活的对象,就会被放到老年代,该区域中对象存活率高。老年代的垃圾回收通常使用“标记-整理”算法。
GC 事件分类
根据垃圾收集回收的区域不同,垃圾收集主要分为:
Young GC Old GC Full GC Mixed GC
①Young GC
新生代内存的垃圾收集事件称为 Young GC(又称 Minor GC),当 JVM 无法为新对象分配在新生代内存空间时总会触发 Young GC。
比如 Eden 区占满时,新对象分配频率越高,Young GC 的频率就越高。
Young GC 每次都会引起全线停顿(Stop-The-World),暂停所有的应用线程,停顿时间相对老年代 GC 造成的停顿,几乎可以忽略不计。
②Old GC 、Full GC、Mixed GC
Old GC:只清理老年代空间的 GC 事件,只有 CMS 的并发收集是这个模式。
Full GC:清理整个堆的 GC 事件,包括新生代、老年代、元空间等 。
Mixed GC:清理整个新生代以及部分老年代的 GC,只有 G1 有这个模式。
GC 日志分析
GC 日志是一个很重要的工具,它准确记录了每一次的 GC 的执行时间和执行结果,通过分析 GC 日志可以调优堆设置和 GC 设置,或者改进应用程序的对象分配模式。
开启的 JVM 启动参数如下:
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
常见的 Young GC、Full GC 日志含义如下:
免费的 GC 日志图形分析工具推荐下面 2 个:
GCViewer,下载 jar 包直接运行 。 g
下一页
返回列表
返回首页
©2025 人工智能世界_专注人工智能领域,汇集人工智能技术资料 电脑版
Powered by iwms