java程序内存分析
java程序内存分析
飓风2000 发表于3个月前
java程序内存分析
  • 发表于 3个月前
  • 阅读 12
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

1.问题描述:

一个java应用经过某种触发,CPU高,内存高。

2.分析过程:

进程编号pid=3203

(一)java进程中的线程栈信息分析

a.首先通过jstack命令查看java进程中各个线程的栈信息

jstack 3203 >1.txt     导出到1.txt文件待用

b.首先通过top -H -p pid 分析出java进程中占用cpu高的线程号

 top -H -p 3203

c.获取到占用cpu高的线程编号,转换成为16进制

d.在1.txt文件中查找线程编号

e.第一个结论,导致CPU高的是GC线程。

(二)java虚拟机在不断的做GC,这就意味着内存出现了泄露。重点导向了内存分析

a.通过jmap -histo 3203 进行进程内存分析,发现内存占用有1个G,确实很高

b.通过jmap -dump:file=/home/unilife/dump.txt 3203  生成内存信息文件dump.txt

c.由于dump.txt文件很大,使用jhat dump.txt 无法启动,于是改变方法,将dump.txt下载到本地处理

d.通过ftp将dump.txt下载到本地,下载eclipse mat,下载地址:http://www.eclipse.org/mat/

e.修改eclipse map的启动jvm大小,修改文件MemoryAnalyzer.ini,变更参数  -Xmx4024m

f.打开eclipse mat ,加载dump.txt文件

通过跟踪stack查看是哪里出了问题?

 

 

看看是什么占用类内存(通常都是我们没有控制好集合容器),看看下图吧

 

罪魁祸首是不是在这里呢??

看一个样本:

看看好吓人,这个arraylist里面居然有4843970个内容???

 

再看看一个样本:

这个mongo查询结果又31039,难道没有分页??

 

根据mat工具分析出占用内存的业务数据,可以很快定位到代码功能,进行代码级别的分析并定位问题。

总结:

两个要点:

1.根据stack定位到可以线程的可以方法

2.根据内存对象数量分析,明确导致内存高的业务数据

 

 

 

共有 人打赏支持
粉丝 30
博文 216
码字总数 118386
×
飓风2000
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: