网站首页 > java教程 正文
一、问题描述:
一个java应用经过某种触发,CPU高,内存高。
二、分析过程:
进程编号pid=3203
(一)java进程中的线程栈信息分析
1.首先通过jstack命令查看java进程中各个线程的栈信息
jstack 3203 >1.txt 导出到1.txt文件待用
2.首先通过top -H -p pid 分析出java进程中占用cpu高的线程号
top -H -p 3203
3.获取到占用cpu高的线程编号,转换成为16进制
4.在1.txt文件中查找线程编号
5.第一个结论,导致CPU高的是GC线程。
(二)java虚拟机在不断的做GC,这就意味着内存出现了泄露。重点导向了内存分析
1.jmap -histo 3203 进行进程内存分析,发现内存占用有1个G,确实很高
2.jmap -dump:file=/home/*/dump.txt 3203 生成内存信息文件dump.txt
3.由于dump.txt文件很大,使用jhat dump.txt 无法启动,于是改变方法,将dump.txt下载到本地处理
4.通过ftp将dump.txt下载到本地,下载eclipse mat,下载地址:
http://www.eclipse.org/mat/
5.修改eclipse map的启动jvm大小,修改文件MemoryAnalyzer.ini,变更参数 -Xmx4024m
6.打开eclipse mat ,加载dump.txt文件
通过跟踪stack查看是哪里出了问题?
看看是什么占用类内存(通常都是我们没有控制好集合容器),看看下图吧
罪魁祸首是不是在这里呢??
看一个样本:
看看好吓人,这个arraylist里面居然有4843970个内容???
再看看一个样本:
这个mongo查询结果又31039,难道没有分页??
根据mat工具分析出占用内存的业务数据,可以很快定位到代码功能,进行代码级别的分析并定位问题。
总结:
两个要点:
1.根据stack定位到线程的方法
2.根据内存对象数量分析,明确导致内存高的业务数据
猜你喜欢
- 2025-10-14 看完这篇文,别再说你不懂Java内存模型了!
- 2025-10-14 Java volatile关键字深度解析:多线程编程的"内存屏障"神器
- 2025-10-14 Java内存模型JMM重要知识点_java内存模型有哪些
- 2025-10-14 Java 内存模型与并发编程中的可见性、原子性、有序性有啥关联
- 2025-10-14 让我们深入了解有关Java内存泄漏的10件事情
- 2025-10-14 Java中的volatile与操作系统的内存重排详解
- 2025-10-14 Java内存模型的历史变迁_java内存模型原理
- 2025-10-14 Kubernetes 下 Java 应用内存调优实战指南
- 2025-10-14 java使用NMT Native Memory Tracking分析内存占用
- 2025-10-14 【java面试100问】03 在生产环境上,发现内存泄漏问题,如何排查?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)