当前位置:网站首页>JVM性能调优
JVM性能调优
2022-07-30 14:24:00 【qq_41482600】
1、性能调优
架构调优、代码调优、JVM调优、数据库调优、操作系统调优等
架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的
2、何时进行JVM调优
- Heap内存(老年代)持续上涨达到设置的最大内存值;
- Full GC 次数频繁;
- GC 停顿时间过长(超过1秒);
- 应用出现OutOfMemory等内存异常;
- 应用中有使用本地缓存且占用大量内存空间;
- 系统吞吐量与响应性能不高或不降;
3、JVM调优的基本原则
- 大多数的Java应用不需要进行JVM优化;
- 大多数导致GC问题的原因是代码层面的问题导致的(代码层面);
- 上线之前,应先考虑将机器的JVM参数设置到最优;
- 减少创建对象的数量(代码层面);
- 减少使用全局变量和大对象(代码层面);
- 优先架构调优和代码调优,JVM优化是不得已的手段(代码、架构层面);
- 分析GC情况优化代码比优化JVM参数更好(代码层面)
其实最有效的优化手段是架构和代码层面的优化,而JVM优化则是最后不得已的手段,也可以说是对服务器配置的最后一次“压榨”
4、JVM调优目标
目的都是为了令应用程序使用最小的硬件消耗来承载更大的吞吐。JVM调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量,总结以下:
- 延迟:GC低停顿和GC低频率;
- 低内存占用;
- 高吞吐量。
5、JVM调优量化目标
- Heap 内存使用率 <= 70%;
- Old generation 内存使用率 <= 70%;
- avgpause <= 1秒;
- Full GC 次数 0 或 avg pause interval >= 24小时。
6、JVM调优的步骤
- 分析GC日志及dump文件,判断是否需要优化,确定瓶颈问题点;
- 确定JVM调优量化目标;
- 确定JVM调优参数(根据历史JVM参数来调整);
- 依次调优内存、延迟、吞吐量等指标;
- 对比观察调优前后的差异;
- 不断的分析和调整,直到找到合适的JVM参数配置;
- 找到最合适的参数,将这些参数应用到所有服务器,并进行后续跟踪。
7、VM参数解析及调优
-Xmx4g
–Xms4g
–Xmn1200m
–Xss512k
-XX:NewRatio=4
-XX:SurvivorRatio=8
-XX:PermSize=100m
-XX:MaxPermSize=256m
-XX:MaxTenuringThreshold=15
- -Xmx4g:堆内存最大值为4GB。
- -Xms4g:初始化堆内存大小为4GB。
- -Xmn1200m:**设置年轻代大小为1200MB。**增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
- -Xss512k:**设置每个线程的堆栈大小。**JDK5.0以后每个线程堆栈大小为1MB,以前每个线程堆栈大小为256K。应根据应用线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
- -XX:NewRatio=4:**设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。**设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
- -XX:SurvivorRatio=8:**设置年轻代中Eden区与Survivor区的大小比值。**设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
- -XX:PermSize=100m:初始化永久代大小为100MB。
- -XX:MaxPermSize=256m:设置持久代大小为256MB。
- -XX:MaxTenuringThreshold=15:**设置垃圾最大年龄。**如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
可调优参数:
- -Xms:初始化堆内存大小,默认为物理内存的1/64(小于1GB)。
- -Xmx:**堆内存最大值。**默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
- -Xmn:新生代大小,包括Eden区与2个Survivor区。
- -XX:SurvivorRatio=1:Eden区与一个Survivor区比值为1:1。
- -XX:MaxDirectMemorySize=1G:**直接内存。**报java.lang.OutOfMemoryError: Direct buffer memory异常可以上调这个值。
- -XX:+DisableExplicitGC:禁止运行期显式地调用System.gc()来触发fulll GC。
- 注意: Java RMI的定时GC触发机制可通过配置-Dsun.rmi.dgc.server.gcInterval=86400来控制触发的时间。
- -XX:CMSInitiatingOccupancyFraction=60:老年代内存回收阈值,默认值为68。
- -XX:ConcGCThreads=4:CMS垃圾回收器并行线程线,推荐值为CPU核心数。
- -XX:ParallelGCThreads=8:新生代并行收集器的线程数。
- -XX:MaxTenuringThreshold=10:**设置垃圾最大年龄。**如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
- -XX:CMSFullGCsBeforeCompaction=4:指定进行多少次fullGC之后,进行tenured区 内存空间压缩。
- -XX:CMSMaxAbortablePrecleanTime=500:当abortable-preclean预清理阶段执行达到这个时间时就会结束。
8、内存调优示例
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
- java heap:参数-Xms和-Xmx,建议扩大至3-4倍FullGC后的老年代空间占用。
- 永久代:-XX:PermSize和-XX:MaxPermSize,建议扩大至1.2-1.5倍FullGc后的永久代空间占用。
- 新生代:-Xmn,建议扩大至1-1.5倍FullGC之后的老年代空间占用。
- 老年代:2-3倍FullGC后的老年代空间占用。
-Xms373m -Xmx373m //4*93=372 -Xmn140m //1.5*93=139.5 -XX:PermSize=5m -XX:MaxPermSize=5m //1.5*3=4.5
边栏推荐
- CVE-2022-33891 Apache Spark 命令注入复现
- ROS 导航
- 华为7年经验的软件测试总监,给所有想转行学软件测试的朋友几点建议
- Teach you how to write an eye-catching software testing resume, if you don't receive an interview invitation, I will lose
- A new generation of open source free terminal tools, so cool
- Six-faced ant financial clothing, resisting the bombardment of the interviewer, came to interview for review
- Recommended open source tools: MegPeak, a high-performance computing tool
- Chapter6 : Has Artificial Intelligence Impacted Drug Discovery?
- Flink optimization
- Flink实时数仓完结
猜你喜欢

