将JVM垃圾回收的日志记录下来,对于分析垃圾回收的运行状态,进而调整内存分配(年轻代,老年代,永久代的内存分配)等是很有意义的。JVM与垃圾回收日志相关的参数包括:
- -XX:+PrintGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
- -XX:+PrintGCDateStamps
- -Xloggc
-XX:+PrintGC
通过这个参数可以简单的打印GC的信息,包括当前JVM总的堆内存容量,GC开始运行时JVM已经使用的堆容量,GC垃圾回收后JVM使用的堆容量以及GC运行的时间。
简单GC日志会记录两行,分别表示年轻代垃圾回收的状况以及全垃圾回收的状况
比如:
[GC 246656K->243120K(376320K), 0,0929090 secs] [Full GC 243120K->241951K(629760K), 1,5589690 secs]
246656k表示GC运行前,年轻代使用的内存,243120K表示GC后年轻代使用的内存。376320K表示分配给年轻代的内存容量,耗时0.092秒
简单GC日志的不足
1.当前GC采用的是什么GC算法
2.无法得知,在年轻代GC时,有多少对象从年轻代进入了老年代
-XX:+PrintGCDetails
年轻代的垃圾回收日志
[GC
[PSYoungGen: 142816K->10752K(142848K)] 246648K->243136K(375296K),
0,0935090 secs
]
[Times: user=0,55 sys=0,10, real=0,09 secs]
年轻带GC日志说明:
1. 年轻代垃圾回收使用了吞吐量垃圾回收(如何看出来的?)
2. 年轻代垃圾回收使得JVM堆空间从246648K下降到243136K,整个JVM的堆空间为375296K
3. GC耗时0.0935秒
4. GC完成后,年轻代堆空间从142816K下降到10752K。因为JVM为年轻代分配的堆空间总量是142848K,而年轻代已经使用了142816K,因此只剩下32K的容量。这就是说,GC被触发的原因是年轻代堆空间几乎用尽
5.JVM堆空间从246648K下降到243136K,只有2312K空间被回收,所以,大多数的原来处于年轻代的对象并没有被清除,只是移动到了老年代(也就是说,老年代在这轮GC中,它咋用的堆内存极有可能增大)
6.Times部分详细记录了GG的耗时时间,实际时间是0.09秒,但是用户和系统占用的时间之和是0.55+0.10=0.65秒,元超过0.09秒,这是因为系统采用的是多线程GC的方式,所有县城的总运行时间是0.65秒(这个结果是8个线程进行GC)
全垃圾回收日志
[Full GC
[PSYoungGen: 10752K->9707K(142848K)]
[ParOldGen: 232384K->232244K(485888K)] 243136K->241951K(628736K)
[PSPermGen: 3162K->3161K(21504K)],
1,5265450 secs
]
[Times: user=10,96 sys=0,06, real=1,53 secs]
1. 全垃圾回收日志详细记录了年轻代,老年代和永久代的内存空间变化情况
2. 年轻代从10752K下降到9707K,总的堆内存分配是142848K
3. 老年代从232384K下降到232244K,总的对内存分配是485888K
4. 永久代从3162K下降到3161K,总的分配是21504K
5. 整个堆内存从243136下降到241951K,总的分配是628736K
6.注意:
JVM占用的堆空间241951K = 年轻代的占用空间9707K + 老年代的占用空间232244K;并且,总的容量628736K = 年轻代142848K + 老年代485888K。
这就是说,JVM堆空间是由年轻代和老年代计算出来的,而永久代不占用堆空间?那么永久代占用的空间是哪?
7.从上面的日志可以看到,年轻代,老年代和永久代都没有显著的内存收回,那么是谁触发了GC操作?GC一方面可以由应用本身显式的通过调用System.runFinalization()发起GC,
此时日志的行开头变成Full GC(System),而不是这里的Full GC。另一方面也跟GC算法有关,比如,吞吐量GC算法不要求某代的内存快用光了才发起GC,它也有可能同时采取了某种定时GC的功能。
-XX:+PrintGCTimeStamps
在日志的每一行开头显示一个秒数,这个秒数等于打印此行日志时间减去JVM启动时间
-XX:+PrintGCDateStamps
显示GC执行的绝对时间,这类似于普通日志都要记录这条日志打印的时间点以知道运行到此时的时间。
例如:
2014-01-03T12:08:38.102-0100: [GC 66048K->53077K(251392K), 0,0959470 secs] 2014-01-03T12:08:38.239-0100: [GC 119125K->114661K(317440K), 0,1421720 secs] 2014-01-03T12:08:38.513-0100: [GC 246757K->243133K(375296K), 0,2761000 secs]
-Xloggc
记录gc垃圾回收的日志记录位置,例如:-Xloggc:/home/tom/logs/gc.log
实例
本文参考https://blog.codecentric.de/en/2014/01/useful-jvm-flags-part-8-gc-logging/
相关推荐
JVM内存模型与垃圾回收是Java性能优化的关键部分。JVM(Java Virtual Machine)内存模型分为多个区域,包括新生代(New Generation)、老年代(Old Generation)和永久代(Permanent Generation)。新生代又细分为...
Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收(Garbage Collection,简称GC)。GC机制负责自动管理Java内存,避免程序员手动处理内存分配和释放,从而减少内存泄漏和程序崩溃的风险。...
根据提供的文件内容,下面是对JVM优化中垃圾回收(GC)相关知识点的详细说明: ### 1. 垃圾回收算法 #### 1.1 引用计数法 - **算法原理**:对象被引用时,引用计数器加1;当引用计数器为0时,对象被认为是不再使用...
本文将详细解析JVM参数调优、垃圾回收(GC)算法及其原理,以帮助优化系统性能。 首先,对于JVM参数调优,有以下八条重要的建议: 1. 选择64位操作系统,尽管64位JDK在Linux上运行可能稍慢,但它能支持更大的内存...
这个问题的根源在于 JVM 的垃圾回收机制(Garbage Collection,GC),它会在 JVM 运行时周期性地进行垃圾回收,以释放内存空间。但是,如果 GC 过程中出现问题,例如 GC 次数过高、GC 时间过长等情况,都可能会导致 ...
5. **GC日志分析**:通过分析JVM产生的GC日志,可以了解垃圾回收的效率和内存使用情况,从而调整参数以优化性能。 6. **内存泄漏检测**:关注长期未被释放的对象,可能暗示存在内存泄漏问题。开发者可以通过工具如...
在JVM的内存模型中,垃圾回收(Garbage Collection, GC)是一项重要的功能,它自动识别并清理不再使用的对象,以释放内存资源。本篇文章将深入探讨JVM中的垃圾回收机制及其各种回收器。 1. **基本概念** - **内存...
《JVM性能调优-JVM内存整理及GC回收》是一份深入探讨Java虚拟机(JVM)优化的重要学习资料,特别适合对JAVA编程有经验的开发者。这份文档详细阐述了JVM性能调优的关键概念,包括JVM内存模型、垃圾回收(Garbage ...
Java虚拟机(JVM)的垃圾回收(Garbage Collection, GC)是Java编程语言中一个重要的特性,它自动管理程序的内存,确保无用的对象被有效地释放,避免内存泄漏。理解JVM垃圾回收机制对于优化Java应用性能至关重要。 ...
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收(Garbage Collection,简称GC)。GC是自动内存管理的重要机制,负责识别并清理不再使用的对象,以释放内存资源。本文将深入探讨JVM的垃圾...
为了监控和优化JVM的垃圾回收,开发者可以使用如VisualVM、JConsole、JMX等工具,通过观察内存分配、垃圾回收日志、GC停顿时间等指标来调整JVM参数,比如设置最大堆大小、年轻代和老年代的比例、GC算法选择、晋升...
本篇文章将详细讲解"JVM调优总结(4)分代垃圾回收"这一主题,旨在帮助Java开发者掌握更加高效、稳定的应用运行策略。 一、分代垃圾回收理论基础 Java的内存管理主要依靠垃圾回收机制,它自动回收不再使用的对象,...
- 分析内存分配和垃圾回收日志,了解应用内存行为。 - 使用VisualVM、JProfiler等工具监控和分析垃圾回收情况。 - 通过调整参数优化内存使用和垃圾回收性能。 7. 应用技巧 - 避免创建大量短生命周期对象,减少...
GC日志是JVM在运行过程中记录的关于垃圾收集活动的详细信息,包括垃圾收集的起始时间、持续时间、收集的代别(新生代、老年代)、回收的内存大小等。这些信息对于理解JVM内存行为至关重要,但原始日志通常包含大量...
Java虚拟机(JVM)的垃圾回收(Garbage Collection, GC)是Java程序性能优化的重要环节。...同时,监控JVM的垃圾回收行为,通过日志和分析工具,可以帮助识别和解决问题,从而实现更高效的JVM内存管理。
本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来提升应用性能。 一、JVM内存结构 JVM内存主要分为以下几个区域: 1. **堆内存(Heap Memory)**:这是Java对象的主要存储场所,分为年轻代和老年代...
垃圾回收(Garbage Collection, GC)是JVM的一项重要功能,它自动管理内存,释放不再使用的对象。理解GC的工作机制,包括垃圾收集的触发条件、GC Roots、不同GC阶段(如 Minor GC、Full GC)以及如何分析GC日志,都...
垃圾回收分析则可以帮助我们理解GC的工作情况,通过监控GC日志,可以定位内存泄漏问题或调整GC参数以优化性能。 总的来说,理解JVM的工作原理和优化技术对于提升Java应用程序的性能至关重要。这包括深入学习内存...
优化JVM的垃圾回收通常涉及选择合适的垃圾回收器、调整堆大小、控制停顿时间以及监控和分析GC日志。通过理解这些概念和参数,开发者能够更好地理解和调整JVM的行为,从而提升应用的性能和稳定性。