JVM调优
性能监控 -----》性能分析------》性能调优
# 1. 性能监控(发现问题)
具体问题 | 监控工具 |
---|---|
GC频繁 | jstat |
CPU占用过高 | jstat |
OOM | jmap |
内存泄露 | jmap |
死锁(线程) | jstack |
程序响应时间过长(线程) | jstack |
# 2. 命令行指令
- jps:查看正在运行的java进程
- jstat:可以持续监视虚拟机各种运行状态信息,包括类加载、内存、垃圾收集等运行时数据
- jmap:导出当前时刻的内存映像文件(dump二进制文件)和内存使用情况
- jstack:生成当前时刻的线程快照(线程正在执行的方法堆栈集合以及执行状态)
可视化工具:Visual VM
# 3. 评价指标
停顿时间
- 应用程序中指的是提交请求和返回请求的响应之间使用的时间;
- GC中指的是暂停工作线程的时间
吞吐量
- 单位时间内完成的工作量
- GC中指的是运行用户代码的时间占总运行时间的比例
# 4. 内存泄漏
定义
内存中一直存在,但是不再被使用的对象
- 静态集合类
public class Test {
// list即为静态集合类
static List<String> list = new ArrayList<>();
public void oomTest(){
String str = new String("test");
list.add(str);
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
长生命周期的对象(静态集合类)持有短生命周期的对象(例子中的局部对象)的引用,导致短生命周期的对象无法被回收
- 单例模式
与静态集合类的原因相似,如果单例对象持有外部对象的引用,导致外部对象也无法回收
- 连接未关闭
各种连接,如数据库连接、网络连接、文件流等,如果没有关闭,就会造成内存泄漏
- 变量不合理的作用域
变量定义的作用范围大于其使用范围,例如该变量只在某个方法内被使用,导致变量无法被回收(与对象的生命周期相同),造成内存泄漏
- 缓存泄露
把对象引用放入缓存中,容易被遗忘,尽管进行了GC,这些对象无法被回收,导致内存泄漏,解决方案:使用WeakHashMap代表缓存
编辑 (opens new window)
上次更新: 2024/12/28, 07:52:50