35-JVM性能优化总结-JVM性能优化到底该怎么做?

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 通过之前大量的案例和工具的介绍,相信大家对于JVM优化有了一定的了解和熟悉,接下来我们将整个JVM性能优化的步骤做一个总结。

通过之前大量的案例和工具的介绍,相信大家对于JVM优化有了一定的了解和熟悉,接下来我们将整个JVM性能优化的步骤做一个总结。

1)开发完上线前的JVM参数设置

开发完毕一个项目后,如果不做JVM参数设置而是采用默认的JVM参数直接部署上线,那一定是不靠谱的!出了问题再去观察分析解决,调整JVM参数,这是拿公司资产开玩笑。但是很多公司也没有所谓的JVM参数模板。

那么我们应该如何做呢?

  • 首先,做合理预估

    针对该系统的每个核心接口估算每秒多少次请求,每次请求会创建多少个对象,每个对象大概有多大,每秒钟占据分配多少内存空间。
    1b4a1583d5c4474083b60a096bdc095a~tplv-k3u1fbpfcp-zoom-1.png

  • 接着估算Eden区大概多长时间会占满。

9fc466912a364314b17e4ed073fb08a3~tplv-k3u1fbpfcp-zoom-1.png

  • 从而估算出来多久会发生一个Minor GC,以及有多少存活对象,有多少对象会进入老年代,老年代增长的速率是多少,预计多久触发一次Full GC。

783dd9802535407081bf56f8e5e3ff11~tplv-k3u1fbpfcp-zoom-1.png

通过以上的估算分析,就可以针对当前的项目系统做一个初步的合理估算,给出预计的内存分配,堆内存(Eden和Survivor区的分配)以及老年代的大小分配。尽量让每次Minor GC后存活下的对象远小于Survivor区域,避免对象频繁进入老年代从而触发Full GC。

比较理想的状态就是:

系统偶尔发生一次Mionr GC,每次GC后没有对象进入老年代,能进入老年代的对象只有长期持有存活,经历15次Minor GC后自然进入老年代的对象,老年代几乎不发生GC,新生代也就最多几分钟一次,每次耗时几毫秒。

2)压测之后合理调整JVM参数

每当系统上线前,都必须经历一次压测,在压测模式下模拟系统在线上压力的环境下运行的状态,同时我们可以通过jstat工具,定时打印输出JVM压测下的内存运行模型,重点观察以下几个指标:

  • Eden区的对象增长速率
  • Minor GC的频繁以及耗时
  • Minor GC后的存活对象大小
  • 老年代的对象增长速率
  • Full GC的频率以及耗时

通过压测时分析模拟出来的内存数据,进而进一步对JVM参数进行优化,内存合理分配,尽量做到只触发Minor GC。

3)线上系统的监控和优化

系统正式上线后,肯定要有内存的监控!一般的简单快速做法,可以考虑直接使用 jstat工具,输出写入到指定的文件,每天定时查看。

比较高级一点的做法可以考虑直接采用 Zabbix(一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案)或者 Open-Falcon(小米运维部门开源出来的互联网企业级监控系统,目前包括小米、金山云、美团、京东金融、赶集网等都在使用Open-Falcon)之类的工具来监控机器和JVM的运行,一旦频繁Full GC就触发报警机制。

优化的核心还是通过工具分析出来Full GC频繁触发的关键因素,找出核心问题所在,从而优化对应JVM参数,减少Full GC的触发频率。(可以多参考熟悉之前优化的案例,自己多动手熟练下)

4)线上频繁FullGC的几种表现

常见表现不外乎以下三种:

  • 频繁Full GC报警
  • 机器CPU负载过高
  • 系统无法处理请求或处理过慢

5)频繁FullGC的几种常见原因

常见的几种原因归纳为以下几种:

  • 系统承载高并发请求,处理数据量过大,导致Minor GC频繁,每次GC后存活对象过多,Survivor区域过小,进入老年代对象过多过于频繁,从而导致Full GC频繁
  • 大促或高峰时期,单次加载数据量过大,造成大对象直接进入老年代,从而频繁触发Full GC
  • 内存泄露,莫名其妙产生大量对象无法回收,长期持有,并且一直占据在老年代了,吃空间,导致频繁FullGC
  • Metspace(永久代)加载过多触发Full GC
  • 手动调用System.GC

