31-公司级别的JVM参数模板,拿走不送

简介: 就目前大部分互联网创业型公司,其开发的系统几乎都不会考虑JVM性能优化这一块,哪怕一个团队中有1个技术Leader或架构师,往往都没有太多精力去把控到特别细节的地方上,以及对JVM也没有那么的精通与熟悉,这也导致一个很大的问题,大部分工程师开发完一个系统后,部署生产环境的时候根本对JVM参数什么的设置一窍不通,也就是默认的JVM参数进行系统的运行,等系统在某个时段出现问题后,开始大量分析找bug,很久也未能找出什么原因。

默认的JVM参数绝对是系统负载逐渐增高的时候一个最大的问题

如果你不设置-Xmx、-Xms之类的堆内存大小的话,你启动一个系统,可能默认就给你几百MB的堆内存大小,新生代和老年代可能都是几百MB的样子。新生代内存过小,会导致Survivor区域内存过小,同时Eden区域也很小。Eden区域过小,自然会导致频繁的触发Young GC,Survivor区域过小,自然会导致经常在Young GC之后存活对象其实也没多少,但就是Survivor区域放不下。此时必然会导致对象经常进入老年代中,因此也必然会导致老年代过一段时间就放满了,然后就会触发Full GC。

因此在大部分工程师都对JVM优化不是很精通的情况下,而你作为技术Leader或架构师,通过推行一个JVM参数模板,可以让各个系统短时间内迅速优化JVM的性能。

这里强调一点:没有绝对的模板,任何系统的实际运行情况以及生产环境都不一样,因此不能直接想着万能模板解决,而是真正自己通过分析JVM的运行情况,内存占比,GC频率去准确的进行优化!

这里我们仅仅是针对中小型公司,一些完全不懂JVM参数优化的团队,给出一个标准的模板进行优化,总比直接使用默认JVM参数要好很多!然后尽量让大部分系统套用这个模板,基本保证JVM性能别太差,避免很多初中级工程师直接使用默认的JVM参数,可能一台8G内存的机器上,JVM堆内存就分配了几百MB。

模板参数:

-Xms4096M 
-Xmx4096M 
-Xmn3072M 
-Xss1M  
-XX:PermSize=256M 
-XX:MaxPermSize=256M 
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC 
-XX:CMSInitiatingOccupancyFraction=92 
-XX:+UseCMSCompactAtFullCollection 
-XX:CMSFullGCsBeforeCompaction=0

参数设置解释:

一般来讲线上部署的机器都差不多是8G4核,那么分配4G给JVM内存也就足够了,毕竟还有其他一些进程需要使用到内存,然后新生代分配了3G,尽量让新生代大一些!进而对应的Survivor区域能分配到300MB。

不同的系统运行的状况不同,基本上每次minor gc 过后存活几十MB对象是常态,因此几十MB对象进入Survivor区还是很轻松的,也不会轻易触发 动态年龄判定规则,让部分对象直接进老年代。

只要内存分配合理,那么进入老年代的对象就很少或极慢,该参数模板在多个系统的测试下,通过jstat观察,基本上各个系统的Full GC都在几天发生一次。

-XX:CMSFullGCsBeforeCompaction=0该参数的设置也是非常重要,保证了我们每次Full GC之后都会执行一次内存整理,解决内存碎片的问题。

进一步性能优化:

这里我们再介绍两个参数,可以帮助优化Full GC的性能,把每次Full GC的时间进一步降低一些。

第一个参数:-XX:+CMSParallelInitialMarkEnabled,这个参数会在CMS垃圾回收器的“初始标记”阶段开启多线程并发执行

因为初始标记阶段,我们之前说过是会进入STW的,导致系统停顿,所以这个阶段如果能多线程并发执行,可以有效提升标记的效率,减少STW的时间。

第二个参数:-XX:+CMSScavengeBeforeRemark,这个参数会在CMS的重新标记阶段之前,先尽量执行一次Young GC。

CMS的重新标记阶段也是会进入STW的,所以如果在重新标记之前,先执行一次Young GC,就会回收掉一些年轻代里没有人引用的对象。所以如果先提前回收掉一些对象,那么在CMS的重新标记阶段就可以少扫描一些对象,此时就可以提升CMS的重新标记阶段的性能,减少他的耗时。

加入两个参数后的整体JVM参数模板:

-Xms4096M 
-Xmx4096M 
-Xmn3072M 
-Xss1M  
-XX:PermSize=256M 
-XX:MaxPermSize=256M 
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC 
-XX:CMSInitiatingOccupancyFraction=92 
-XX:+UseCMSCompactAtFullCollection 
-XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSScavengeBeforeRemark

ok,那么以上JVM参数模板就给到大家了,后续开发中可以直接进行使用。哪怕是不太懂JVM优化的普通工程师只要套用这个模板,对一些普通的业务系统,都能保证其JVM性能不会出现大的问题,比如频繁的Young GC和Full GC导致的系统频繁卡顿。

目录
相关文章
|
1月前
|
DataWorks Java 关系型数据库
DataWorks常见问题之将预警信息发送至邮箱
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
1月前
|
监控 架构师 Java
JVM 11 调优指南:如何进行JVM调优,JVM调优参数
JVM 11的优化指南:如何进行JVM调优,以及JVM调优参数有哪些”这篇文章将包含JVM 11调优的核心概念、重要性、调优参数,并提供12个实用的代码示例,每个示例都会结合JVM调优参数和Java代码
159 2
|
1月前
|
存储 缓存 监控
JVM 21 的调优指南:如何进行JVM调优,JVM调优参数
聊聊关于JVM 21的优化指南。这篇文章将会深入探讨如何进行JVM调优,介绍一些关键的JVM调优参数,并提供12个实用的代码示例。由于篇幅较长,我会分几个部分来详细讲解,之前写的也有33篇系列教程JVM调优实战打击也可以去围观。
188 0
|
1月前
|
监控 架构师 Java
JVM 8 调优指南:如何进行JVM调优,JVM调优参数
这篇文章将详细介绍如何进行JVM 8调优,包括JVM 8调优参数及其应用。此外,我将提供12个实用的代码示例,每个示例都会结合JVM启动参数和Java代码。JVM调优是指通过调整Java虚拟机的配置来提升Java应用程序的性能。这包括优化堆内存设置、选择合适的垃圾收集器以及调整其他性能相关的参数。
330 0
|
1月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
32 0
|
1月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
120 0
|
2天前
|
Java
JVM远程调试参数
JVM远程调试参数
7 1
|
1天前
|
存储 缓存 监控
JVM中G1垃圾收集器:原理、过程和参数配置深入解析
JVM中G1垃圾收集器:原理、过程和参数配置深入解析
|
1天前
|
监控 Java
JVM 中你不得不知的一些参数
JVM 中你不得不知的一些参数
|
1天前
|
IDE Java Linux
在Maven中设置JVM系统参数及Java应用调试实例
在Maven中设置JVM系统参数及Java应用调试实例
10 0