71-page comprehensive overall solution for global tourism 2021 ppt

Flink optimization

【回归预测-lssvm分类】基于最小二乘支持向量机lssvm实现数据分类代码

新一代开源免费的终端工具,太酷了

SLF4J的使用

吃透Chisel语言.28.Chisel进阶之有限状态机(二)——Mealy状态机及与Moore状态机的对比

Flask框架——Flask-Mail邮件

DocuWare 文件管理与工作流程自动化案例研究——DocuWare 工作流程功能使在家工作的员工能够保持沟通和高效工作,支持混合环境

桌面软件开发框架大赏

00后测试员摸爬滚打近一年,为是否要转行或去学软件测试的学弟们总结出了以下走心建议
随机推荐
5. DOM
The truth of the industry: I will only test those that have no future, and I panic...
【元胞自动机】基于元胞自动机模拟生命演化、病毒感染等实例附matlab代码
ddl and dml in sql (the difference between sql and access)
Flink optimization
去腾讯面试,直接让人出门左拐 :幂等性都不知道!
The use of ccs software (app software that makes money reliably)
MongoDB启动报错 Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)
MaxWell抓取数据
使用 protobuf 进行数据序列化
2022年,目前大环境下还适合转行软件测试吗?
Remember an experience of interviewing an outsourcing company, should you go?
华为无线设备Mesh配置命令
Digital signal processing course lab report (what foundation is needed for digital signal processing)
Hello, World
DocuWare 文件管理与工作流程自动化案例研究——DocuWare 工作流程功能使在家工作的员工能够保持沟通和高效工作,支持混合环境
v-model组件化编程应用
This editor actually claims to be as fast as lightning!
如何在 TiDB Cloud 上使用 Databricks 进行数据分析 | TiDB Cloud 使用指南
Understand the Chisel language. 29. Chisel advanced communication state machine (1) - communication state machine: take the flash as an example