`

转:Java SE 6 Hotspot [TM] 虚拟机垃圾回收调优 2

    博客分类:
  • JVM
阅读更多
7.10 测量

下面是使用-verbose:gc和-XX:+PrintGCDetails参数时,并发垃圾收集器的输出,一些小细节已经被去掉了。注意,并发垃 圾收集器的输出里掺杂着小回收的输出;典型情况下,很多小回收会发生在并发收集周期之中。其中的CMS-initial-mark表征了一个并发垃圾回收 周期的开始。CMS-concurrent-mark: 标志着并发标记阶段的完成,而CMS-concurrent-sweep则标志着并发清除阶段的完成。之前没有提到过的预清除阶段以CMS- concurrent-preclean为标志。预清除可以和重标记阶段CMS-remark的准备工作同时运行。最后一个阶段是CMS- concurrent-reset,这是下一个并发收集周期的准备工作。

[GC [1 CMS-initial-mark: 13991K(20288K)] 14103K(22400K), 0.0023781 secs][GC [DefNew: 2112K->64K(2112K), 0.0837052 secs] 16103K->15476K(22400K), 0.0838519 secs]...[GC [DefNew: 2077K->63K(2112K), 0.0126205 secs] 17552K->15855K(22400K), 0.0127482 secs][CMS-concurrent-mark: 0.267/0.374 secs][GC [DefNew: 2111K->64K(2112K), 0.0190851 secs] 17903K->16154K(22400K), 0.0191903 secs][CMS-concurrent-preclean: 0.044/0.064 secs][GC [1 CMS-remark: 16090K(20288K)] 17242K(22400K), 0.0210460 secs][GC [DefNew: 2112K->63K(2112K), 0.0716116 secs] 18177K->17382K(22400K), 0.0718204 secs][GC [DefNew: 2111K->63K(2112K), 0.0830392 secs] 19363K->18757K(22400K), 0.0832943 secs]...[GC [DefNew: 2111K->0K(2112K), 0.0035190 secs] 17527K->15479K(22400K), 0.0036052 secs][CMS-concurrent-sweep: 0.291/0.662 secs][GC [DefNew: 2048K->0K(2112K), 0.0013347 secs] 17527K->15479K(27912K), 0.0014231 secs][CMS-concurrent-reset: 0.016/0.016 secs][GC [DefNew: 2048K->1K(2112K), 0.0013936 secs] 17527K->15479K(27912K), 0.0014814 secs]

初始标记停顿在典型情况下比小回收的停顿时间还要小。而如上例所示,并发阶段(并发标记、并发预清除和并发清除)通常会比小回收长很多。不过注意, 应用并没有在这些并发阶段中停顿下来。重标记停顿通常和一个小回收的长度相当。重标记停顿挥手道应用的某些特征(如高对象修改频率可能会增加这个停顿)和 上一次小回收的时间(即,更多的年轻代对象可能会增加这个停顿)的影响。

8. 其他考虑

8.1 永久代尺寸

在大部分应用中,永久代对于垃圾回收性能没有显著的影响。不过,一些应用会动态的生成与加载很多类;比如,一些 JavaServer Pages(JSP)页面的实现。这些应用可能需要很大的永久代去存放一些多余的类。如果这样的话,最大永久代的尺寸可以用命令行参数 -XX:MaxPermSize=<N>来增大。

8.2 Finalization; Weak, Soft and Phantom References

一些应用使用 finalization 和 weak, soft, phantom 引用与垃圾收集器交互。这些特征可以 Java 语言层带来性能影响。一个例子是通过 finalization 来关闭文件描述符,这会导致一个外部资源依赖于垃圾收集器。以来垃圾收集器来管理内存之外的资源是个坏主意。

参考资料章节中的文章深度讨论了一些finalization的常见错误和用来避免这些错误的技术。

8.3 显式垃圾回收

应用程序和垃圾回收器的另一个交互途径是显式调用 System.gc() 进行完整的垃圾回收。这回强制进行一次主回收,即使没有必要(也就是说一次小回收可能就足够了),所以应该避免这种情况。显式垃圾回收对性能的影响可以通 过使用 -XX:+DisableExplicitGC 进行比较来进行测量,这样虚拟机会无视 System.gc() 的。

最常见的显式调用垃圾回收的场景是 RMI 的分布式垃圾回收。使用 RMI 的应用会引用到其他虚拟机中的对象。在这种分布式应用的场景下,本地堆中的垃圾可能不能被回收掉,所以 RMI 会周期性强制进行完整的垃圾回收。这些回收的频率可以使用参数来控制。如

java -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 …

这里指定了垃圾回收每小时运行一次,而不是缺省的每分钟一次。不过,这可能会导致某些对象的清除消耗太长时间。这些参数可以被设置到高达Long.MAX_VALUE来让显式垃圾回收的间隔时间无限长,如果没有合适的DGC上限时间的话。

8.4 Soft References

Soft reference在虚拟机中比在客户集中存活的更长一些。其清除频率可以用命令行参数 -XX:SoftRefLRUPolicyMSPerMB=<N>来控制,这可以指定每兆堆空闲空间的 soft reference 保持存活(一旦它不强可达了)的毫秒数,这意味着每兆堆中的空闲空间中的 soft reference 会(在最后一个强引用被回收之后)存活1秒钟。注意,这是一个近似的值,因为 soft reference 只会在垃圾回收时才会被清除,而垃圾回收并不总在发生。

8.5 Solaris 8 替换 libthread

Solaris 8 操作系统提供了一个替代的线程库,libthread, 它将线程直接绑定成了轻量级进程(LWP)。有些应用能够从中极大获益,并潜在的对所有多线程应用都或多或少的有好处。下面的命令会为 java 启用替换的 libthread(BASH 格式)

LD_PRELOAD=/usr/lib/lwp/libthread.so.1export LD_PRELOADjava ...

这个方法仅对 Solaris 8 适用,因为对 Solaris 9 操作系统来说,这是缺省的,而 Solaris 10 中,这是惟一的线程库。

9. 相关资源

  1. HotSpot VM Frequently Asked Questions (FAQ)
  2. GC output examples 介绍了如何解释不同垃圾收集器的输出。
  3. How to Handle Java Finalization’s Memory-Retention Issues 介绍了一些容易犯的错误和避免他们的方法。
  4. Richard Jones and Rafael Lins, Garbage Collection: Algorithms for Automated Dynamic Memory Management, Wiley and Sons (1996), ISBN 0-471-94148-4

在本网站中,名词“Java Virtual Machine” 和“JVM” 都代表 Java 平台虚拟机。

分享到:
评论

相关推荐

    【译】Java 14 Hotspot 虚拟机垃圾回收调优指南(csdn)————程序.pdf

    Java 14 Hotspot 虚拟机的垃圾回收调优是提升应用程序性能的关键环节。本指南主要涵盖了垃圾收集器的优化目标、策略以及各种实现,旨在帮助开发者更好地理解如何调整 JVM 参数以满足特定的需求。 优化目标与策略...

    Java_GC垃圾回收调优指南

    ### Java GC垃圾回收调优指南 #### 概述 在Java开发过程中,垃圾回收(Garbage Collection, GC)是管理内存资源的关键技术之一。合理的GC配置可以显著提高应用程序的性能和稳定性。本指南旨在帮助开发者深入理解...

    《JVM性能工程:深入OpenJDK和HotSpot Java虚拟机》

    这本书是探索Java虚拟机性能工程的深入指南,专注于OpenJDK和HotSpot JVM,适合希望优化Java应用性能的开发者。

    Troubleshooting Guide for Java SE 6 with HotSpot VM

    2. **性能调优技巧**:提供关于如何优化Java SE 6应用程序性能的建议,包括内存管理、垃圾回收等方面。 3. **错误代码解读**:解释各种错误代码的意义以及它们通常指向的问题根源。 4. **工具介绍**:介绍用于诊断和...

    Java虚拟机规范(Java SE 7)1

    6. **内存模型与并发**:Java内存模型(JMM)定义了线程之间共享变量的访问规则,确保正确同步和内存可见性。它涉及到volatile变量、synchronized关键字、final字段的语义以及线程交互的内存操作。 7. **异常处理**...

    JDK16-hotspot-virtual-machine-garbage-collection-tuning-guide

    Java平台的HotSpot虚拟机垃圾回收调整指南是Java开发人员和系统管理员不可或缺的参考手册。该指南详细介绍了HotSpot虚拟机的垃圾回收机制,包括垃圾回收算法、垃圾回收器的配置和调整、垃圾回收性能优化等方面的知识...

    性能工程师指南:玩转OpenJDK HotSpot垃圾收集器

    ### 性能工程师指南:玩转OpenJDK HotSpot垃圾收集器 #### 一、性能工程概述 在软件开发过程中,性能工程是一个重要的环节,它不仅涵盖了对软件性能的需求定义与测试计划制定,还包括了软件的开发、实施及后续的...

    08-java11-hotspot-guide.pdf

    2. 垃圾回收:HotSpot虚拟机提供了多种垃圾回收算法,包括串行垃圾回收(Serial Garbage Collector)、并行垃圾回收(Parallel Garbage Collector)以及针对低延迟应用的G1垃圾回收器(G1 Garbage Collector)和Z...

    JAVA SE8 虚拟机规范

    6. **并发与多线程**:Java SE8提供了丰富的并发工具类,如ConcurrentHashMap、Fork/Join框架、CountDownLatch、CyclicBarrier等,帮助开发者编写高效、安全的多线程代码。 7. **JIT编译器**:JIT(Just-In-Time)...

    性能工程师指南:玩转OpenJDK HotSpot垃圾收集器.ppt

    性能工程师指南:玩转OpenJDK HotSpot垃圾收集器.ppt性能工程师指南:玩转OpenJDK HotSpot垃圾收集器.ppt性能工程师指南:玩转OpenJDK HotSpot垃圾收集器.ppt性能工程师指南:玩转OpenJDK HotSpot垃圾收集器.ppt性能...

    Java虚拟机规范(Java SE 7 中文版

    8. NIO.2:Java SE 7扩展了非阻塞I/O(New I/O)框架,增加了对异步I/O的支持,以及对文件属性和文件系统操作的增强。 9. 编译器优化:JDK 7的编译器HotSpot进行了优化,可以更好地处理逃逸分析,提高代码运行效率...

    Java虚拟机规范(Java SE 7)中文版

    9. **编译器优化**:Java SE 7的HotSpot虚拟机改进了编译策略,包括更早的即时编译(Tiered Compiling)和更精细的性能分析,提升了代码执行速度。 10. **多线程编程**:Java 7对并发工具进行了增强,如Fork/Join...

    Java垃圾回收机制详解和调优

    Java垃圾回收机制是Java虚拟机(JVM)中至关重要的组成部分,它的主要任务是自动管理内存,回收不再使用的对象以避免内存泄漏。垃圾回收机制在Java中自动化了内存管理,使得程序员无需手动管理内存,降低了编程复杂...

    Java_HotSpot虚拟机的内存管理.pdf

    ### Java HotSpot虚拟机的内存管理 #### 一、引言 Java HotSpot虚拟机作为Sun Microsystems(现已被Oracle收购)开发的一款高性能JVM(Java虚拟机),在内存管理方面有着独特而强大的机制。本文旨在深入探讨Java ...

    Java HotSpot虚拟机的部分参数翻译

    Java HotSpot虚拟机是Oracle公司开发的一款高性能的Java虚拟机,它是Java运行环境的重要组成部分,负责解释和优化Java代码,确保程序的高效运行。本文将深入探讨Java HotSpot虚拟机的部分参数及其作用,帮助开发者更...

    细述 Java垃圾回收机制→Java Garbage Collection Introduction - Android 1

    * HotSpot VM:Java HotSpot虚拟机是Oracle标准版平台的核心组成部分 JVM架构: * 堆内存:运行时用来存储实例对象的数据空间 * 垃圾回收器:运行在堆内存上,负责回收不再被引用的对象 Java堆内存结构: * 年轻...

    性能工程师指南:玩转OpenJDK HotSpot垃圾收集器(83页).pdf

    《性能工程师指南:玩转OpenJDK HotSpot垃圾收集器》是一本专注于Java应用程序性能优化的专业书籍,尤其针对OpenJDK HotSpot虚拟机的垃圾收集器进行了深入探讨。该书共83页,旨在帮助性能工程师理解并优化Java应用的...

    JVM内幕:java虚拟机详解

    ### JVM内幕:java虚拟机详解 #### 一、概述 Java虚拟机(JVM)是运行Java应用程序的核心组件,它提供了一个可移植、安全且高性能的环境。本文将深入探讨JVM的内部架构及其各个组成部分的功能。 #### 二、Java虚拟机...

    java虚拟机各种版本

    2. **企业版(Java EE)**:Java Enterprise Edition增加了对Web应用和企业级服务的支持,如Servlet、JSP、EJB(Enterprise JavaBeans)、JMS(Java Message Service)等。它通常用于构建大型的企业级服务器端应用。...

Global site tag (gtag.js) - Google Analytics