文档章节

java程序内存分析

飓风2000
 飓风2000
发布于 2017/09/12 11:37
字数 512
阅读 37
收藏 0

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.根据内存对象数量分析,明确导致内存高的业务数据

 

 

 

© 著作权归作者所有

共有 人打赏支持
飓风2000
粉丝 29
博文 251
码字总数 130880
作品 0
浦东
高级程序员
java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat使用

基于Sun HotSpot JVM 这里将介绍几款sun hotspot jvm 自带的监控工具: 请确保java_home/bin配置到path环境变量下,因为这些工具都在jdk的bin目录下 jps(JVM Process Status Tool):JVM机进程...

我类个擦
2014/09/12
0
1
常用Java性能测试工具的分析与对比

虽然市场上的 Java Profiler 工具有不少,但是基本功能大多相似,本节首先对这些基本功能进行介绍。 遥测(Telemetry):遥测是一种用来查看应用程序运行行为的最简单的方法。通常会有多个视...

lanmeimei
2014/03/18
0
0
线上应用故障排查之二:高内存占用

搞Java开发的,经常会碰到下面两种异常: 1、java.lang.OutOfMemoryError: PermGen space 2、java.lang.OutOfMemoryError: Java heap space 要详细解释这两种异常,需要简单重提下Java内存模...

MZHS
2015/11/13
0
0
Java执行Runtime.exec(shell)报Cannot allocate memory

在Linux下用java的Runtime.getRuntime().exec(cmd)方式,执行shell脚本时,遇到“Cannot allocate memory”的错误。 网上查询资料整理如下: Cannot allocate memory 在Linux上调试一个比较复...

山哥
2014/06/05
0
0
Java GC系列:Java垃圾回收详解

Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。 ...

满风
2015/04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 使用 Fail2Ban 来限制登录尝试

什么是 Fail2Ban? 我们需要在我们网站中防止密码的暴利破解。Fail2Ban 是一个 Python 的应用来查看日志文件,使用的是正则表达式,同时还可以与Shorewall (或者 iptables)直接工作来来启用...

honeymose
3分钟前
0
0
日期和时间API - 读《Java 8实战》

日期与时间 LocalDate 创建一个LocalDate对象并读取其值 // 根据年月日创建日期LocalDate date1 = LocalDate.of(2014, 3, 18);// 读取System.out.println(date1.getYear()); // 2014Sys...

yysue
3分钟前
0
0
8月15日任务

8月15日任务 Memcached命令行 • telnet 127.0.0.1 11211 • set key2 0 30 2 ab STORED get key2 VALUE key2 0 2 ab END 实例: [root@localhost 02]# telnet 127.0.0.1 11211-bash: te......

寰宇01
16分钟前
0
0
LNMP架构(Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间)

Nginx访问日志 1.打开配置文件,搜索log_format vim /usr/local/nginx/conf/nginx.conf 2.访问日志常用变量含义 $remote_addr : 客户端IP(公网IP) $http_x_forwarded_for : 代理服务器的IP ...

蛋黄_Yolks
16分钟前
0
0
lombok 不用再写pojo的getset

java实体类不写get/set方法 1、下载地址https://projectlombok.org/download Myeclipse、eclipse安装lombok Lombok是一种Java实用工具,可以帮助开发人员消除Java的冗长,具体看lombok的官网...

木之下
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部