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

article/2025/9/30 7:56:56
本文地址: https://www.dutycode.com/jvm_xmx_xmn_xms_shezhi.html
除非注明,文章均为 www.dutycode.com 原创,欢迎转载!转载请注明本文地址,谢谢。
问题:
新上线一个java服务,或者是RPC或者是WEB站点, 内存的设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢?

分析:

依据的原则是根据Java Performance里面的推荐公式来进行设置。

WX20171103-112002.png

具体来讲:
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

具体操作实例:
以我司的一个RPC服务为例。

BTW:刚上线的新服务,不知道该设置多大的内存的时候,可以先多设置一点内存,然后根据GC之后的情况来进行分析。
初始JVM内存参数设置为: Xmx=2G Xms=2G xmn=1G 

使用jstat 查看当前的GC情况。如下图:

WX20171103-112025.png

YGC平均耗时: 173.825s/15799=11ms
FGC平均耗时:0.817s/41=19.9ms
平均大约10-20s会产生一次YGC

看起来似乎不错,YGC触发的频率不高,FGC的耗时也不高,但这样的内存设置是不是有些浪费呢?
为了快速看数据,我们使用了方式2,产生了几次FullGC,FullGC之后,使用的jmap -heap 来看的当前的堆内存情况(也可以根据GC日志来看)

heap情况如下图:(命令 : jmap -heap <pid>)

WX20171103-112039.png

上图中的concurrent mark-sweep generation即为老年代的内存描述。

老年代的内存占用为100M左右。 按照整个堆大小是老年代(FullGC)之后的3-4倍计算的话,设置各代的内存情况如下:
Xmx=512m  Xms=512m  Xmn=128m PermSize=128m  老年代的大小为 (512-128=384m)为老年代存活对象大小的3倍左右

调整之后的,heap情况

WX20171103-112102.png

GC情况如下:

WX20171103-112111.png

YGC 差不多在10s左右触发一次。每次YGC平均耗时大约9.41ms。可接受。
FGC平均耗时:0.016s/2=8ms
整体的GC耗时减少。但GC频率比之前的2G时的要多了一些。

注:  看上述GC的时候,发现YGC的次数突然会增多很多个,比如 从1359次到了1364次。具体原因是?

总结:
在内存相对紧张的情况下,可以按照上述的方式来进行内存的调优, 找到一个在GC频率和GC耗时上都可接受的一个内存设置,可以用较小的内存满足当前的服务需要

但当内存相对宽裕的时候,可以相对给服务多增加一点内存,可以减少GC的频率,GC的耗时相应会增加一些。 一般要求低延时的可以考虑多设置一点内存, 对延时要求不高的,可以按照上述方式设置较小内存。 


补充:
永久代(方法区)并不在堆内,所以之前有看过一篇文章中描述的 整个堆大小=年轻代+年老代+永久代的描述是不正确的。 

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

相关文章

JVM 参数配置及详解 -Xms -Xmx -Xmn -Xss 调优总结(点赞收藏)

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

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

Xms 是指设定程序启动时占用内存大小。一般来讲&#xff0c;大点&#xff0c;程序会启动的快一点&#xff0c;但是也可能会导致机器暂时间变慢。 Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存&#xff0c;超出了这个设置值&#xff0c;就会抛…

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

文章目录 1. 文章引言2. 常见配置汇总2.1 Xmn Xms Xmx Xss的区别2.2 其他常见配置2.3 典型设置举例 3. 回收器选择3.1 吞吐量优先的并行收集器3.2 响应时间优先的并发收集器3.3 辅助信息 4. 参考文档 1. 文章引言 我们经常在tomcat的catalina.bat或者catalina.sh中配置如下参数…

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

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

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…