Jprofile剖析dump文件运用详解
第3篇-如何编写一个面试时能拿的出手的开源项目?
1 Jprofile简介
-
- 下载对应的体系版本即可
机能检察东西JProfiler,可用于检察java实行效力,检察线程状态,检察内存占用与内存对象,还可以理会dump日记.
2 功用简介
- 挑选attach to a locally running jvm
- 挑选须要检察运转的jvm,双击或许点击start
- 守候进度完成,弹出情势挑选
- Instrumentation情势记载一切的信息。包括要领实行次数等Sampling情势则只支撑部份功用,不记载要领挪用次数等,而且更加平安
由于记载信息许多,java运转会变的比一般实行慢许多,sampling情势则不会 - 通例运用挑选sampling情势即可,当须要视察要领实行次数才须要挑选Instrumentation情势,情势切换须要重启jprofiler
- Instrumentation情势记载一切的信息。包括要领实行次数等Sampling情势则只支撑部份功用,不记载要领挪用次数等,而且更加平安
- 点击OK
- 挑选Live Momory可以检察内存中的对象和大小
- 挑选cpu views点击下图框中的按钮来记载cpu的实行时刻
- 这时刻可以在外部对须要录的jvm操纵举行记载了,得出的效果可以轻松看出要领实行挪用历程与斲丧时刻比例:
- 依据cpu截图的信息,可以找到效力低的处所举行处置惩罚,假如是Instrumentation情势则在时刻位置会显现挪用次数
在Thread界面则可以及时检察线程运转状态,黄色的是wait 赤色是block 绿色的是runnable蓝色是收集和I/O要求状态
挑选ThreadDumps,可以录制瞬时线程的挪用客栈信息,以下图所示:
3 dump 文件理会
3.1 dump 生成
JProfiler 在线
当JProfiler连接到JVM以后挑选Heap Walker,挑选Take snapshot图标,然后守候即可
假如内存很大,jprofiler万一参数设置的不正确打不开就须要要从新生成,内存小的时刻无所谓
运用JProfiler生成文件
当JProfiler连接到JVM以后挑选菜单上的Profiling->save HPROF snapshot 弹出下拉框保留即可,这时刻生成的文件就可以一向保留在文件上
jmap
jmap -dump:format=b,file=文件名 pid
windows下不必[],途径要加引号
jmap -dump:format=b,file="D:a.dump" 8632
敕令中文件名就是要保留的dump文件途径, pid就是当前jvm历程的id
JVM启动参数
在发作outofmemory的时刻自动生成dump文件:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:heapdump
Pah背面是一个存在的可接见的途径,将改参数放入jvm启动参数可以在发作内存outofmemory的时刻自动生成dump文件,然则正式环境运用的时刻不要加这个参数,不然在内存快满的时刻总是会生成dump而致使jvm卡半天,须要调试的时刻才须要加这个参数
注重:经由过程WAS生成的PHD文件dump不能理会出出问题的模板,由于PHD文件不包括对象的值内容,没法依据PHD文件找到出问题的模板,所以PHD文件没有太大的参考价值
3.2 dump文件理会
dump文件生成后,将dump紧缩传输到当地,不论当前dump的后缀名是什么,直接改成*.hprof,就可以直接用jprofiler翻开了
翻开的历程时刻可能会很长,主如果要对dump举行预处置惩罚,盘算什么的,注重 这个历程不能点skip,不然就不太好定位大文件
- 直接翻开
.hprof
文件
- 注重以下历程,半途可以喝一杯️,不要作死手滑点击了 skip!
如许界面的时刻下面可以入手下手举行操纵了!
4 模块功用点详解
也可以运用东西栏中的“转到入手下手”按钮接见第一个数据集
4.1 内存视图 Memory Views
JProfiler的内存视图部份可以供应动态的内存运用状态更新视图和显现关于内存分派状态信息的视图。一切的视图都有几个群集层而且可以显现现有存在的对象和作为垃圾接纳的对象。
- 一切对象 All Objects
显现类或在状态统计和尺码信息堆上一切对象的包。你可以标记当前值并显现差别值。 - 记载对象 Record Objects
显现类或一切已记载对象的包。你可以标记出当前值而且显现差别值。 - 分派接见树 Allocation Call Tree
显现一棵要求树或许要领、类、包或对已挑选类有带解释的分派信息的J2EE组件。 - 分派热门 Allocation Hot Spots
显现一个列表,包括要领、类、包或分派已选类的J2EE组件。你可以标注当前值而且显现差别值。关于每一个热门都可以显现它的跟踪记载树。 - 类追踪器 Class Tracker
类跟踪视图可以包括恣意数目的图表,显现选定的类和包的实例与时刻。
4.2 堆遍历 Heap Walker
运用背景
在视图中找到增进疾速的对象范例,在memory视图中找到Concurrenthashmap---点右键----挑选“Show Selectiion In Heap Walker”,切换到HeapWarker 视图;切换前会弹出选项页面,注重一定要挑选“Select recorded objects”,如许Heap Walker会在方才的那段记载中举行理会;不然,会理会tomcat的一切内存对象,如许既耗时又不正确;
在JProfiler的堆遍历器(Heap Walker)中,你可以对堆的状态举行快照而且可以经由过程挑选步骤下寻觅感兴趣的对象。堆遍历器有五个视图:
- 类 Classes
显现一切类和它们的实例,可以右击详细的类"Used Selected Instance"完成进一步跟踪。 - 分派 Allocations
为一切记载对象显现分派树和分派热门。 - 索引 References
为单个对象和“显现到垃圾接纳根目录的途径”供应索引图的显现功用。还能供应兼并输入视图和输出视图的功用。 - 时刻 Time
显现一个对已记载对象的处理时刻的柱状图。 - 搜检 Inspections
显现了一个数目的操纵,将理会当前对象集在某种条件下的子集,本质是一个挑选的历程。
在HeapWalker中,找到走漏的对象
HeapWarker 会理会内存中的一切对象,包括对象的援用、建立、大小和数目.
经由过程切换到References页签,可以看到这个类的详细对象实例。 为了在这些内存对象中,找到走漏的对象(应该被接纳),可以在该对象上点击右键,挑选“Use Selected Instances”减少对象局限
经由过程援用理会该对象
References 可以看到该对象的的援用关联,选项显现援用的范例
- incoming
显现这个对象被谁援用 - outcoming
显现这个对象援用的其他对象
挑选“Show In Graph”将援用关联运用图形体式格局展示;
- 选中该对象,点击
Show Paths To GC Root
,会找到援用的根节点
经由过程建立理会该对象
假如还不能定位内存泄漏的处所,我们可以尝试运用Allocations页签,该页签显现对象是怎样建立出来的;
我们可以从建立要领入手下手搜检,搜检一切用到该对象的处所,直到找到走漏位置;
图表 Graph
你须要在references视图和biggest视图手动增加对象到图表,它可以显现对象的传入和传出援用,能轻易的找到垃圾收集器泉源。
tips:在东西栏点击"Go To Start"可以使堆内存从新计数,也就是回到初始状态。
CPU 视图 CPU Views
JProfiler 供应差别的要领来记载接见树以优化机能和细节。线程或许线程组以及线程状态可以被一切的视图挑选。一切的视图都可以群集到要领、类、包或J2EE组件等差别层上。CPU视图部份包括:
接见树 Call Tree
显现一个积聚的自顶向下的树,树中包括一切在JVM中已记载的接见行列。JDBC,JMS和JNDI效劳要求都被解释在要求树中。要求树可以依据Servlet和JSP对URL的差别须要举行拆分。
热门 Hot Spots
显现斲丧时刻最多的要领的列表。对每一个热门都可以显现回溯树。该热门可以根据要领要求,JDBC,JMS和JNDI效劳要求以及根据URL要求来举行盘算。
接见图 Call Graph
显现一个从已选要领、类、包或J2EE组件入手下手的接见行列的图。
要领统计 Method Statistis
显现一段时刻内记载的要领的挪用时刻细节。
线程视图 Thread Views
JProfiler经由过程对线程汗青的监控推断其运转状态,并监控是不是有线程壅塞发生,还能将一个线程所治理的要领以树状情势显现。对线程理会,JProfiler供应以下视图:
线程汗青 Thread History
显现一个与线程运动和线程状态在一起的运动时刻表。
线程监控 Thread Monitor
显现一个列表,包括一切的运动线程以及它们现在的运动状态。
线程转储 Thread Dumps
显现一切线程的客栈跟踪。
监控器视图 Monitor Views
JProfiler供应了差别的监控器视图,以下所示:
当前锁定图表 Current Locking Graph
显现JVM中的当前锁定状况。
当前监视器 Current Monitors
显现当前正在守候或壅塞中的线程操纵。
锁定汗青图表 Locking History Graph
显现记载在JVM中的锁定汗青。
监控器汗青 Monitor History
显现守候或许壅塞的汗青。
监控器运用统计 Monitor Usage Statistics
盘算统计监控器监控的数据。
VM遥感勘察手艺视图 VM Telemetry Views
视察JVM的内部状态,JProfiler供应了差别的遥感勘察视图,以下所示:
内存 Memory
显现客栈的运用状态和客栈尺寸大小运动时刻表。
记载的对象 Recorded Objects
显现一张关于运动对象与数组的图表的运动时刻表。
记载的生产量 Recorded Throughput
显现一段时刻累计的JVM生产和开释的运动时刻表。
垃圾接纳运动 GC Activity
显现一张关于垃圾接纳运动的运动时刻表。
类 Classes
显现一个与已装载类的图表的运动时刻表。
线程 Threads
显现一个与动态线程图表的运动时刻表。
CPU负载 CPU Load
显现一段时刻中CPU的负载图表。
参考
《HelloGitHub》第 47 期