一文详解jvm之-Xms -Xmx -Xmn -Xss -XX:PermSize -XX:MaxPermSize等参数的设置和优化以及如何选择垃圾回收器

article/2025/9/30 8:19:23

文章目录

  • 1. 文章引言
  • 2. 常见配置汇总
    • 2.1 Xmn Xms Xmx Xss的区别
    • 2.2 其他常见配置
    • 2.3 典型设置举例
  • 3. 回收器选择
    • 3.1 吞吐量优先的并行收集器
    • 3.2 响应时间优先的并发收集器
    • 3.3 辅助信息
  • 4. 参考文档

1. 文章引言

我们经常在tomcatcatalina.bat或者catalina.sh中配置如下参数:

-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=256M
-XX:MaxPermSize=512M

当然,除了tomcat,像MyEclipse,eclipse、idea等编辑器中也会配置上述代码,如下我的idea编辑器的配置:

在这里插入图片描述

我们经常使用这些参数,那么,这些参数有什么含义呢?

如下,我便详细解读-Xms -Xmx -Xmn -Xss -XX:PermSize -XX:MaxPermSize等参数的设置和优化。

2. 常见配置汇总

2.1 Xmn Xms Xmx Xss的区别

Xmn Xms Xmx Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果,它们的区别如下:

  1. -Xms:堆内存的初始大小,默认为物理内存的1/64

  2. -Xmx:堆内存的最大大小,默认为物理内存的1/4

  3. -Xmn:堆内新生代的大小。通过这个值也可以得到老生代的大小,即-Xmx减去-Xmn

  4. -Xss:设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。

2.2 其他常见配置

除了这些配置,JVM还有非常多的配置,常用的如下:

  1. 堆设置

    • -Xms:初始堆大小

    • -Xmx:最大堆大小

    • -XXNewSize=n即设置年轻代大小

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

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

    • -XXMaxPermSize=n即设置持久代大小

  2. 收集器设置

    • -XX+UseSerialGC即设置串行收集器

    • -XX+UseParallelGC即设置并行收集器

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

    • -XX+UseConcMarkSweepGC即设置并发收集器

  3. 垃圾回收统计信息

    • -XX+PrintGC

    • -XX+PrintGCDetails

    • -XX+PrintGCTimeStamps

    • -Xloggcfilename

  4. 并行收集器设置

    • -XXParallelGCThreads=n即设置并行收集器收集时使用的​​​CPU​​​数,并行收集线程数

    • -XXMaxGCPauseMillis=n即设置并行收集最大暂停时间

    • -XXGCTimeRatio=n即设置垃圾回收时间占程序运行时间的百分比.公式为1/(1+n)

  5. 并发收集器设置

    • -XX+CMSIncrementalMode即设置为增量模式,适用于单CPU情况

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

2.3 典型设置举例

举个例子,假如如下配置jvm参数:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
  1. -Xmx3550m:设置JVM最大可用内存为3550M

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

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

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

再举个例子,比如:

java -Xmx3550m 
-Xms3550m 
-Xss128k 
-XX:NewRatio=4 
-XX:SurvivorRatio=4 
-XX:MaxPermSize=16m 
-XX:MaxTenuringThreshold=0
  1. -XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。比如设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

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

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

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

3. 回收器选择

JVM给了如下三种选择:

  1. 串行收集器

  2. 并行收集器

  3. 并发收集器

但是串行收集器只适用于小数据量的情况,所以,这里的选择主要针对并行收集器和并发收集器。

默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。但JDK5.0以后,JVM会根据当前系统配置进行判断。

3.1 吞吐量优先的并行收集器

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

如下配置所示:

java -Xmx3550m 
-Xms3550m 
-Xmn2g 
-Xss128k 
-XX:+UseParallelGC 
-XX:ParallelGCThreads=20 
-XX:+UseParallelOldGC
XX:MaxGCPauseMillis=100
XX:+UseAdaptiveSizePolicy
  1. -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。

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

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

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

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

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

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

如下配置所示:

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

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

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

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

3.3 辅助信息

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

  1. -XX:+PrintGC

输出形式:

[GC 118250K->113543K(130112K), 0.0094143 secs] 
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
  1. -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]
  1. -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps,可与上面两个混合使用

输出形式:

11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
  1. -XX:+PrintGCApplicationConcurrentTime

打印每次垃圾回收前,程序未中断的执行时间,可与上面混合使用

输出形式:

Application time: 0.5291524 seconds
  1. -XX:+PrintGCApplicationStoppedTime:

打印垃圾回收期间程序暂停的时间,可与上面混合使用

输出形式:

Total time for which application threads were stopped: 0.0468229 seconds
  1. -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]
  1. -Xloggc:filename

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

4. 参考文档

  1. https://blog.51cto.com/u_15812686/5741718

http://chatgpt.dhexx.cn/article/xVdPaRcQ.shtml

相关文章

JVM参数汇总:JVM内存设置多大合适?Xmx和Xmn如何设置

一、java启动参数共分为三类: 其一是标准参数(-), 所有的JVM实现都必须实现这些参数的功能,而且向后兼容; 其二是非标准参数(-X), 默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容; 其三是非Stable参数(-XX),此类参数各个jvm实现会…

JVM参数调优总结 -Xms -Xmx -Xmn -Xss

“-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数(转) JVM的堆的内存, 是通过下面面两个参数控制的 -Xms 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你 -Xmx 是最大堆的大小 当最小堆占满后&#xff…

PMP 第1章

