当前位置:网站首页>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日志,看回收情况,如果每次都正常回收就代表系统压力太大了,
如果每次只回收一点点,那么代表出现内存泄漏了
边栏推荐
- YOLOv3详解:从零开始搭建YOLOv3网络
- 天鹰优化的半监督拉普拉斯深度核极限学习机用于分类
- What is the connection between GRNN, RBF, PNN, KELM?
- IoU, GIoU, DIoU and CIoU in target detection
- DenseNet详解及Keras复现代码
- 无监督特征对齐的迁移学习理论框架
- 【音视频开发系列】fdk_aac 之 PCM 转 AAC
- Database document generation tool V1.0
- 数据库实体类对应daoimpl,基础的增删改查。
- Prematurely reached end of stream
猜你喜欢
Nacos 原理
基于子空间结构保持的迁移学习方法MLSSM
VMD结合ISSA优化LSSVM功率预测
软件:给大家推荐一款国产非常好用的效率软件uTools
Interpretation of EfficientNet: Composite scaling method of neural network (based on tf-Kersa reproduction code)
网络技巧:教你给路由器装上电池,断电照样可以上网!
QT 出现多冲定义问题
基于时序模式注意力机制(TPA)的长短时记忆(LSTM)网络TPA-LSTM的多变量输入风电功率预测
Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
Memory limit should be smaller than already set memoryswap limit, update the memoryswap at the same
随机推荐
网络端口大全
桌面右键的NVIDIA去除与恢复
Visualization and Animation Technology (3D Visualization)
狗都能看懂的Vision Transformer的讲解和代码实现
数据库:整理四个实用的SQLServer脚本函数
【音视频开发系列】fdk_aac 之 PCM 转 AAC
杰哥带大家做一次meterpreter内网渗透模拟
Uos统信系统 CA根证书搭建
Gramm Angle field GAF time-series data into the image and applied to the fault diagnosis
Jackson 使用样例
你要悄悄学网络安全,然后惊艳所有人
ES6新语法:symbol,map容器
数据库实体类对应daoimpl,基础的增删改查。
无监督特征对齐的迁移学习理论框架
Memory Management
格拉姆角场GAF将时序数据转换为图像并应用于故障诊断
在线公众号文章内容转音频文件实用小工具
为什么不使用VS管理QT项目
golang 的库引用方法
解决腾讯云DescribeInstances api查询20条记录以上的问题