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

article/2025/9/30 8:16:50

一、java启动参数共分为三类:

其一是标准参数(-), 所有的JVM实现都必须实现这些参数的功能,而且向后兼容; 其二是非标准参数(-X), 默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容; 其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,这些都是不稳定的并且不推荐在生产环境中使用。将来可能会随时取消,需要慎重使用;上都被实现),而且如果在新版本有什么改动也不会发布通知。 对响应时间要求很高的系统来说,良好掌握JVM关于GC调优的参数是很重要的。比如一个高流量地延迟的电子交易平台,他要求的响应时间都是毫秒级的。要获得适合的参数组合需要大量的分析和不断的尝试,更依赖于交易系统的特性。

关于JVM选项的几点: 1) 布尔型参数选项:-XX:+ 打开, -XX:- 关闭。(比如-XX:+PrintGCDetails) 2) 数字型参数选项通过-XX:=设定。数字可以是m/M(兆字节),k/K(千字节),g/G(G字节)。 比如:32K表示32768字节。(比如-XX:HeapDumpPath=./java_pid.hprof) 3) 字符行参数选项通过-XX:=设定,通常用来指定一个文件,路径,或者一个命令列表。(比如-XX:+PrintGCDetails) 命令 java -help可以列出java 应用启动时标准选项(不同的JVM实现是不同的)。 java -X可以列出不标准的参数(这是JVM的扩展特性)。-X相关的选项不是标准的,被改变也不会通知。 如果你想查看当前应用使用的JVM参数,你可以使用:ManagementFactory.getRuntimeMXBean().getInputArguments()。

二、标准参数中比较有用的:

verbose -verbose:class 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。

-verbose:gc 输出每次GC的相关情况。

-verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息。

命令查看java的class字节码文件、verbose、synchronize

三、非标准参数又称为扩展参数

JVM内存设置多大合适?Xmx和Xmn如何设置?

具体具体来讲:参照 老年代存活对象大小

Java整个堆大小设置,Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍

永久代 PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。

年轻代Xmn的设置为老年代存活对象的1-1.5倍。

老年代的内存大小设置为老年代存活对象的2-3倍。

BTW:

1、Sun官方建议年轻代的大小为整个堆的3/8左右, 所以按照上述设置的方式,基本符合Sun的建议。

2、堆大小=年轻代大小+年老代大小, 即xmx=xmn+老年代大小 。 Permsize不影响堆大小。

3、为什么要按照上面的来进行设置呢? 没有具体的说明,但应该是根据多种调优之后得出的一个结论。

如何确认老年代存活对象大小?

方式1(推荐/比较稳妥):

JVM参数中添加GC日志,GC日志中会记录每次FullGC之后各代的内存大小,观察老年代GC之后的空间大小。可观察一段时间内(比如2天)的FullGC之后的内存情况,根据多次的FullGC之后的老年代的空间大小数据来预估FullGC之后老年代的存活对象大小(可根据多次FullGC之后的内存大小取平均值)

方式2:(强制触发FullGC, 会影响线上服务,慎用)

方式1的方式比较可行,但需要更改JVM参数,并分析日志。同时,在使用CMS回收器的时候,有可能不能触发FullGC(只发生CMS GC),所以日志中并没有记录FullGC的日志。在分析的时候就比较难处理。

BTW:使用jstat -gcutil工具来看FullGC的时候, CMS GC是会造成2次的FullGC次数增加。 具体可参见之前写的一篇关于jstat使用的文章

所以,有时候需要强制触发一次FullGC,来观察FullGC之后的老年代存活对象大小。

注:强制触发FullGC,会造成线上服务停顿(STW),要谨慎,建议的操作方式为,在强制FullGC前先把服务节点摘除,FullGC之后再将服务挂回可用节点,对外提供服务

在不同时间段触发FullGC,根据多次FullGC之后的老年代内存情况来预估FullGC之后的老年代存活对象大小

如何触发FullGC ?

使用jmap工具可触发FullGC

jmap -dump:live,format=b,file=heap.bin <pid> 将当前的存活对象dump到文件,此时会触发FullGC

jmap -histo:live <pid> 打印每个class的实例数目,内存占用,类全名信息.live子参数加上后,只统计活的对象数量. 此时会触发FullGC

链接:[#link]( https://www.dutycode.com/m/?post=153 )

非标准化的参数在将来的版本中可能会改变。所有的这类参数都以-X开始,并且可以用java -X来检索。注意,不能保证所有参数都可以被检索出来,其中就没有-Xcomp。例如:

常用的参数介绍:

-Xms512m 设置JVM促使内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xmx512m ,设置JVM最大可用内存为512M。 -Xmn200m:设置年轻代大小为200M。此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是(eden+1 survivor space)不同的。

计算公式有:

年老代大小=-Xmx减去-Xmn

整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。

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

-XX:SurvivorRatio

用于设置Eden和其中一个Survivor的比值,默认比例为8(Eden):1(一个survivor),这个值也比较重要。

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

-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 -Xloggc:file 与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。 若与verbose命令同时出现在命令行中,则以-Xloggc为准。 -Xprof 跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。

-Xrunhprof

-Xdebug:JVM调试参数,用于远程调试

例如在tomcat中的远程调试设置方法为-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address


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

相关文章

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

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

PMP 第1章

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

第1章:绪论

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

第1章-背景与遗产

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

第1章 初识C语言

目录 1. 语言的发展&#xff1a;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. 计算 一、计算 计算 对象&#xff1a;规律&#xff0c;技巧 目标&#xff1a;高效&#xff0c;低耗computer science – computing science例子 绳索计算机&#xff1a;勾股定理找垂线 尺规计算机&#xff1a;等分点—子程序 二、算法 1. 算法 计算 信息处理 借助…

第1章 NumPy基础

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

第1章——初识MySQL

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

复习javascript第1章

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

【NLP】第1章 什么是Transformers?

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

第1章 Python 顺序结构

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

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

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

python教程第1章

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

第1章 介绍

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

第1章 Python基础

目录 0. Jupyter Notebook简介 0.1 Jupyter Notebook简介及启动 0.1.1 Jupyter Notebook简介0.1.2 Jupyter Notebook安装与启动0.2 Jupyter Notebook里面的最常用的操作&#xff1a; 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 &#xff0c;Tomcat版本 9.0.0 演示 第1章 Nginx简介 1.1 Nginx发展介绍 Nginx &#xff08;engine x&#xff09; 是一个高性能的Web服务器和反向代理服务器&#xff0c;也可以作为邮件代理服务器。 Nginx 特点是占有内存少&#xff0c;并发处理能力…

第1章 多线程基础

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

第1章 Rust安装

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

第1章 概述

第一章 概述 考试范围&#xff1a; 1.1-1.10 考试内容&#xff1a; 章节后的Review Terms&#xff08;名词基本都在课文中&#xff09; 考试题型&#xff1a; 综合题 Review Terms Database-management system (DBMS) &#xff1a;A collection of interrelated data and a …