JVM Garbage Collection Performance Tuning--转载

本文总结了JVM性能调整的关键因素,包括堆内存优化、GC调整策略及使用Java选项观察GC执行情况。提供了调整堆内存、永久内存、栈内存的方法,并详细介绍了JVM域的大小控制、垃圾收集器的选择与优化。此外,阐述了如何通过获取GC信息来进行调整,以及Pdm系统JVM调整的具体参数设置。最后,提出了通过调整服务器和客户机JVM配置来改善性能的建议。

文章部分内容转载自:布衣寒舍 http://blog.buyihanshe.com/tag/garbage-collection 

GC的性能调整实在是一个很高深的问题,不仅需要对GC技术广度的了解,更需要深度的理解。我本人也仅仅实践过屈指可数的几次,如果要我来说一些指导性的方案的话,也只怕是误人子弟。作此文章,权当是对自己所了解到的GC性能调整的总结,一方面做备忘之用,一方面作为需要之人的参考。

首先要说的是大部分情况下并不需要去做GC调整,除非出现内存溢出导致应用程序崩溃,或者应用程序由于GC暂停时间太长导致不好的用户体验,或者有其他的性能要求。

要进行性能调整,不妨先了解一下几个衡量GC性能的标准:

  • Throughput:吞吐量,非GC时间(近似于应用程序执行时间)占总时间的比例,吞吐量越高说明花费在GC上的时间越少,系统的使用的效率越高;
  • Garbage collection overahead:GC开销,GC时间占总时间比例,和吞吐量互补;
  • Pause time:暂停时间,在GC时应用程序暂停执行的时间;
  • Frequency of collection:GC频率;
  • Footprint:这个概念我还没完全理解,官方说是“a measure of size, such as heap size.” 我的理解是,GC时所要遍历的内存空间的大小。footprint越小一定程度上说明GC性能越高;
  • Promptness:灵敏度,表示从对象成为垃圾到该对象占用的内存被释放之间的时间,灵敏度越高(时间间隔越小)说明垃圾能够尽早的被收集,但同时也可能GC频率越高,需要权衡考虑。

满足一定的标准是我们做GC调整的最终目标,可以看出前3个测量标准是一致的,都属于GC暂停时间一类,这也是大部分GC调整所关心的测量标准。

为了能够观察到GC的执行情况,可以使用下面Java options

  • -Xloggc:log/gc.log 打印GC信息到指定文件
  • -XX:+PrintGCDetails 打印更详细的GC信息
  • -XX:+PrintGCTimeStamps 打印GC时间戳,相对于应用程序启动的时间。

 


堆内存优化:

调整JVM启动参数-Xms  -Xmx   -XX:newSize -XX:MaxNewSize,如调整初始堆内存和最大对内存 -Xms256M -Xmx512M。 或者调整初始New Generation的初始内存和最大内存 -XX:newSize=128M -XX:MaxNewSize=128M。

永久区内存优化:

调整PermSize参数   如  -XX:PermSize=256M -XX:MaxPermSize=512M。

栈内存优化:

调整每个线程的栈内存容量  如  -Xss2048K
最终,一个运行中的JVM所占的内存= 堆内存  +  永久区内存  +  所有线程所占的栈内存总和 。

 

 


============================================================

