JVM参数设置

JVM参数设置JVM 参数设置基本参数通过一张图来了解如何通过参数来控制各区域的内存大小控制参数 Xms 设置堆的最小空间大小 Xmx 设置堆的最大空间大小 XX NewSize 设置新生代最小空间大小 XX MaxNewSize 设置新生代最大空间大小 XX PermSize 设置永久代最小空间大小 XX MaxPermSize 设置永久代最大空间大小 Xss 设置每个线程的堆栈大小

JVM参数设置

基本参数

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

image

控制参数

  • -Xms设置堆的最小空间大小。
  • -Xmx设置堆的最大空间大小。
  • -XX:NewSize设置新生代最小空间大小。
  • -XX:MaxNewSize设置新生代最大空间大小。
  • -XX:PermSize设置永久代最小空间大小。
  • -XX:MaxPermSize设置永久代最大空间大小。
  • -Xss设置每个线程的堆栈大小。

没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。

老年代空间大小=堆空间大小-年轻代大空间大小

image

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

(0)
上一篇 2026年3月18日 下午7:05
下一篇 2026年3月18日 下午7:06


相关推荐

  • 2021win7激活码-激活码分享

    (2021win7激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月21日
    63
  • CriticalSection_alternative question是什么意思

    CriticalSection_alternative question是什么意思线程锁,即在多线程中可以控制线程的执行顺序,防止使用中全局变量在两个线程中同时使用,变量发生改变的错误。示例:https://blog.csdn.net/ninedays/article/details/5381123线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法注:使用结构CRITICAL_SECTION需加入头文件#in…

    2026年2月5日
    6
  • 如何申请注册在国内可以登录使用国外邮箱?「建议收藏」

    如何申请注册在国内可以登录使用国外邮箱?「建议收藏」2022年冬奥会的开始、冰墩墩的爆火,这些让在国外无法回国的华人,十分羡慕,也让很多之前不怎么联系的朋友使用邮件交流了起来,那么是不是所有邮箱都可以向国外发信呢?其实并不是,我之前使用过,很多邮箱都是无法向国外发信的,现在我注册使用的是TomVIP邮箱,公司使用的Tom企业邮箱,因为做出口贸易,才选择的这家邮箱,在国外收发信方面做的还是非常棒的!如何申请注册国外邮箱首先,要进入邮箱官网(网页进行搜索、网址直接进入),选择自己喜欢的邮箱域名,点击注册;其次,选择邮箱套餐,依据自己日常使用的邮箱容量、发信

    2022年7月12日
    94
  • CMD关闭端口命令「建议收藏」

    CMD关闭端口命令「建议收藏」1.查询端口netstat-ano|findstr”123456″TCP127.0.0.1:12340.0.0.0:0LISTENING67892.查询端口名tasklist|findstr”6789″studio64.exe6789Console…

    2022年7月20日
    31
  • H2数据库教程_h2数据库编辑数据库

    H2数据库教程_h2数据库编辑数据库 启动和使用H2控制台H2控制台应用程序允许您使用浏览器访问数据库。这可以是H2数据库,也可以是支持JDBCAPI的其他数据库。这是一个客户端/服务器应用程序,因此需要服务器和客户端(浏览器)来运行它。根据您的平台和环境,有多种方法可以启动H2控制台:OS 开始 视窗 单击[开始],[所有程序],[H2]和[H2控制台(命令行)]  系统托盘中将添加…

    2022年10月12日
    10
  • 绿联 NAS 私有云与 MiniMax 深度合作,首发开箱即用的 OpenClaw 龙虾应用

    绿联 NAS 私有云与 MiniMax 深度合作,首发开箱即用的 OpenClaw 龙虾应用

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号