当前位置:网站首页>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
边栏推荐
- ECCV 2022 | Towards Data Efficient Transformer Object Detectors
- 华为再发「天才少年」召集令!曾放弃360万年薪的他也来首秀
- This editor actually claims to be as fast as lightning!
- How to use Databricks for data analysis on TiDB Cloud | TiDB Cloud User Guide
- v-model组件化编程应用
- Flask框架——Flask-SQLite数据库
- 惊艳!京东T8纯手码的Redis核心原理手册,基础与源码齐下
- Huawei's 7-year-experienced software testing director, gives some advice to all friends who want to change careers to learn software testing
- 三电系统集成技术杂谈
- MongoDB启动报错 Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)
猜你喜欢

5. DOM

打破原则引入SQL,MongoDB到底想要干啥?

八年测试经验,为何惨遭领导痛批:你写的测试文档还不如刚来的应届生

接口自动化框架,lm-easytest内测版发布,赶紧用起来~

DDS Arbitrary Waveform Output Based on FPGA

基于FPGA的DDS任意波形输出

JUC common thread pool source learning 02 ( ThreadPoolExecutor thread pool )

四大首搭加持,美学、安全、操控、效率优势明显,比亚迪海豹售价20.98万元起售!

MongoDB启动报错 Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)

跳槽前,把自己弄成卷王
随机推荐
【回归预测-lssvm分类】基于最小二乘支持向量机lssvm实现数据分类代码
Start learning C language
MaxWell scraped data
What is defect analysis?An article takes you to understand the necessary skills of test engineers
超T动力 盈运天下——中国重汽黄河/豪沃WP14T产品首发荣耀上市!
Get the Google Advertising ID as a unique identifier
Understand Chisel language. 28. Chisel advanced finite state machine (2) - Mealy state machine and comparison with Moore state machine
The main content of terrain analysis (the special effect level of the wandering earth)
去腾讯面试,直接让人出门左拐 :幂等性都不知道!
智能合约安全——私有数据访问
自动化办公|办公软件和亿图脑图MindMaster快捷键
ddl and dml in sql (the difference between sql and access)
记面试外包公司的一次经历,到底该不该去?
新一代开源免费的终端工具,太酷了
The truth of the industry: I will only test those that have no future, and I panic...
LeetCode_98_验证二叉搜索树
DDS Arbitrary Waveform Output Based on FPGA
手把手教你写让人眼前一亮的软件测试简历,收不到面试邀请算我输
MaxWell抓取数据
基于5G的仓储信息化解决方案2022