如题,我这里简单说下我现在离线分析java内存的方式,所谓离线,就是需要dump出正在运行的java系统中的一些运行时堆栈数据,然后拿到线下来分析,分析可以包括内存,线程,GC等等,同时不会对正在运行的生产环境的机器造成很大的影响,对应着离线分析,当然是在线分析了,这个我在后面会尝试下,因为离线分析有些场景还是模拟不出来,需要借助LR来模拟压力,查看在线的java程序运行情况了。
首先一个简单的问题,如何dump出java运行时堆栈,这个SUN就提供了很好的工具,位于JAVA_HOME/bin目录下的jmap(java memory map之意),如果需要dump出当前运行的java进程的堆栈数据,则首先需要获得该java进程的进程ID,在linux下可以使用
ps -aux
ps -ef | grep java
或者使用jdk自带的一个工具jps,例如
/JAVA_HOME/bin/jps
找到了当前运行的java进程的id后,就可以对正在运行的java进程使用jmap工具进行dump了,例如使用以下命令:
JAVA_HOME/bin/jmap -dump:format=b,file=heap.bin <pid>
其中file = heap.bin的意思是dump出的文件名叫heap.bin, 当然你可以选择你喜欢的名字,我这里选择叫*.bin是为了后面使用方便,<pid>表示你需要dump的java进程的id。
这里需要注意的是,记住dump的进程是java进程,不会是jboss的进程,weblogic的进程等。dump过程中机器load可能会升高,但是在我这里测试发现load升的不是特别快,同时dump时需要的磁盘空间也比较大,例如我这里测试的几个系统,分别是500M 800M 1500M 3000M,所以确保你运行jmap命令时所在的目录中的磁盘空间足够,当然现在的系统磁盘空间都比较大。
以上是在java进程还存活的时候进行的dump,有的时候我们的java进程crash后,会生成一个core.pid文件,这个core.pid文件还不能直接被我们的java 内存分析工具使用,需要将其转换为java 内存分析工具可以读的文件(例如使用jmap工具dump出的heap.bin文件就是很多java 内存分析工具可以读的文件格式)。将core.pid文件转换为jmap工具dump出的文件格式还可以继续使用jmap工具,这个的说明可以见我前几篇中的一个转载(Create Java heapdumps
with the help of core dumps
),这里我在补充点
jmap -heap:format=b [java binary] [core dump file]
64位下可以指定使用64位模式
jmap -d64 -dump:format=b [java binary] [core dump file]
需要说明一下,使用jmap转换core.pid文件时,当文件格式比较大时,可能大于2G的时候就不能执行成功(我转换3G文件大小的时候没有成功)而报出
Error attaching to core file: Can't
attach to the core
file
查过sun的bug库中,这个bug还没有被修复,我想还是由于32位下用户进程寻址大小限制在2G的范围内引起的,在64位系统和64位jdk版本中,转换3G文件应该没有什么大的问题(有机会有环境得需要测试下)。如果有兴趣分析jmap转换不成功的同学,可以使用如下命令来分析跟踪命令的执行轨迹,例如使用
strace jmap -heap:format=b [java binary] [core dum
p]
对于strace的命令的说明,同样可以参考我前几篇文章中的一个 strace命令用法
同时对于core.pid文件的调试我也补充一下, 其中>>表示命令提示符
>>gdb JAVA_HOME/bin/java core.pid
>>bt
bt后就可以看到生成core.pid文件时,系统正在执行的一个操作,例如是哪个so文件正在执行等。
好了说了这么多,上面都是怎么生成java 运行期DUMP文件的,接下来我们就进入分析阶段,为了分析这个dump出的文件,需要将这个文件弄到你的分析程序所在的机器上,例如可以是windows上,linux上,这个和你使用的分析工具以及使用的操作系统有关。不管使用什么系统,总是需要把生产环境下打出的dump文件搞到你的分析机器上,由于dump出的文件经常会比较大,例如达到2G,这么大的文件不是很好的从生产环境拉下来,因此使用FTP的方式把文件拖到分析机器上,同时由于单个文件很大,因此为了快速的将文件下载到分析机器,我们可以使用分而治之的思想,先将文件切割为小文件下载,然后在合并为一个大文件即可,还好linux提供了很方便的工具,例如使用如下命令
$ split -b 300m heap.bin
$ cat x* > heap.bin
在上面的 split 命令行中的 “300m” 表示分割后的每个文件为 300MB,“heap.bin” 为待分割的dump文件,分割后的文件自动命名为 xaa,xab,xac等
cat 命令可将这些分割后的文件合并为一个文件,例如将所有x开头的文件合并为heap.bin
如果我们是利用一个中间层的FTP服务器来保存数据的,那么我们还需要连接这个FTP服务器把合并后的文件拉下来,在windows下我推荐使用一个工具,速度很快而且简单,
winscp
http://winscp.net/eng/docs/lang:chs
好了分析的文件终于经过一翻周折到了你的分析机器上,现在我们就可以使用分析工具来分析这个dump出的程序了,这里我主要是分析内存的问题,所以我说下我选择的内存分析工具,我这里使用的是开源的由SAP 和IBM 支持的一个内存分析工具
Memory Analyzer (MAT)
http://www.eclipse.org/mat/
我建议下载 Stand-alone Eclipse RCP 版本,不要装成eclipse的插件,因为这个分析起来还是很耗内存。
下载好了,解压开来就可以直接使用了(基于eclipse的),打开以后,在菜单栏中选择打开文件,选择你刚刚的dump文件,然后一路的next就可以了,最后你会看到一个报告,这个报告里会告诉你可能的内存泄露的点,以及内存中对象的一个分布,关于mat的使用请参考官方说明,当然你也可以自己徜徉在学习的海洋中
。
对于dump文件的分析还可以使用jdk中提供的一个jhat工具来查看,不过这个很耗内存,而且默认的内存大小不够,还需要增加参数设置内存大小才能分析出,不过我看了下分析出的结果不是很满意,而且这个用起来很慢。还是推荐使用mat
。
分享到:
相关推荐
ibm HeapAnalyzer java内存分析工具 官网很难打开,好不容易下载的jar包,这里分享出来 java -jar -Xmx3000m ha457.jar
JVM内存dump分析工具MAT独立安装包,分析内存溢出利器,可以准确定位内存异常原因,解决问题,MemoryAnalyzer-1.10.0.20200225.zip
借助第三方工具进行内存分析,找出导致内存泄露的具体代码段。 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助...它能够离线分析dump的文件数据。
1.0 Beta2版本支持C/C++、Pascal、C#、JAVA; *出题模式 可以在有标准输入数据和标准程序的情况下,由系统产生标准输出数据,并可批量保存,同时自动命名标准输出数据的后缀; *文本高亮对比 在判题后,可以...
它能够离线分析dump的文件数据。 四 MAT操作流程 1先调用jdk的工具得到heap使用情况 我安装的是jdk1.6 C:/>java -version java version "1.6.0_11" Java(TM) SE Runtime Environment (build 1.6.0_11-b03) Java...
⼤数据技术 ⼤数据技术——数据处理和分析 数据处理和分析 ⼤数据技术 ⼤数据技术——数据处理和分析 数据处理和分析 场景:数据清洗,数据规范化,统计分析等。 1. 实时处理 实时处理 对于实时数据及时处理,并输出...
管理员可以实时查看设备的在线/离线状态、CPU、内存利用率等信息,及时发现设备故障或异常情况。 网络安全检测:检测局域网内的网络安全漏洞和攻击行为,包括端口扫描、入侵检测等。通过实时警报或日志记录的方式...
结合其广泛的几何和空间功能集,内存中的地图数据结构和基本的机器学习功能,它是可扩展的基于位置的服务和地图上的时空数据分析的通用基础。 它设计用于并行和分布式系统,因此,它包括一个独立的地图匹配服务器,...
产品特点玩家ping 离线Java版本检查器线程安全检查有关设置的许多详细信息,例如硬件(磁盘,处理器等)以及有关操作系统的信息样本CPU使用率分析内存使用情况访问正在运行的线程的Stacktrace 每秒显
离线数据分析 实时数据分析 Scala函数式编程 Spark内存计算 机器学习增强 离线部分课程主要包括:hadoop、hive、flume、azkban、hbase等以及项目实战 实时部分课程主要包括:storm、kafka、redis以及项目实战 内存...
第二阶段(离线报表)(1)用户订单入oracle数据库,(2)通过sqoop把数据导入hadoop上。(3)使用mr和rdd对hadoop上的原始订单做etl清洗(4)建立hive表和sparkSQL内存表。为后期分析做基础(5)使用HQL实现业务指标分析,和...
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ServerBootFrame extends JFrame { /** * */ private static final long serialVersionUID = 1L; JPanel jp = new ...
java版飞机大战源码 目录(善用Ctrl+F) 注 : 没链接的是还没写 :hot_beverage: 各类知识点总结 下面的文章都有对应的原创精美PDF,在持续更新中,可以来找我催更~ ...ODPS离线分析 Hive Spark Hadoop :lollipop:Dock
Spark 是基于内存的,由于内存的限制,可能会由于内存资源不够导致 Job 执⾏失败 算法层 SparkMLlib ⽀持的语⾔:python,scala,java ⽀持的⽂件系统:HDFS ⽀持的数据库:Hive,HBase ⽀持的算法:分类,聚类,...
java8 集合源码分析 Spark 阅读Spark SQL相关官方文档笔记,见SparkSQLDoc.md Spark Streaming 相关, 见SparkStreaming.md 奇淫巧技 IDEA,按住ALT,并按住左键进行框选也能实现多行编辑 Linux的vi编辑。 使用A进入...
使用storm 负责搭建消息处理架构,并完成基于业务的消息落地,提供后续的数据 统计分析实时和离线任务,诸如pv、uv等数据,为运营做决策网站用户行为埋点和基于js的日志收集器开发,定义接又和前端部门配合。主用go 2、...
数据分析:对处理好的数据进⾏交互式分析,主要是⽤SQL语⾔进⾏数据的分析。 6. 资源管理:对资源进⾏调度和管理,其中包括:内存、CPU、存储等资源。 7. 数据管理:对数据进⾏安全、质量、权限等的管理以及⼯作...
编程狂人是推酷网旗下的周刊,每周一发布,并且同步发布pdf离线版本,内容以开发技术,编程语言,框架等为主,并且配有一周IT业界新闻! 目录 业界新闻 斯坦福大学发布免费在线文本分析工具 Parse发布Bolts,一个...
对于像的⼀样的数据和离线分析系统,但⼜要求实时处理的限制,这是⼀个可⾏的解决⽅案。 Kafka的⽬的是通过的并⾏加载机制来统⼀线上和离线的消息处理,也是为了通过来提供实时的消费。 特性: 通过O(1)的磁盘数据...
数据存储:分布式文件系统使用HDFS,分布式数据库使用HBase,Mongodb、Elasticsearch,内存数据库使用redis;数据计算:使用Hive、MR、HiveSQL、ETL开发离线计算系统;使用storm、flink、spark streaming开发实时...