JVM 优化:

 下面介绍如何控制这些域的大小。可使用-Xms和-Xmx 控制整个堆的原始大小或最大值。

    把初始大小设置为128M:
    java –Xms128m
    –Xmx256m为控制新域的大小,可使用-XX:NewRatio设置新域在堆中所占的比例。

    把整个堆设置成128m,新域比率设置成3,即新域与旧域比例为1:3,新域为堆的1/4或32M:
    java –Xms128m –Xmx128m–XX:NewRatio =3可使用-XX:NewSize和-XX:MaxNewsize设置新域的初始值和最大值。
 
    把新域的初始值和最大值设置成64m:
    java –Xms256m –Xmx256m –Xmn64m

    永久域默认大小为4m.运行程序时,jvm会调整永久域的大小以满足需要。每次调整时,jvm会对堆进行一次完全的垃圾收集。
    使用-XX:MaxPerSize标志来增加永久域搭大小。在WebLogic Server应用程序加载较多类时,经常需要增加永久域的最大值。
 当jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小。为了避免调整,可使用-XX:PerSize标志设置初始值。
    下面把永久域初始值设置成32m,最大值设置成64m.
    java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m

    默认状态下,HotSpot在新域中使用复制收集器。该域一般分为三个部分。
 第一部分为Eden,用于生成新的对象。另两部分称为救助空间,当Eden充满时,收集器停止应用程序,把所有可到达对象复制到当前的from救助空间,一旦当前的from救助空间充满,
 收集器则把可到达对象复制到当前的to救助空间。From和to救助空间互换角色。维持活动的对象将在救助空间不断复制,直到它们获得使用期并转入旧域。
 使用-XX:SurvivorRatio可控制新域子空间的大小。

    同NewRation一样,SurvivorRation规定某救助域与Eden空间的比值。比如,以下命令把新域设置成64m,Eden占32m,每个救助域各占16m:
    java -Xms256m -Xmx256m -Xmn64m -XX:SurvivorRation =2
    如前所述,默认状态下HotSpot对新域使用复制收集器,对旧域使用标记-清除-压缩收集器。
 在新域中使用复制收集器有很多意义,因为应用程序生成的大部分对象是短寿命的。
 理想状态下,所有过渡对象在移出Eden空间时将被收集。如果能够这样的话,并且移出Eden空间的对象是长寿命的,那么理论上可以立即把它们移进旧域,避免在救助空间反复复制。
 但是,应用程序不能适合这种理想状态,因为它们有一小部分中长寿命的对象。最好是保持这些中长寿命的对象并放在新域中,因为复制小部分的对象总比压缩旧域廉价。
 为控制新域中对象的复制,可用-XX:TargetSurvivorRatio控制救助空间的比例(该值是设置救助空间的使用比例。如救助空间位1M,该值50表示可用500K)。
 该值是一个百分比,默认值是50.当较大的堆栈使用较低的sruvivorratio时,应增加该值到80至90,以更好利用救助空间。用-XX:maxtenuring threshold可控制上限。

 为放置所有的复制全部发生以及希望对象从eden扩展到旧域,可以把MaxTenuring Threshold设置成0.设置完成后,实际上就不再使用救助空间了,因此应把SurvivorRatio设成最大值以最大化Eden空间,设置如下:
    java … -XX:MaxTenuringThreshold=0 –XX:SurvivorRatio=50000 …

 

    1、分代复制收集器
    它与默认的分代收集器工作策略类似。对象在新域中分配,即JRockit文档中的nursery.这种收集器最适合单cpu机上小型堆操作。
    2、单空间并发收集器
    该收集器使用完整堆,并与背景线程共同工作。尽管这种收集器可以消除中断,但是收集器需花费较长的时间寻找死对象,而且处理应用程序时收集器经常运行。
 如果处理器不能应付应用程序产生的垃圾,它会中断应用程序并关闭收集。
    分代并发收集器 这种收集器在护理域使用排它复制收集器,在旧域中则使用并发收集器。
 由于它比单空间共同发生收集器中断频繁,因此它需要较少的内存,应用程序的运行效率也较高,注意,过小的护理域可以导致大量的临时对象被扩展到旧域中。
 这会造成收集器超负荷运作,甚至采用排它性工作方式完成收集。
    3、并行收集器
    该收集器也停止其他进程的工作,但使用多线程以加速收集进程。尽管它比其他的收集器易于引起长时间的中断,但一般能更好的利用内存,程序效率也较高。
    默认状态下,JRockit使用分代并发收集器。要改变收集器,可使用-Xgc:,对应四个收集器分别为gencopy,singlecon,gencon以及parallel.可使用-Xms和-Xmx设置堆的初始大小和最大值。
 要设置护理域,则使用-Xns:java –jrockit –Xms512m –Xmx512m –Xgc:gencon –Xns128m…
 尽管JRockit支持-verbose:gc开关,但它输出的信息会因收集器的不同而异。JRockit还支持memory、load和codegen的输出。
    注意 :如果 使用JRockit JVM的话还可以使用WLS自带的console(C:\bea\jrockit81sp1_141_03\bin下)来监控一些数据,
 如cpu,memery等。要想能构监控必须在启动服务时startWeblogic.cmd中加入-Xmanagement参数。

    4、如何从JVM中获取信息来进行调整
    -verbose.gc开关可显示gc的操作内容。打开它,可以显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等。
 打开-xx:+ printgcdetails开关,可以详细了解gc中的变化。
 打开-XX: + PrintGCTimeStamps开关,可以了解这些垃圾收集发生的时间,自jvm启动以后以秒计量。
 最后,通过-xx: + PrintHeapAtGC开关了解堆的更详细的信息。
 为了了解新域的情况,可以通过-XX:=PrintTenuringDistribution开关了解获得使用期的对象权。

    6.Pdm系统JVM调整
    6.1.服务器:前提内存1G 单CPU
    可通过如下参数进行调整:-server 启用服务器模式(如果CPU多,服务器机建议使用此项)
    -Xms,-Xmx一般设为同样大小。 800m
    -Xmn 是将NewSize与MaxNewSize设为一致。320m
    -XX:PerSize 64m
    -XX:NewSize 320m 此值设大可调大新对象区,减少Full GC次数
    -XX:MaxNewSize 320m
    -XX:NewRato NewSize设了可不设。4
    -XX: SurvivorRatio 4
    -XX:userParNewGC 可用来设置并行收集
    -XX:ParallelGCThreads 可用来增加并行度 4
    -XXUseParallelGC 设置后可以使用并行清除收集器
    -XX:UseAdaptiveSizePolicy 与上面一个联合使用效果更好,利用它可以自动优化新域大小以及救助空间比值

    6.2.客户机:通过在JNLP文件中设置参数来调整客户端JVM
    JNLP中参数:initial-heap-size和max-heap-size
    这可以在framework的RequestManager中生成JNLP文件时加入上述参数,但是这些值是要求根据客户机的硬件状态变化的(如客户机的内存大小等)。
 建议这两个参数值设为客户机可用内存的60%(有待测试)。为了在动态生成JNLP时以上两个参数值能够随客户机不同而不同,可靠虑获得客户机系统信息并将这些嵌到首页index.jsp中作为连接请求的参数。
    在设置了上述参数后可以通过Visualgc 来观察垃圾回收的一些参数状态,再做相应的调整来改善性能。一般的标准是减少fullgc的次数,最好硬件支持使用并行垃圾回收(要求多CPU)。