针对第一种情况,擅于使用jstat利器分析核心问题,调整内存大小,增大Surviror区域。

针对第二种和第三种情况,采取 dump堆内存快照,利用MAT工具分析大对象到底是谁

6)一个统一的JVM参数模板

之前已经给大家分享过公司级别的JVM参数模板,每一个团队都应该有一个标准的JVM参数模板,统一调试和开发,由leader进行统一优化和调整。

这里再贴下给大家做个参考:(重点是结合自己的系统和实际物理机器,切忌直接复制使用)

    -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

小结

通过之前的大量案例以及JVM性能优化的讲解我们最后总结提炼如下:

  1. 开发完上线前的JVM参数设置
  2. 压测之后合理调整JVM参数
  3. 线上系统的监控和优化
  4. 线上频繁FullGC的几种表现
  5. 频繁FullGC的几种常见原因
  6. 一个统一的JVM参数模板
相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
分布式计算 Java 开发者
GitHub爆款!Java性能优化:轻松道破软件性能调优,不止搞定JVM
今天给大家带来的是:周明耀老师的 《大话Java性能优化:轻松道破软件性能调优方法论和具体实现路径》,全面细致,一本书搞定性能优化 周明耀是谁? 12年投资银行项目、分布式计算项目工作经验,IBM开发者论坛专家作者。一名IT技术狂热爱好者,一名顽强到底的工程师。推崇技术创新、思维创新,对于新技术非常的热爱,致力于技术研发、研究,通过发布文章、书籍、互动活动的形式积极推广软件技术。欢迎添加作者“michael_tec”,共同探讨IT技术话题。
|
2月前
|
存储 算法 Java
jvm性能优化(一)-基于JDK1.8
jvm性能优化(一)-基于JDK1.8
|
7天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
4月前
|
存储 Java 编译器
🔍深入Android底层,揭秘JVM与ART的奥秘,性能优化新视角!🔬
【7月更文挑战第28天】在Android开发中,掌握底层机制至关重要。从Dalvik到ART, Android通过采用AOT编译在应用安装时预编译字节码至机器码,显著提升了执行效率。ART还优化了垃圾回收,减少内存占用及停顿。为了优化性能,可减少DEX文件数量、优化代码结构利用内联等技术、合理管理内存避免泄漏,并使用ART提供的调试工具。
116 7
|
23天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
2月前
|
存储 Java 编译器
🔍深入Android底层,揭秘JVM与ART的奥秘,性能优化新视角!🔬
【9月更文挑战第12天】在Android开发领域,深入了解其底层机制对提升应用性能至关重要。本文详述了从早期Dalvik虚拟机到现今Android Runtime(ART)的演变过程,揭示了ART通过预编译技术实现更快启动速度和更高执行效率的奥秘。文中还介绍了ART的编译器与运行时环境,并提出了减少DEX文件数量、优化代码结构及合理管理内存等多种性能优化策略。通过掌握这些知识,开发者可以从全新的角度提升应用性能。
64 11
|
4月前
|
存储 监控 Java
揭秘Java虚拟机:探索JVM的工作原理与性能优化
本文深入探讨了Java虚拟机(JVM)的核心机制,从类加载到垃圾回收,再到即时编译技术,揭示了这些复杂过程如何共同作用于Java程序的性能表现。通过分析现代JVM的内存管理策略和性能监控工具,文章提供了实用的调优建议,帮助开发者有效提升Java应用的性能。
75 3
|
4月前
|
监控 算法 Java
深入理解Java虚拟机:内存管理与性能优化
在Java的世界里,虚拟机(JVM)是幕后的守护者,它默默地支撑着每一个字节码的运行。本文将揭开JVM的神秘面纱,探讨其内存管理机制及如何通过调优提升应用性能。从堆内存的分配到垃圾回收的策略,再到实践中的性能监控与调优技巧,我们将一同走进JVM的内部世界,学习如何让我们的Java程序跑得更快、更稳。
|
Arthas 监控 算法
JVM调优篇:探索Java性能优化的必备种子面试题
本文将带你深入了解JVM调优的重要性、常见问题以及一些实用的调优工具和方法,助你在面试的过程中轻松应对
190 0
JVM调优篇:探索Java性能优化的必备种子面试题
|
6月前
|
存储 算法 Java
深入解析Java虚拟机(JVM):技术原理与性能优化
深入解析Java虚拟机(JVM):技术原理与性能优化
91 1