JVM参数设置
基本参数
通过一张图来了解如何通过参数来控制各区域的内存大小

控制参数
- -Xms设置堆的最小空间大小。
- -Xmx设置堆的最大空间大小。
- -XX:NewSize设置新生代最小空间大小。
- -XX:MaxNewSize设置新生代最大空间大小。
- -XX:PermSize设置永久代最小空间大小。
- -XX:MaxPermSize设置永久代最大空间大小。
- -Xss设置每个线程的堆栈大小。
没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。
老年代空间大小=堆空间大小-年轻代大空间大小

VM内存区域总体分两类,heap区 和 非heap 区 。
- heap区: 堆区分为Young Gen(新生代),Tenured Gen(老年代-养老区)。其中新生代又分为Eden Space(伊甸园)、Survivor Space(幸存者区)。
- 非heap区: Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。
为什么要区分新生代和老生代?
不同代采用的算法区别?
请看下面题目:
对于jvm内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
其最小内存值和Survior区总大小分别是: 10240m,2048m
全局参数
JVM参数设置、分析
典型配置举例
堆大小设置
- 年轻代的设置很关键
典型配置
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 区进行多次复制,这样可以增加对象
再年轻代的存活时间,增加在年轻代即被回收的概论
回收器选择
吞吐量优先的并行收集器
如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。
典型配置
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 会自动调整年轻代大小,以满足此值。
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 K->K(K), 0.0094143 secs] [Full GC K->10414K(K), 0.0 secs] - -XX:+PrintGCDetails: 输出形式:
[GC [DefNew: 8614K->781K(9088K), 0.0 secs] K->K(K), 0.0 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: K->10414K(K), 0.0 secs] K->10414K(K), 0.0 secs] - -XX:+PrintGCTimeStamps -XX:+PrintGC: PrintGCTimeStamps 可与上面两个混合使用
输出形式:11.851: [GC 98328K->93620K(K), 0.0082960 secs] - -XX:+PrintGCApplicationConcurrentTime: 打印每次垃圾回收前,程序未中断的执行时
间。可与上面混合使用。输出形式:Application time: 0. seconds - -XX:+PrintGCApplicationStoppedTime: 打印垃圾回收期间程序暂停的时间。可与上面
混合使用。输出形式:Total time for which application threads were stopped: 0.0 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, 0x2b, 0x2b, 0x2bfd0000) 34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(K)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, 0x2b, 0x2b, 0x2bfd0000) } , 0.0 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
数。并行收集线程数。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212859.html原文链接:https://javaforall.net
