当前位置:网站首页>JVM调优实践
JVM调优实践
2022-08-04 05:35:00 【阿里巴巴首席技术官】
为什么要调优?
1. 根据需求进行JVM规划预调优
2. 优化当前jvm运行卡顿,慢
3. 解决运行过程中的OOM等异常
垃圾回收器的选择
响应实践优先的应用:jdk8使用CMS + ParNew,jdk8以后使用G1
-XX:+UseConcMarkSweepGC
CMS追求最短停顿时间
注意:CMS对处理器资源非常敏感,当核心数在4个及以上时使用。否则CMS会消耗很多处理器运算能力
相关参数
-XX:CMSInitiatingOccu-pancyFraction 设置老年代占了多少后触发CMS,默认92%
如果运气期间没有内存供程序使用 就会临时启动Serial Old垃圾收集器工作(停顿时间会变长)
-XX:CMSFullGCBeforeCompaction 设置执行若干次(参数配置)不整理空间的Full GC之后,下次FullGC前会先进行碎片整理
高吞吐量、后台运算不需要太多交互的分析任务、尽快完成计算任务、或处理器资源稀缺
使用高吞吐量收集器:paraller gc 和 paraller old
-XX:+UseParallelGC 新生代 -XX:+UseParallelOldGC 老年代
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收最长时间。
-XX:+UseAdaptiveSizePolicy:设置后,GC会自动选择年轻代大小和S0,S1比例。这个参数建议在使用并行收集器时,一直打开。
一、常用参数
-Xms1m 最小堆 -Xmx1m 最大堆 : 堆内存设置为 机器可用内存的70%~80%
-Xmn1m 新生代
最大堆和最小堆一般设置成一样的,避免内存由于自动扩容收缩造成性能影响
+XX:+HeapDumpOnOutOfMemoryError OOM时自动导出堆文件
+XX:+UseParallelGC 使用ParallelGCl垃圾收集器
日志
-XX:+PrintGCDetails 打印gc日志
-XX:+PrintGCDateStamps 打印日志时间戳
-XX:+PrintHeapAtGC gc时打印下前后堆内存情况
日志文件
-Xloggc:D:\log\gc\gc-%t.log 将gc日志存储在指定位置
-XX:+UseGCLogFileRotation 开启gc日志分割(避免单个gc文件太大)
-XX:NumberOfGCLogFiles=14 gc文件分割数量(如果超过则覆盖写)
-XX:GCLogFileSize=100M 单个gc日志文件大小(超过则新开文件)
二、GC日志解析
GC (Allocation Failure) 代表发生了一次GC,括号内是GC发生原因
- Allocation Failure:代表新生代中没有足够的区域能够存放需要分配的数据而失败
[PSYoungGen: 131072K->15779K(152576K)]
- PSYoungGen 代表GC发生的区域,不同垃圾收集器有不同的名称
- 131072K->15779K(152576K) gc之前的大小 -> gc之后的大小(总大小)
新生代由于使用复制算法,survivor同时只会使用一块区域,另一块空着,所以总大小只计算一块的
三、GC分析工具
实际场景gc日志很大,我们不可能靠自己肉眼一条条分析,所以需要依靠分析工具
常用的工具有gceasy, gc-viewer
四、一次调优过程
首先jps查出程序的进程id
然后jinfo pid 查看程序详细信息(查看jvm启动参数)
然后jstat -gc pid [time(ms)] 查看当前gc各个区域的使用情况
然后输入linux的top 查看当前耗费系统资源的进程
使用jstack pid 查看当前进行线程情况
使用jmap -histo pid 查看内存中对象数量、对象占用内存情况
使用jmap -dump:format=b,file=20220515.hprof pid 导出整个堆文件(堆转储)可使用mat、jprofile、jhat、java visualVM应用分析
堆转储方式
线上正在运行的程序不可用直接使用jmap导出,会造成stw
1. 使用+XX:+HeapDumpOnOutOfMemoryError 导出的文件
2. 如果程序有多个集群,可以先停掉一个服务,专门进行导出
3. 测试环节 压测时 可以直接导出
OOM问题
最好提前压测出来这个问题
解决思路:堆转储文件,使用mat工具分析对象次数、占用大小。分析程序相关代码解决问题
可以使用阿里的arthas工具
真实的压测
使用tcp copy拷贝真实的请求
CPU飙高,如何解决
使用top命令查看吃cpu的进程
如果是Java进程就使用Arthas工具查看占用最高的线程
如果这个线程是业务线程,那就是代码出问题了
如果是GC线程,就看gc日志,看回收情况,如果每次都正常回收就代表系统压力太大了,
如果每次只回收一点点,那么代表出现内存泄漏了
边栏推荐
- 叔本华的《人生的智慧》感悟
- golang 坐标格式 转换 GCJ02ToWGS84
- 为什么不使用VS管理QT项目
- RuntimeError: You called this URL via POST, but the URL doesn‘t end in a slash and you have APPEND_S
- Network skills: teach you to install batteries on the router, you can still surf the Internet when the power is cut off!
- golang chan
- DenseNet详解及Keras复现代码
- 数据库JDBC DAO层方法
- 狗都能看懂的Pytorch MAML代码详解
- 复杂格式的json转递
猜你喜欢
随机推荐
怎样才能转行成功?
Visualization and Animation Technology (VR System)
更改软件的默认安装位置
QT 显示窗口到最前面(非置顶)
golang 坐标格式 转换 GCJ02ToWGS84
IE8 打开速度慢的解决办法
mysql月份比較是否相等
IDEA 控制台 中文乱码问题(如果网上教程都无法解决你的问题的话)
事件链原理,事件代理,页面的渲染流程,防抖和节流,懒加载和预加载
CMDB 腾讯云部分实现
Uos统信系统 chrony配置
网络端口大全
Uos统信系统控制台欢迎登陆后消息及所处区域配置
golang chan
Faster RCNN原理及复现代码
升级到 MediaPlayer 11 时跳过验证副本的方法
网络技巧:教你给路由器装上电池,断电照样可以上网!
Computer software: recommend a disk space analysis tool - WizTree
Software: Recommend a domestic and very easy-to-use efficiency software uTools to everyone
基于EEMD+GRU+MLR的时间序列预测








