前两篇说到IBM JDK和Sun的HotSpot JDK的调优策略,当中一直提到的重要一点是需要根据GC详细日志来调整参数的设置,那么当我们收集到日志后如何分析,如何根据日志的情况来调整参数?这就是本文所要阐述的。
使用IBM的JDK的Windows平台和AIX平台,我们只要在WebSphere管理控制台的java进程属性里勾选“详细垃圾回收”,那么就会在native_stdout.log中生成如下的信息。
这幅图很形象的给出了gc日志的主要关注点:垃圾回收的原因、垃圾回收的间隔、垃圾回收前后的剩余空间、垃圾回收持续的时间……
“nursery”表示这次分配失败(Allocation Failure)发生在新生代(nursery),是第44次(id=44)因为新生代的分配失败而进行垃圾回收了(开启GC日志以来),离上一次发生GC的间隔是12746ms,无法分配的空间大小是8216Byte,而进行垃圾回收前,新生代的可用空间为1776Byte,小于8216Byte,虽然年老区还剩余45%的空间,但是新的内存空间是无法直接在年老区分配的,由此引发了一次清理过程(scavenger)。
GC type表明了这次垃圾回收是一个清理过程,也是第44次scavenger过程,同时恰是第44个gc过程,说明没有发生过诸如<gc type=”global”>的垃圾回收过程。flipped objectcount说明将要把4523143个存活下来的对象被复制到了幸存区(survivor space),而73768个对象则经过多次幸存区的复制,有幸熬出头,被转移到了长存区(tenured space)。我们看到清理的倾斜比率(scavenger tiltratio)为89%,而不是对半开,说明经过多次复制清理,JVM已经意识到每次只有很少的对象能存活下来,于是它自动增大了年轻代中Eden区的大小,以使得为新对象可以腾出更多的内存。
接下来的就比较简单,经过垃圾回收,新生代的空间剩余89%,因为分配失败发生在新生代,进行的是快速的Minor gc,所以长存区的可用空间依然是45%,这次回收的时间为384.469ms。在长存区发生的是Major gc,回收时间一般要长于Minor gc,所以健康的JVM 环境Minor gc:Minor gc=1:10(也不用太在意)。
在垃圾回收准备开始的那一段时间(time exclusiveaccessms),以及回收的过程中,另一个线程发现内存无法分配了,于是也要求一次gc过程,这时候就产生了gc队列(会有<warning details=”exclusive access time includes previous garbage collections” />显示)。一般前一次垃圾回收就会释放出足够这两次分配需要的空间,于是第二次gc过程就终止了,当然要是无法足够分配的话,马上就会再进行一次垃圾回收。不过这种情况下,估计要进行Full GC了。
Full GC的gc type就是global,这是stop the world的最耗费时间的回收方式,所以需要通过尽量调整参数来避免。如果发现不是由AF引起的,而是在开头写着SYS标签,那么就要好好问问开发,有没有使用System.gc()的必要?可以的话使用-Xdisableexplicitgc来禁止(Sun等JDK下为-XX:+DisableExplicitGC)。
以上所说的都是IBM JDK下垃圾回收日志的情况。在Sun和HP的JDK下情况相似,不过需要使用-XX:PrintHeapAtGC:参数来打印GC前后的详细堆栈信息。另外我建议加上-Xloggc:filename或者-Xverbosegclog:file_name(方便用工具分析)输出到特定文件,因为不知为何有时候会输出到native_stderr.log,或者在native_stdout.log中和thread dump夹杂在一起,不方便分析。
{Heap before GC invocations=116:
Heap
def new generation total 157376K, used 139904K [63400000, 6dec0000, 78950000)
eden space 139904K, 100% used [63400000, 6bca0000, 6bca0000)
from space 17472K, 0% used [6bca0000, 6bca0000, 6cdb0000)
to space 17472K, 0% used [6cdb0000, 6cdb0000, 6dec0000)
tenured generation total 349568K, used 79067K [38800000, 4dd60000, 632b0000)
the space 349568K, 22% used [38800000, 3d536ce0, 3d536e00, 4dd60000)
compacting perm gen total 132096K, used 132023K [28800000, 30900000, 38800000)
the space 132096K, 99% used [28800000, 308edf50, 308ee000, 30900000)
[GC 218971K->83116K(506944K), 0.0976948 secs]
Heap after GC invocations=117:
Heap
def new generation total 157376K, used 4049K [63400000, 6dec0000, 78950000)
eden space 139904K, 0% used [63400000, 63400000, 6bca0000)
from space 17472K, 23% used [6cdb0000, 6d1a4628, 6dec0000)
to space 17472K, 0% used [6bca0000, 6bca0000, 6cdb0000)
tenured generation total 349568K, used 79067K [38800000, 4dd60000, 632b0000)
the space 349568K, 22% used [38800000, 3d536ce0, 3d536e00, 4dd60000)
compacting perm gen total 132096K, used 132023K [28800000, 30900000, 38800000)
the space 132096K, 99% used [28800000, 308edf50, 308ee000, 30900000)
}
这是一个在使用HPJDK输出的实例,基本和IBM JDK没啥区别,可以加上-XX:+PrintGCTimeStamps显示每次回收的间隔。
这些“人肉”分析可以让我们清楚JVM运行的情况,但是还是不够直观,所以下次会介绍分析JVM日志的工具,尽情期待。现已完成,欢迎访问
- 大小: 109.5 KB
分享到:
相关推荐
通过学习这本书,开发者不仅可以掌握Java性能优化的核心技术,还能培养出良好的编程习惯,使程序运行得更快、更稳定,为企业的系统性能提供有力保障。同时,对于个人技能提升和职业发展,这本书也具有很高的价值。
Java的自动内存管理,即垃圾收集机制,使得程序员无需手动管理内存,但这也带来了性能优化的挑战。JVM有多种垃圾收集器,如Serial、Parallel、CMS和G1等,它们各有优缺点,适用于不同的场景。垃圾收集的过程主要包括...
在《实战Java虚拟机——JVM故障诊断与性能优化》一书中,作者深入探讨了如何对JVM进行故障排查和性能调优,通过源码分析来帮助读者理解其内部工作原理。下面我们将根据书中的主题,详细阐述相关的知识点。 1. **JVM...
Java性能优化是IT行业中至关重要的一个领域,尤其是在大型企业级应用和互联网服务中,高效的Java代码能够显著提升系统运行效率,降低服务器资源消耗。以下是对这四本经典书籍中的核心知识点的详细介绍: 1. **...
### Java性能优化实战知识点概述 #### 一、理论分析篇 **1.1 性能优化的衡量指标及注意事项** - **衡量指标**: 包括响应时间、吞吐量、资源利用率等。 - **注意事项**: 在进行性能优化时,需确保优化方案不会引入...
总结起来,"apache-skywalking-java-agent-8.9.0"是SkyWalking项目中用于监控JVM服务的重要组件,通过其强大的功能,可以帮助开发者和运维人员深入了解和优化他们的Java应用性能。通过学习和掌握SkyWalking的使用,...
《大话java性能优化》是周明耀先生的一本深入探讨Java性能调优的专业书籍,其主要内容涵盖了Java程序设计中的各种性能优化策略和技术。这本书旨在帮助开发者理解和掌握如何提升Java应用的运行效率,减少资源消耗,...
这时,我们需要对GC日志进行深入分析,以优化程序性能。GCViewer就是这样一款强大的工具,它专门用于可视化分析Java程序的GC日志,包括堆内存、年轻代、老年代和永久代的变化,以及Full GC的情况。 GCViewer是由...
3. **运行与分析**:双击RUN.bat执行文件,GCviewer将读取指定的GC日志文件,并实时展示分析结果。你可以通过界面观察GC行为,调整视图以查看不同维度的数据。 4. **导出报告**:除了实时查看,GCviewer还支持导出...
在Java开发中,JVM(Java虚拟机)的性能优化是一项关键任务,特别是对于大型系统而言,频繁的Full GC(垃圾收集)会导致应用暂停时间过长,影响用户体验。本资料"jvm-full-gc调优-jvm-full-gc.zip"显然是针对如何...
在Java性能优化实战的21讲中,涵盖了Java开发中至关重要的性能调优技术,旨在提升应用程序的效率、稳定性和可扩展性。以下是对这些关键知识点的详细解析: 1. **JVM内存模型**:理解Java虚拟机(JVM)的内存结构是...
GC日志分析工具是用来理解和优化JVM内存管理的重要工具。"jvmgc日志分析工具"专为解析和可视化JVM生成的GC日志而设计,帮助开发者识别内存瓶颈,调整内存设置,以及诊断可能的性能问题。 GC日志是JVM在运行过程中...
GChisto是一个专门设计用于分析Java GC日志的工具,它可以帮助开发者深入了解GC活动,从而优化应用的性能。 **GC日志分析的重要性** Java的垃圾收集器在后台默默地工作,回收不再使用的对象,释放内存。虽然这个...
本文将详细介绍 Java 虚拟机(JVM)中的内存优化技术,以提高 Java 应用程序的性能和可靠性。 1. Java 虚拟机运行时的数据区 在 JVM 中,有多个数据区,包括堆(Heap)、栈(Stack)、方法区(Method Area)和...
1. **性能优化**:通过分析GC日志,可以识别出频繁的垃圾收集事件,这可能是导致应用响应时间变慢或系统暂停时间过长的原因。 2. **内存泄漏检测**:如果GC日志显示内存使用持续增加,而无法被正常回收,可能存在...
这份资料"Java程序性能优化.rar"包含了高清文档和书籍源码,为我们提供了深入学习和实践Java性能优化的机会。 1. **JVM调优** - **垃圾回收(Garbage Collection)**:理解不同的GC算法,如Serial、Parallel、CMS...
在本文中,我们将深入探讨Java性能优化的关键点,帮助你的Java程序达到更快、更稳定的目标。 1. **JVM调优**:Java虚拟机(JVM)是Java程序运行的基础,优化JVM参数可以显著提升性能。例如,调整堆内存大小(-Xms和-...
在Java性能优化的过程中,VisualVM与VisualGC插件的结合使用,能够提供宝贵的洞察力,帮助我们更好地理解和控制应用程序的内存行为。通过深入理解GC的工作原理,开发者可以避免不必要的内存分配,减少垃圾收集的负担...
本资料集锦主要涵盖了Java性能优化的多个方面,包括但不限于代码优化、内存管理、系统设计与优化等关键领域。 一、Java程序性能优化(23条) 1. **避免过度使用反射**:反射在某些场景下很有用,但其开销较大,应...