JVM之优化(GC优化基础)
本节主要描述关于垃圾回收器性能的三个指标,三个关于垃圾回收器优化的基本原则,以及优化HotSpot VM的垃圾回收器的信息收集,在这些指标中权衡以及信息的收集是非常重要的。
性能指标
吞吐量:衡量垃圾回收器运行在性能峰值的时候不需要关心垃圾回收器暂停的时间或者需要占用内存的能力。
延迟:衡量垃圾回收器最小化甚至消灭由垃圾回收器引起的暂停时间和应用抖动的能力。
内存占用:衡量为了高效的运行,垃圾回收器需要的内存。
一项指标的提升,往往需要牺牲其他一项或者两项指标。换一句话说,一项指标的妥协通常是为了支持提升其他一项或者两项指标。然而,对于大多数应用来说,很少有3项指标都非常重要,通常,一项或者两项比其他的更重要。
原则
在优化JVM垃圾回收器的时候,有3项基本原则
- Minor GC回收原则:尽量将更多的垃圾在 Minor GC 完成。秉承这个原则可以减少由应用产生的full垃圾回收数量和频率,Full垃圾回收往往需要更长的时间,以致于应用无法达到延迟和吞吐量的需求。
- GC最大内存原则:更多的内存分配给垃圾回收器,也就是说更大的Java堆空间,垃圾回收器和应用在吞吐量和延迟上会表现得更好。
- 2/3 GC优化原则:优化JVM垃圾回收器的3个指标中的2个。
命令行选项和GC日志
从垃圾回收器获取监控信息,是优化JVM的重要操作。收集垃圾回收器信息的最好办法就是收集日志。这个意味着通过HotSpot VM的命令行选项可以收集垃圾回收器的统计信息。开启垃圾回收器日志(即使在生产环境)是很好的主意,其实开启垃圾回收器的开销很小而且可以提供丰富的信息,这些信息和垃圾回收器应用事件或者JVM事件有关系,比如说:一个应用在运行过程中出现了一个比较长的暂停,如果有垃圾回收信息,就可以判断出是垃圾回收器引起的暂停还是应用进行的其他操作引起的暂停。
打印GC日志的命令
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:<filename>
- -XX:+PrintGCTimeStamps 打印出垃圾回收发生的时间是距离HotSpot VM启动时间的秒数。
- -XX:+PrintGCDetails 提供了垃圾回收特有的统计信息而且具体信息依赖于使用的垃圾回收器类型。
- -Xloggc:<filename> 表示垃圾回收器的信息输出到叫<filename>的文件。
使用-XX:+UseParallelOldGC或者-XX:+UseParallelGC选项 + 前面三个选项
45.152: [GC [PSYoungGen: 295648K->32968K(306432K)] 296198K->33518K(1006848K), 0.1083183 secs][Times: user=1.83 sys=0.01, real=0.11 secs]
45.152是表明距离JVM启动到垃圾回收的秒数,GC标签表明是Minor GC或者young代垃圾回收。
[PSYoungGen: 295648K->32968K(306432K)]提供了young代的空间信息,PSYoungGen表示young代的垃圾回收是使用throughput垃圾回收器。其他可能的young代垃圾回收有ParNew(使用CMS垃圾回收器多线程回收young代空间)、DefNew(使用serial垃圾回收器单线程回收young代空间)。
在“->”左边的数字(295648K)表示垃圾回收前young代的空间大小,右边数字(32968K)表示垃圾回收后的young代空间大小。young代被分为eden区域和survivor区域。由于在垃圾回收之后,eden区域是空的,右边的数字其实就是survivor区域的空间。在括号里面的数字(306432K)表示young代的总空间。
296198K->33518K(1006848K)提供了Java堆在垃圾回收前后的使用情况。另外,他提供Java堆的总大小,是young代和old代的和。在->左边的数字(296198K)表示,在垃圾回收前Java堆占用的空间,->右边的数字(33518K)表示垃圾回收后Java堆占用空间。括号里面的数字(1006848K)表示Java堆总共的空间。
通过young代的占用空间和Java堆占用的空间,可以快速的计算出old代占用的空间。比如:Java堆的大小是1006848K,young代的空间大小是306432K,因此可以计算出old代的空间大小是1006848K-306432K=700416K。在垃圾回收之前,296198K-295648K=550K是old代使用了的空间。在垃圾回收后33518K-32968K=550K。在这个例子中,在垃圾回收前后没有对象从young代移动到old代。这是一个重要的观察说明了Minor GC回收原则。如果有对象被移动到old代,然后变成不可读取的,就不是最大量的对象被回收,会违反Minor GC回收原则。
0.1083183 secs表明垃圾回收执行的时间。
[Times: user=1.83 sys=0.01, real=0.11 secs]提供了CPU和占用时间。user表明垃圾回收在用户模式下执行消耗的CPU时间,即:在JVM里面运行的时间,在这个例子中,垃圾回收器在用户模式下消耗1.83秒的CPU时间。sys表示操作系统代表垃圾回收器消耗的时间,在这里例子中,垃圾回收器使用0.01秒的操作系统CPU时间。real表示垃圾回收执行的时间的。这几个数字精确到0.01秒。
-XX:+PrintGCDateStamps
-XX:+PrintGCDateStamps显示垃圾回收发生的年,月,日和时间。这个选项是在Java 6 Update 4引入的。下面的例子是同时使用-XX:+PrintGCDateStamps和-XX:+PrintGCDetails选项的结果:
2012-06-21T09:57:10.518-0500: [GC[PSYoungGen: 295648K->32968K(306432K)]296198K->33518K(1006848K), 0.1083183 secs][Times: user=1.83 sys=0.01, real=0.11 secs]
2012-06-21T09:57:10.518-0500字段是使用了ISO 8601日期和时间戳。格式是YYYY-MM-DDTHH-MM-SS.mmm-TZ,分别的意思是:
YYYY表示4位数的年
MM表示2位数月,如果只有一位数,前面加0
DD表示2位数的天,如果只有一位数,前面加0
T是一个字符用来隔开日期和时间
HH表示2位数小时,如果只有一位数,前面加0
MM表示2位数分钟,如果只有一位数,前面加0
SS表示2位数秒,如果只有一位数,前面加0
mmm表示3位数毫秒,如果不足三位,前面加0或者00
TZ表示格林尼治时间的时区
尽管时区已经包含在输出里面了,但是输出日期和时间不是GMT时间,而是本地化过的时间。
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
当为了低延迟而优化HotSpot VM的时候,下面的两个选项是非常有用的,这两个选项会报告应用由于虚拟机的安全点(Safepoint)操作而阻塞的时间以及应用程序在安全点(Safepoint)执行了多长的时间。
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
安全点(Safepoint)操作会让JVM进入一种所有应用程序的线程都被阻塞以及阻止任何正在执行的本地程序把结果返回给Java代码的状态。当需要进行优化虚拟机内部操作的时候,安全点操作会被执行以使得所有线程都进入阻塞状态避免影响Java堆(垃圾回收是一种安全点操作)。
由于安全点(Safepoint)操作阻塞了所有Java程序的执行,所以知道程序的响应时间延迟是否和安全点操作有关系就显得非常重要了。因此,能够观察程序什么时候被阻塞( 通过设置-XX:+PrintGCApplicationStoppedTime选项)通过应用的日志信息能够帮组你识别出,当应用的响应时间超过预期的时候,是安全点操作引起的还是应用或者操作系统的其他操作引起的。-XX:+PrintSafepointStatistics可以帮助区别垃圾回收的安全点(Safepoint)以及其他的安全点(Safepoint)。
在发现应用的响应时间超过预期的预期的时候,-XX:+PrintGCApplicationConcurrentTime选项可以用来判断程序是否被执行以及执行了多长时间。
下图总结了前面提到的垃圾回收器的选项以及给出了使用它们的合适情况。
相关推荐
了解JVM内存管理和G1 GC的工作原理,对于优化Java应用程序性能、避免内存溢出等问题至关重要。开发者可以通过调整JVM参数,如设置年轻代与老年代的比例、分配的Region数量、暂停时间目标等,来优化G1 GC的行为,从而...
大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G) 〖课程介绍〗: 来自顶尖大厂的架构师级JVM优化与GC调优策略实战课程,是具备有尖端技术的优化课程。在课程内容上几乎不用过多的介绍,单是查阅目录就...
《JVM和GC详解及调优》是一本深入解析Java虚拟机(JVM)和垃圾收集(Garbage Collection,简称GC)的专业书籍,对于Java开发者来说,是进阶提升的必备资料。书中详尽地阐述了JVM的工作原理,以及如何进行有效的性能...
Java虚拟机(JVM)是Java程序运行的基础,它的配置参数和垃圾收集(GC)机制对于优化应用程序性能至关重要。本文将深入探讨JVM参数及其与Java垃圾收集相关的知识。 一、JVM参数详解 JVM参数可以分为三类:启动参数...
《深入理解JVM & G1 GC》这篇文章和相关压缩包文件主要聚焦于Java虚拟机(JVM)的内存管理,特别是垃圾收集器(GC)的优化,特别是G1(Garbage-First)垃圾收集器的深度解析。下面将详细阐述JVM、GC的基本概念,...
理解这些区域的功能及其交互方式是优化的基础。例如,堆内存用于对象分配,栈存储方法调用,方法区存储类信息。 2. **垃圾收集** 垃圾收集是JVM内存管理的重要部分,自动清理不再使用的对象以释放内存。了解不同...
理解JVM的GC对于优化Java应用程序性能至关重要。 首先,我们需要了解JVM内存的几个主要区域:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。GC...
总结来说,理解JVM堆的结构和GC的工作机制对于优化Java应用性能至关重要。调整合适的堆大小和内存分配策略可以有效减少垃圾回收的频率和时间,提高系统响应速度。此外,监控GC日志,分析GC行为,以及使用适当的GC...
文档"深入Java虚拟机(原书第2版).pdf"将为你提供更深入的理论基础,"jvm优化.docx"涵盖了具体的JVM调优技巧,而"tomcat性能调优.docx"则专注于Tomcat的优化实践。通过学习这些资料,你将能够更好地理解和优化你的...
了解并熟练掌握这些GC算法和JVM调优技巧,对于解决性能问题、优化Java应用的运行效率至关重要,同时也是面试中经常被问到的话题。通过实践和理解,开发者可以更好地理解和控制JVM的行为,从而编写出更高效、更稳定的...
《淘宝JVM优化实践》是一份深入探讨阿里巴巴集团核心系统研发部在JVM优化方面的实践经验的文档。这份文档主要涵盖了以下几个关键知识点: 1. **淘宝JVM优化背景**:随着淘宝、天猫等业务的快速发展,其Java应用规模...
JVM提供了多种垃圾收集器,如Serial GC、ParNew GC、Parallel GC、CMS(Concurrent Mark Sweep)GC和G1 GC等。GC的主要目标是达到低延迟和高吞吐量。GC的触发条件通常包括堆内存满、方法区满或系统要求。垃圾回收的...
在Java学习过程中,理解和掌握JVM(Java虚拟机)是十分关键的,因为JVM是Java程序运行的基础,负责Java程序的编译、执行、内存管理和垃圾收集(GC)。本次分享的内容将涵盖Java类的加载过程、类加载机制、内存分配和...
类加载器的主要作用是将编译后的`.class`文件加载到JVM中,使之成为可执行的字节码。这样做的好处在于提高了Java程序的灵活性和安全性,同时也支持动态加载。 **2.2 类加载器的分类** 除了上述提到的三种默认类...
JVM的主要任务包括内存管理、类加载、执行引擎等,其中内存管理是JVM性能优化的关键。 在JVM的内存模型中,主要分为堆内存和栈内存两大部分。堆内存用于存储对象实例,而栈内存则存储方法调用过程中的局部变量、...
《JVM、GC详解及调优》是一份深入解析Java虚拟机(JVM)和垃圾收集(Garbage Collection,简称GC)的详细资料。本文将根据提供的信息,深入阐述JVM的工作原理,GC的机制以及如何进行JVM的性能调优。 首先,JVM是...
Java 应用程序的JVM(Java虚拟机)性能优化是一个关键领域,而垃圾收集(GC)作为内存管理的一部分,其频率对系统性能有直接影响。GC的频率反映了系统的内存使用情况和健康状况。通常,GC分为两种主要类型:Scavenge...
JVM 输出 GC 日志导致 JVM 卡住 JVM 输出 GC 日志导致 JVM 卡住是一个常见的问题,尤其是在高并发和高性能应用中。这个问题的根源在于 JVM 的垃圾回收机制(Garbage Collection,GC),它会在 JVM 运行时周期性地...
理解JVM的体系结构对于优化Java应用的性能至关重要,尤其是垃圾收集(Garbage Collection, GC)的调优。在46页的"PPT"中,我们可以期待涵盖以下几个关键领域: 1. **JVM概述** - JVM的作用:解释字节码、执行Java...