单选题 (每题1分,共9道题) 1、 [单选] 某家公司把项目分为A,B,C三组。A组项目将为公司开拓新的业务领域,B组项目非常成熟,是公司利润主要来源,C组项目所处行业正在萎缩,公…

第1章:绪论

第1章:绪论 1、三数交换 /********** 【题目】试写一算法,如果三个整数a,b和c的值 不是依次非递增的,则通过交换,令其为非递增。 ***********/ void Descend(int &a, int &b, int &c) //这里的引用改变a…

第1章-背景与遗产

机器翻译结果,仅用于学习,不喜勿喷,原文档链接。 自 1998 年首次发布以来,Bluetooth 技术可以说已发展成为历史上最成功的双向无线标准。在无线标准业务中,成功通常被视为每年销售的芯片数量。在此基础上,…

第1章 初识C语言

目录 1. 语言的发展:2. C 语言国际标准3. 第一个C语言 程序4. 数据类型5. 常量、变量6. 局部变量、全局变量7. 字符串 转义字符 注释7.1 字符串7.2 转义字符7.3 注释 8. 常见关键字8.1 关键字 typedef8.2 关键字 static 9. #define 定义常量和宏10. #define 和 ty…

【笔记】第1章 绪论

A. 计算 一、计算 计算 对象:规律,技巧 目标:高效,低耗computer science – computing science例子 绳索计算机:勾股定理找垂线 尺规计算机:等分点—子程序 二、算法 1. 算法 计算 信息处理 借助…

第1章 NumPy基础

为何第1章介绍NumPy基础?在机器学习和深度学习中,图像、声音、文本等首先要数字化,如何实现数字化?数字化后如何处理?这些都涉及NumPy。NumPy是数据科学的通用语言,它是科学计算、矩阵运算、深度学习的基石…

第1章——初识MySQL

初识MySQL 文章目录 初识MySQL1.MySQL的概述1.1 MySQL的概念1.2 MySQL的特点1.3 相关知识 2.MySQL的初步使用(基于黑窗口)2.1 配置Path环境变量2.2 登录MySQL服务器(1)MySQL客户端方式(2)DOS命令方式 2.3 常…

复习javascript第1章

JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 很容易学习。 JavaScript 能够改变 HTML 内容 getElementById() 是多个 JavaScript HTML 方法之一。 本例使用该方法来“查找” id"demo" 的 HTML 元素,并把元素…

【NLP】第1章 什么是Transformers?

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

第1章 Python 顺序结构

文章目录 Educoder—第1章 Python 顺序结构第1关:Python顺序结构之无输入求多边形的面积第2关:Python顺序结构之无输入求平抛小球与抛出点之间的距离第3关:Python顺序结构之无输入求星期几第4关:Python顺序结构之有输入格式化输出…

【Word/word2007】将标题第1章改成第一章

问题:设置多级列表没有其他格式选的解决办法和带来的插入图注解的问题,将标题第1章改成第一章的问题其他方案。 按照百度搜索的方法设置第一章,可以是没有相应的样式可以选。 那就换到编号选项 设置新的编号值 先选是 然就是变得很丑 这时打开…

python教程第1章

python教程第1章 (1)python(2)IDEIDE是什么安装IDEVSCode第一步第二步第四步插件 海龟编辑器第一步第二步 (3)安装python下载安装包安装 (1)python 为什么python是一个成功的语言呢?正是因为它有非常强大的IDE。 (2)IDE IDE是什么 IDE是三个英文单词的缩写&…

第1章 介绍

介绍 正如业界众所周知的那样,28纳米及以下节点的设计复杂性正在爆炸式增长。小尺寸要求和高性能,低功耗和小面积的相互矛盾的要求导致了如此复杂的设计架构。多核,多线程和功耗,性能和面积(PPA)需求加剧了…

第1章 Python基础

目录 0. Jupyter Notebook简介 0.1 Jupyter Notebook简介及启动 0.1.1 Jupyter Notebook简介0.1.2 Jupyter Notebook安装与启动0.2 Jupyter Notebook里面的最常用的操作: 0.2.1 更改文件名0.2.2 模式切换0.2.3 命令模式快捷键0.2.4 查询帮助1. Python基础语法 1.1 编…

第1章 实践基础

文章目录 第1章 实践基础1.1 如何运行本书的代码1.1.1 本地运行1.1.1.1 环境准备1.1.1.2 快速安装 1.1.2 AI Studio运行 1.2 张量1.2.1 创建张量1.2.1.1 指定数据创建张量1.2.1.2 指定形状创建1.2.1.3 指定区间创建 1.2.2 张量的属性1.2.2.1 张量的形状1.2.2.2 形状的改变1.2.2…

第1章 Nginx简介

基于 Nginx版本 1.14.2 ,Tomcat版本 9.0.0 演示 第1章 Nginx简介 1.1 Nginx发展介绍 Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。 Nginx 特点是占有内存少,并发处理能力…

第1章 多线程基础

第1章 多线程基础 1.1.2 线程与进程的关系 进程可以看成是线程的容器,而线程又可以看成是进程中的执行路径。 1.2 多线程启动 线程有两种启动方式:实现Runnable接口;继承Thread类并重写run()方法。 执行进程中的任务时才会产生线程&a…

第1章 Rust安装

Rust是一门安全的语言,最近也加入到Linux内核中,因此后续这门语言会越来越流行,所以准备学习下,本篇介绍Rust在Window平台上的安装过程。 目录 安装步骤 1.到官网下载安装包 2.搭建 Visual Studio Code 开发环境 安装步骤 1.…