### JVM Performance Tuning Best Practices JVM performance tuning is a critical aspect of ensuring that Java applications run efficiently and effectively. Best practices for JVM tuning include understanding the application's behavior, selecting the appropriate garbage collection (GC) strategy, and monitoring the application's performance over time. One of the foundational steps in JVM tuning is to determine the most suitable GC policy through proper performance and load testing. A comprehensive monitoring strategy should also be implemented in the production environment to keep track of the overall JVM performance and identify future areas for improvement. For example, the Serial Collector can be specified using the `-XX:+UseSerialGC` option, which is suitable for single-threaded environments[^2]. ### Tools for JVM Performance Tuning Several tools are available for monitoring and optimizing the performance of Java applications. One such tool is `jvisualvm.exe`, which is part of the JDK. This tool can monitor both local and remote applications, and it is particularly useful for diagnosing memory issues, such as PermGen space problems. By observing the PermGen usage over time, developers can determine if the issue is due to a large number of class loads or other factors. For instance, if monitoring reveals that the PermGen usage stabilizes around 145MB, this information can be used to set appropriate JVM parameters, thereby resolving memory overflow issues[^3]. ### Best Practices for Garbage Collection Tuning Garbage collection tuning is a key component of JVM performance optimization. The choice of GC algorithm can significantly impact application performance. The Serial Collector, for example, is designed for single-threaded environments and is typically used for small applications with limited memory requirements. On the other hand, more complex applications may benefit from using the Parallel Collector or the CMS (Concurrent Mark Sweep) Collector, which are designed for multi-threaded environments and can handle larger heaps more efficiently[^2]. When tuning garbage collection, it is essential to consider the specific requirements of the application. For applications that require low pause times, the G1 (Garbage-First) Collector might be the best choice. G1 is designed to provide high throughput while maintaining low pause times, making it suitable for applications with large heaps and strict latency requirements. ### Monitoring and Analysis Monitoring the application's performance is crucial for identifying potential bottlenecks and areas for improvement. Tools like `jvisualvm` provide detailed insights into the application's memory usage, thread activity, and garbage collection behavior. By analyzing these metrics, developers can make informed decisions about how to optimize the application's performance. For example, if the monitoring tool indicates that the application is experiencing frequent full GCs, this could be a sign that the heap size is too small or that there are memory leaks in the application. In such cases, increasing the heap size or identifying and fixing memory leaks can lead to significant performance improvements[^3]. ### Code Example: JVM Options for Garbage Collection Here is an example of how to configure the JVM to use the G1 Garbage Collector: ```java java -XX:+UseG1GC -Xms4g -Xmx4g -jar myapplication.jar ``` In this example, the `-XX:+UseG1GC` option enables the G1 Garbage Collector, while `-Xms4g` and `-Xmx4g` set the initial and maximum heap sizes to 4 gigabytes, respectively. Adjusting these parameters based on the application's specific needs can help achieve optimal performance. ### Conclusion JVM performance tuning is a multifaceted process that involves understanding the application's behavior, selecting the appropriate garbage collection strategy, and continuously monitoring the application's performance. By following best practices and utilizing the right tools, developers can ensure that their Java applications run efficiently and effectively, providing a smooth and responsive user experience.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值