WordPress知更鸟主题怎样安装seo专业优化公司
JVM调优工具详解
一、前置准备
- 启动Web应用后,用
jps查看进程ID:
jps -l
二、Jmap工具详解
1. 内存分析
jmap -heap <pid> # 查看堆内存配置
输出关键字段说明:
NewRatio:新生代/老年代比例SurvivorRatio:Eden/Survivor比例MetaspaceSize:元空间初始大小
2. 堆Dump生成
jmap -dump:format=b,file=heap.hprof <pid>
自动导出Dump配置(添加JVM参数):
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
3. 内存泄漏分析
使用jvisualvm分析Dump文件:
- 查看大对象:
char[]、String常驻内存 - 对比多个Dump文件发现异常增长对象
三、Jstack死锁检测
1. 死锁示例代码
public class DeadLockTest {private static Object lock1 = new Object();private static Object lock2 = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (lock1) {Thread.sleep(5000);synchronized (lock2) { // 此处发生死锁 }}}).start();new Thread(() -> {synchronized (lock2) {Thread.sleep(5000);synchronized (lock1) { // 此处发生死锁 }}}).start();}
}
2. 检测命令
jstack <pid> | grep -A 20 "deadlock"
输出特征:
"Thread-1" prio=5 tid=0x000000001fa9e000 nid=0x2d64 java.lang.Thread.State: BLOCKED
3. 可视化检测
使用jvisualvm的线程分析功能自动检测死锁
四、Jstat监控工具
1. 核心命令格式
jstat -<option> <pid> [interval] [count]
2. 常用监控项
| 命令 | 说明 | 关键指标 |
|---|---|---|
jstat -gc | GC统计 | YGC/YGCT(年轻代GC次数/耗时) |
jstat -gccapacity | 堆内存统计 | OC/OU(老年代容量/使用量) |
jstat -gcmetacapacity | 元空间统计 | MC/MU(元空间容量/使用量) |
五、Jinfo参数查看
jinfo -flags <pid> # 查看JVM参数
jinfo -sysprops <pid> # 查看系统参数
六、调优实战案例
场景:频繁Full GC
现象:
- 2核4G服务器,7天内Full GC 500+次(200+秒)
- Young GC 1万+次(500+秒)
原JVM配置:
-Xms1536M -Xmx1536M -Xmn512M
-XX:SurvivorRatio=6
-XX:+UseConcMarkSweepGC
诊断过程:
- 通过
jstat发现对象晋升过快:
jstat -gc <pid> 300000 10 # 每5分钟采样
jmap分析大对象:
jmap -histo <pid> | grep com.tuling.jvm.User
- 定位到问题代码:
// 每次查询创建5000个User对象
private ArrayList<User> queryUsers() {ArrayList<User> users = new ArrayList<>();for (int i = 0; i < 5000; i++) {users.add(new User(i, "zhuge")); // 产生500MB+对象}return users;
}
优化方案:
- 增加年轻代大小避免过早晋升:
-Xmn1024M // 年轻代扩容至1G
- 修复代码:分页查询/对象复用
- 缓存框架替代HashMap(防内存泄漏)
七、JVM优化思路总结
-
年轻代调优原则:
- 存活对象 < Survivor区50%
- 根据
jstat -gc的EU估算对象增长速率 - 计算Young GC频率:
Eden大小 / 对象增速
-
Full GC预防:
-XX:CMSInitiatingOccupancyFraction=92 // 提高CMS触发阈值 -XX:+DisableExplicitGC // 禁止System.gc() -
内存泄漏排查:
- 定期用
jmap对比Histogram - 关注
Finalizer队列积累 - 避免过大的缓存(采用LRU淘汰策略)
- 定期用
通过
jvisualvm远程监控配置:
java -Dcom.sun.management.jmxremote.port=8888 -Djava.rmi.server.hostname=ip -jar app.jar
