`
longgangbai
  • 浏览: 7325470 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令

阅读更多

全文转载:http://pengjiaheng.iteye.com/blog/548472

作者:和你在一起 [from JavaEye]

 

以下配置主要针对分代垃圾回收算法而言。

堆大小设置

年轻代的设置很关键

JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。

典型设置:

java -Xmx3550m -Xms3550m -Xmn2g –Xss128k

-Xmx3550m: 设置JVM最大可用内存为3550M。

-Xms3550m: 设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmn2g: 设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xss128k: 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为 256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无 限生成,经验值在3000~5000左右。

 

java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-XX:NewRatio=4 :设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:SurvivorRatio=4 :设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

-XX:MaxPermSize=16m: 设置持久代大小为16m。

-XX:MaxTenuringThreshold=0: 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不 经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行 多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

 

回收器选择

JVM给了三种选择:串行收集器、并行收集器、并发收集器 ,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置 进行判断。

吞吐量优先的并行收集器

如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。

典型配置:

java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20

-XX:+UseParallelGC: 选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。

-XX:ParallelGCThreads=20: 配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC

-XX:+UseParallelOldGC: 配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100

-XX:MaxGCPauseMillis=100 :设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。

n java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy

-XX:+UseAdaptiveSizePolicy :设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

 

响应时间优先的并发收集器

如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。

典型配置:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

-XX:+UseConcMarkSweepGC: 设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。

-XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection

-XX:CMSFullGCsBeforeCompaction: 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。

-XX:+UseCMSCompactAtFullCollection: 打开对年老代的压缩。可能会影响性能,但是可以消除碎片

 

辅助信息

JVM提供了大量命令行参数,打印信息,供调试使用。主要有以下一些:

-XX:+PrintGC: 输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]

-XX:+PrintGCDetails: 输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

-XX:+PrintGCTimeStamps -XX:+PrintGC: PrintGCTimeStamps可与上面两个混合使用 
输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]

-XX:+PrintGCApplicationConcurrentTime: 打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用。输出形式:Application time: 0.5291524 seconds

-XX:+PrintGCApplicationStoppedTime: 打印垃圾回收期间程序暂停的时间。可与上面混合使用。输出形式:Total time for which application threads were stopped: 0.0468229 seconds

-XX:PrintHeapAtGC: 打印GC前后的详细堆栈信息。输出形式:

34.702: [GC {Heap before gc invocations=7:

def new generation   total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)

eden space 49152K,  99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)

from space 6144K,  55% used [0x221d0000, 0x22527e10, 0x227d0000)

to   space 6144K,   0% used [0x21bd0000, 0x21bd0000, 0x221d0000)

tenured generation   total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000)

the space 69632K,   3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000)

compacting perm gen  total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)

   the space 8192K,  35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)

ro space 8192K,  66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)

rw space 12288K,  46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)

34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(124928K)Heap after gc invocations=8:

def new generation   total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000)

eden space 49152K,   0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000)

  from space 6144K,  55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000)

  to   space 6144K,   0% used [0x221d0000, 0x221d0000, 0x227d0000)

tenured generation   total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000)

the space 69632K,   4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000)

compacting perm gen  total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)

   the space 8192K,  35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)

   ro space 8192K,  66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)

   rw space 12288K,  46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)

}

, 0.0757599 secs]

-Xloggc:filename: 与上面几个配合使用,把相关日志信息记录到文件以便分析。

 

常见配置汇总

 

堆设置

  -Xms: 初始堆大小

  -Xmx: 最大堆大小

  -XX:NewSize=n: 设置年轻代大小

  -XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

  -XX:SurvivorRatio=n: 年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

  -XX:MaxPermSize=n: 设置持久代大小

收集器设置

  -XX:+UseSerialGC: 设置串行收集器

  -XX:+UseParallelGC: 设置并行收集器

  -XX:+UseParalledlOldGC: 设置并行年老代收集器

  -XX:+UseConcMarkSweepGC: 设置并发收集器

垃圾回收统计信息

  -XX:+PrintGC

  -XX:+PrintGCDetails

  -XX:+PrintGCTimeStamps

  -Xloggc:filename

并行收集器设置

  -XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。

  -XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间

  -XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

并发收集器设置

  -XX:+CMSIncrementalMode: 设置为增量模式。适用于单CPU情况。

  -XX:ParallelGCThreads=n: 设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

 

调优总结

年轻代大小选择

响应时间优先的应用: 尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。 在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。

吞吐量优先的应用: 尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

 

 

年老代大小选择

 

响应时间优先的应用: 年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率 会话持续时间 等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:

  1. 并发垃圾收集信息

  2. 持久代并发收集次数

  3. 传统GC信息

  4. 花在年轻代和年老代回收上的时间比例

减少年轻代和年老代花费的时间,一般会提高应用的效率

 

 

吞吐量优先的应用

一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。

 

 

较小堆引起的碎片问题

因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是, 当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回 收。如果出现“碎片”,可能需要进行如下配置:

    1. -XX:+UseCMSCompactAtFullCollection: 使用并发收集器时,开启对年老代的压缩。

    2. -XX:CMSFullGCsBeforeCompaction=0: 上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩

分享到:
评论

相关推荐

    006-jvm性能调优

    * 垃圾收集(GC):是JVM中自动管理内存的机制,用于回收无用的对象。 * 垃圾收集算法:有串行回收器、并行回收器、并发标记清除回收器等多种算法。 * 垃圾收集统计:可以使用jstat命令来查看垃圾收集情况。 实际...

    jdk1.6_6u45

    3. **垃圾回收**:在JDK 6中,垃圾收集器有所改进,提供了更好的内存管理,降低了应用暂停时间,提升了整体性能。 4. **NIO.2**:引入了新的文件系统API,即Java NIO.2,提供了异步I/O操作,增强了文件操作的灵活性...

    jdk1.7_win32.rar

    6. **更好的垃圾回收**:JDK 7改进了垃圾回收机制,尤其是G1(Garbage-First)垃圾收集器,提升了内存管理的效率。 **安装与环境配置** 压缩包内的“配置环境.txt”文件应该包含了关于如何在Windows 32位系统上...

    jdk7 jdk-7u80-windows-x64 网盘下载

    3. **改进的垃圾回收机制**:G1垃圾收集器的引入,这是一种低延迟的垃圾收集器,特别适合于具有大量内存的应用程序。 4. **新的NIO.2 API**:增强了文件I/O操作的能力,支持文件观察者模式,简化了文件系统的访问。 ...

    jdk1.6版本

    2. **改进的内存管理**:这个版本引入了G1(Garbage First)垃圾收集器的早期版本,这是一种并行的、适应性的垃圾回收策略,旨在减少暂停时间,提高服务器应用的响应速度。 3. **NIO.2**:JDK 1.6引入了新的非阻塞I...

    最新Java JDK 8免安装版(Linux 32位)

    Java 8的JVM在性能上有显著提升,包括改进的垃圾回收机制和更高效的内存管理,例如G1垃圾收集器的引入,优化了大型应用的内存分配和回收。 3. **Java类库**:JDK 8的类库扩展了许多新功能,如`java.time`包提供了更...

    jdk8.0.144 for mac

    9. **内存管理和性能优化**: JDK 8在内存管理方面进行了优化,例如改进的垃圾回收机制(G1垃圾收集器),以及对于大型数据集处理的性能提升。 10. **多线程编程**: Java 8提供了更好的并发库和工具,使得开发者可以...

    SUN JDK1.6 免安装

    2. **改进的内存管理**:引入了G1垃圾收集器,这是一种新的垃圾回收机制,可以更有效地管理内存,减少停顿时间。 3. **NIO.2**:引入了新的文件系统API,提供了更好的异步I/O支持,增强了对操作系统文件系统的访问...

    JVM内存模型和性能调优:JVM调优工具详解及调优实战:jstat – 第38篇

    垃圾回收(Garbage Collection, GC)是JVM自动管理内存的重要机制,通过`jstat -gc`命令,我们可以得到以下关键指标: 1. **年轻代**(Young Generation):包括Eden区和两个Survivor区。新创建的对象首先被分配到...

    jdk1.7.0-80.rar

    5. **JVM改进**:JDK 1.7引入了G1(Garbage First)垃圾收集器作为可选的垃圾回收策略,它旨在减少停顿时间,同时保持良好的总体吞吐量。 6. **开发者工具**:JDK 1.7.0_80包含了JDK自带的开发工具,如javac编译器...

    Java SE Development Kit 8

    10. **改进的编译器和JVM性能**:JDK 8的编译器(JIT)和垃圾回收机制(G1垃圾收集器)都有所优化,提高了程序的运行效率和内存管理性能。 压缩包中的"jdk-8u191-windows-x64.exe"文件是Windows 64位版本的JDK 8...

    jdk1.8 64位linux版本

    - JVM的垃圾回收机制(如G1垃圾收集器)在1.8版本中有显著优化。 - `-XX`选项允许开发者调整JVM参数以优化性能。 总之,JDK 1.8 64位Linux版本为开发者提供了强大的开发环境,结合Java 8的新特性以及64位系统的...

    jdk1.8.0_131.tgz

    这个版本的更新包括了重要的安全补丁,增强了垃圾回收机制,提升了JVM(Java虚拟机)的性能,并对Java语言的一些API进行了增强。 二、主要特性与改进 1. **Lambda表达式和函数式接口**:Java 8引入了Lambda表达式...

    jvm分析资料及工具1

    6. **JVM日志与故障排查**:通过-JDK自带的jmap、jhat、jstack和jinfo等命令,可以生成堆转储、分析内存、查看线程堆栈信息和配置信息,辅助故障诊断。 7. **类加载机制**:JVM的双亲委派模型确保了类加载的一致性...

    jdk-8u131-windows-x64

    2. **性能优化**:Oracle团队不断对JVM(Java虚拟机)进行优化,提升运行效率,比如垃圾回收机制的改进,这直接影响到Java应用的运行速度。 3. **API增强**:JDK 8引入了大量的新API,如Lambda表达式、Stream API、...

    jdk7 jdk-7u80-linux-x64 网盘下载

    在JDK 7中,垃圾回收机制得到了显著的优化。特别是对G1(Garbage First)收集器进行了增强,使得它在多核处理器上表现更佳,减少了应用程序的暂停时间,提高了吞吐量。 ##### 2.2 文件系统API增强 为了更好地支持...

    jdk-8u321-linux-x64.tar.gz

    服务器和分布式系统方面,JDK8提供了许多对高并发和分布式环境的支持,如并发工具类库、改进的垃圾回收机制等。例如,G1(Garbage First)垃圾收集器在大型分布式系统中表现出色,它能够平衡暂停时间和空间效率。 ...

    jdk-11.0.16.1_windows-x64_bin.exe

    5. **改进的垃圾收集器(G1和ZGC)**:优化了垃圾回收机制,提高了应用的响应时间和吞吐量。 三、JDK 11.0.16.1的更新与优化 JDK 11.0.16.1是一个更新版本,主要修复了一些已知的安全漏洞,提高了系统的安全性。...

    linuxJDK1.8

    - **性能优化**:JDK 1.8在性能方面做了很多优化,比如G1垃圾收集器的改进、Lambda表达式引入、 invokedynamic指令的应用等,这些都可以提高程序的运行效率。 - **内存管理**:理解JVM的内存模型,包括堆内存、栈...

Global site tag (gtag.js) - Google Analytics