JVM参数设置

一、JVM参数类型

java 命令支持多种参数选项,可以分为三种类别:1.标准选项参数 2.非标准选项参数(-X开头) 3.高级选项参数(-XX开头)

1.标准选项参数

  • Java虚拟机(JVM)的所有实现都保证支持标准选项。它们用于常见操作,例如检查JRE版本、设置类路径、启用详细输出等.
  • 例子:-version,-help,-Dproperty=value(设置系统属性值-Dfoo="foo bar")

2.非标准选项参数

  • 非标准选项是特定于Java HotSpot虚拟机的通用选项,因此不能保证所有JVM实现都支持这些选项,并且可能会发生更改。这些选项以-X开头.
  • 例子:-Xms1g -Xmx2g -Xss64m

3.高级选项参数

  • 高级选项是针对开发人员,用于调整Java HotSpot虚拟机操作的特定区域,这些区域通常具有特定的系统要求,并且可能需要对系统配置参数进行特权访问。它们也不能保证得到所有JVM实现的支持,并且可能会发生变化。高级选项以-XX开头。可以再细分为:1.运行时选项参数 2.JIT 编译选项 3.服务信息选项 4.垃圾回收选项。-XX:+-XX:- 分别表示开启/关闭某个属性。

  • 1.运行时选项参数 :-XX:MaxDirectMemorySize=256m

  • 2.JIT 编译选项 : 该参数类型比较少用到

  • 3.服务信息选项:-XX:+HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath=/logs/

  • 4.垃圾回收选项: -XX:MaxMetaspaceSize=256M,-XX:+UseG1GC

二、配置建议

  • Xms 与Xmx 设置成一样大,可以减轻伸缩堆大小带来的压力,一般是FullGC后已占堆大小的3-4倍
  • 优先使用JVM的默认配置,因为随着JVM的不断发展演进,会越来越智能化,比如JDK1.8默认垃圾额回收器默认启动UseAdaptiveSizePolicy,自动选择年轻代区大小和相应的Survivor区比例
  • 配置GC日志打印,方便快速排错

参考例子:

  • JDK 1.8
-Xms2G -Xmx2G -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -Xloggc:/logs/myGC.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/
  • JDK1.9以上(包含JDK1.9)
-Xms2G -Xmx2G -Xlog:gc*=info,gc+heap=debug,gc+age=trace,safepoint:/logs/gc_%t.log:time,level,tags:filecount=5,filesize=20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/

从上面例子对比,可以看出,JDK1.8及更早版本,设置gc日志显得比较麻烦,JDK1.9开始,统一使用一个Xlog 参数来设置gc日志打印。详细对比参考官网:https://docs.oracle.com/en/java/java-components/enterprise-performance-pack/epp-user-guide/printing-jvm-information.html

-Xlog

-Xlog是JDK1.9引入的日志服务,用于将JVM中的各种事件统一起来,以统一的形式对外输出

java -Xlog:help  //查看参数所有所有选项

格式如下:

-Xlog[:[selections][:[output][:[decorators][:output-options]]]]

详细参数选项说明:https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-BE93ABDC-999C-4CB5-A88B-1994AAAC74D5

三、常用设置大全

参数 含义 默认值 说明
-Xms 初始堆大小 物理内存的1/64
-Xmx 最大堆大小 物理内存的1/4
-Xss 每个线程栈的大小 在相同物理内存下,减小这个值能生成更多的线程,操作系统对一个进程内线程数有限制,等同于-XX:ThreadStackSize
-Xmn 新生代大小 -XX:NewSize设置新生代大小和 -XX:MaxNewSize 新生代最大值含义一致,推荐使用-Xmn
-XX:MaxMetaspaceSize 设置元空间最大值 默认值是-1 JDK1.8之前是永久代的概念,参数是-XX:MaxPermSize
-XX:MetaspaceSize 设置元空间初始值 默认值是21M JDK1.8之前是永久代的概念,参数是 -XX:PermSize
-XX:MaxDirectMemorySize 最大直接内存大小 -1 JDK1.8开始支持的参数
-XX:NewRatio 老年代与新生代的比值 默认值2 新生代(包括Eden和两个Survivor区)
-XX:SurvivorRatio Eden区与Survivor区的大小比值 默认值8 设置为8,则两个Survivor区与一个Eden区的比值为2:8
-XX:PretenureSizeThreshold 对象超过多大是直接在老年代分配 默认值0(先在新生代创建) 新生代采用Parallel Scavenge GC时无效
-XX:MaxTenuringThreshold 垃圾最大年龄 默认值15 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代
-XX:PrintCommandLineFlags 启动的时候打印JVM参数 默认关闭
-XX:-UseBiasedLocking 不启动偏向锁 默认启用 JDK1.6开始支持偏向锁,默认启用
-XX:+AggressiveOpts 启动性能优化参数 默认关闭 优化功能参数是属于实验性功能,预计将在即将发布的版本中成为默认功能
-XX:+DisableExplicitGC 关闭System.gc() 默认启动
-Xnoclassgc 禁用类垃圾回收 默认关闭
-XX:ParallelGCThreads 并行收集器的线程数 此值最好配置与处理器数目相等
-XX:+UseAdaptiveSizePolicy 自动选择年轻代区大小和相应的Survivor区比例 UseParallelGC垃圾收集器默认启动了AdaptiveSizePolicy
-XX:MaxGCPauseMillis 垃圾回收的最长时间(最大暂停时间ms) 软目标,JVM尽力调整配置达到
-XX:GCTimeRatio 设置垃圾回收时间占程序运行时间的百分比 默认值99,即1% 公式为1/(1+n)

垃圾收集器

参数 含义 默认值 说明
-XX:+UseSerialGC 设置串行收集 年轻代和老年代都是串行垃圾收集
-XX:+UseParNewGC 设置年轻代为并行收集 可与CMS收集同时使用,默认老年代Serial Old
-XX:+UseConcMarkSweepGC 设置老年代CMS收集 默认新生代-XX:+UseParNewGC,JDK14已移除
-XX:+UseParallelGC 设置新生代Parallel Scavenge回收器 默认老年代使用Parallel Old收集器
-XX:+UseParallelOldGC 设置老年代Parallel Old收集器 默认新生代使用Parallel Scavenge
-XX:+UseG1GC 设置G1收集器 JDK1.9开始默认的垃圾收集器

GC日志打印配置

参数 含义 默认值 说明
-XX:+PrintGC 打印GC日志 默认关闭
-XX:+PrintGCDetails 打印GC详细日志 默认关闭
-XX:+PrintGCTimeStamps 打印GC详细日志 默认关闭
-XX:+PrintGCDateStamps 打印GC详细日志 默认关闭
-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间 默认关闭
-XX:+PrintHeapAtGC 打印GC前后的详细堆栈信息 默认关闭
-XX:+PrintTenuringDistribution 每次minor GC后新的存活周期的阈值 默认关闭
-Xloggc:filename 日志信息记录到指定文件
-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间 默认关闭
-XX:+PrintGCApplicationConcurrentTime 打印每次垃圾回收前,程序未中断的执行时间 默认关闭
-XX:+PrintClassHistogram 打印类的信息 默认关闭

上述大部分参数在JDK1.9已移除,改用-Xlog

参数 含义 默认值 说明
-Xlog 统一GC日志打印配置参数 JDK1.9开始,取替JDK1.9之前繁多GC日志打印参数

详细官网参考:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容