当前位置: 首页 > news >正文

JVM调优工具详解

JVM调优工具详解

一、前置准备

  1. 启动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 -gcGC统计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

诊断过程

  1. 通过jstat发现对象晋升过快:
jstat -gc <pid> 300000 10  # 每5分钟采样
  1. jmap分析大对象:
jmap -histo <pid> | grep com.tuling.jvm.User
  1. 定位到问题代码:
// 每次查询创建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;
}

优化方案

  1. 增加年轻代大小避免过早晋升:
-Xmn1024M  // 年轻代扩容至1G
  1. 修复代码:分页查询/对象复用
  2. 缓存框架替代HashMap(防内存泄漏)

七、JVM优化思路总结

  1. 年轻代调优原则

    • 存活对象 < Survivor区50%
    • 根据jstat -gc的EU估算对象增长速率
    • 计算Young GC频率:Eden大小 / 对象增速
  2. Full GC预防

    -XX:CMSInitiatingOccupancyFraction=92  // 提高CMS触发阈值
    -XX:+DisableExplicitGC               // 禁止System.gc()
    
  3. 内存泄漏排查

    • 定期用jmap对比Histogram
    • 关注Finalizer队列积累
    • 避免过大的缓存(采用LRU淘汰策略)

通过jvisualvm远程监控配置:
java -Dcom.sun.management.jmxremote.port=8888 -Djava.rmi.server.hostname=ip -jar app.jar

http://www.dtcms.com/a/315028.html

相关文章:

  • 把“距离过近”的节点(或端点)合并成一个,避免重复。机器学习 python
  • web:ts元组
  • 【RH124知识点问答题】第8章 监控和管理 Linux 进程
  • Bean的生命周期和循环依赖问题的解决
  • 防火墙认证用户部署
  • 开发规范(一)移动端
  • 多线程(一)
  • 【C#】操作Execl和Word文件-1
  • 子词分词器(Byte Pair Encoding + WordPiece)
  • 如何给Word和WPS文档添加密码或取消密码
  • 【Java】使用FreeMarker来实现Word自定义导出
  • 反转字符串中的元音字母:Swift 双指针一步到位
  • EXPLAIN工具:查询执行计划分析与索引诊断
  • 【数据结构】排序(sort) -- 插入排序
  • 如何设置端口映射?防火墙/路由器/纯软件工具多种常用方案步骤,确保任意内网ip端口映射公网访问到
  • 《汇编语言:基于X86处理器》第11章 复习题和练习
  • RocketMQ与Kafka 消费者组的‌重平衡操作消息顺序性对比
  • Hadoop MapReduce 3.3.4 讲解~
  • Linux系统编程-文件操作(黑马笔记)
  • 基于Springboot+Mybatis+thymeleaf的个人博客系统的设计与实现
  • EXCEL删除数据透视表
  • 洛谷 P3373 【模板】线段树 2- 普及+/提高
  • C# 类型
  • 基于PSO-NSGAIII混合优化的生产调度算法matlab仿真,输出甘特图,对比PSO和NSGAIII
  • traefik网关鉴权中间件转发multipart/form-data请求的multipart: NextPart: EOF问题
  • 09 Linux基础(8.4)
  • (一)vue3项目初始化(create-vue)
  • 构建属于自己的第一个 MCP 服务器:初学者教程
  • web:ts的字符串string和String
  • Flutter简单讲解