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导致的系统频繁卡顿。

目录
相关文章
|
29天前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
1月前
|
Java Android开发 开发者
【编程进阶知识】精细调控:掌握Eclipse JVM参数配置的艺术
本文详细介绍了如何在Eclipse中配置JVM参数,包括内存的初始和最大值设置。通过具体步骤和截图演示,帮助开发者掌握JVM参数的精细调控,以适应不同的开发和测试需求。
41 1
|
3月前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
4月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
103 8
|
3月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
299 0
|
4月前
|
存储 Java
java 服务 JVM 参数设置配置
java 服务 JVM 参数设置配置
148 3
|
4月前
|
安全 Java fastjson
JVM 配置参数 -D,-X,-XX 的区别
JVM 配置参数 -D,-X,-XX 的区别
80 2
|
3月前
|
运维 监控 Java
【JVM 调优秘籍】实战指南:JVM 调优参数全解析,让 Java 应用程序性能飙升!
【8月更文挑战第24天】本文通过一个大型在线零售平台的例子,深入探讨了Java虚拟机(JVM)性能调优的关键技术。面对应用响应延迟的问题,文章详细介绍了几种常用的JVM参数调整策略,包括堆内存大小、年轻代配置、垃圾回收器的选择及日志记录等。通过具体实践(如设置`-Xms`, `-Xmx`, `-XX:NewRatio`, `-XX:+UseParallelGC`等),成功降低了高峰期的响应时间,提高了系统的整体性能与稳定性。案例展示了合理配置JVM参数的重要性及其对解决实际问题的有效性。
97 0
|
3月前
|
算法 Java
JVM常用运行时参数说明
JVM常用运行时参数说明