分析JAVA Application的内存使用时,jmap是一个很实用的轻量级工具。使用jmap可以查看heap空间的概要情况,粗略的掌握heap的使用情况。也可以生成heapdump文件,再使用jhat通过web浏览器具体分析内容中的对象和数据。
--------------------------------------------------------------------------------
jmap是JDK自带的一个工具,非常小巧方便,其支持参数如下:
-heap
打印heap空间的概要,这里可以粗略的检验heap空间的使用情况。
jmap -heap PID
fs@inspur92:~/test/llxdata/081005/tmp$ jmap -heap 30774
Attaching to process ID 30774, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.1-b02
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 268435456 (256.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 353107968 (336.75MB)
used = 9083624 (8.662818908691406MB)
free = 344024344 (328.0871810913086MB)
2.572477775409475% used
From Space:
capacity = 2359296 (2.25MB)
used = 0 (0.0MB)
free = 2359296 (2.25MB)
0.0% used
To Space:
capacity = 2359296 (2.25MB)
used = 0 (0.0MB)
free = 2359296 (2.25MB)
0.0% used
PS Old Generation
capacity = 715849728 (682.6875MB)
used = 47522208 (45.320709228515625MB)
free = 668327520 (637.3667907714844MB)
6.638573172720407% used
PS Perm Generation
capacity = 40435712 (38.5625MB)
used = 40067528 (38.21137237548828MB)
free = 368184 (0.35112762451171875MB)
99.08945834810575% used
以上的输出很简单,第四行起开始输出此进程的JAVA使用的环境。
Heap Configuration:指java应用启动时设置的JVM参数。像最大使用内存大小,年老代,年青代,持久代大小等。
Heap Usage:当时的heap实际使用情况。包括新生代、老生代和持久代。
其中新生代包括:Eden区的大小、已使用大小、空闲大小及使用率。Survive区的From和To同样。
有这个可以很简单的查看本进程的内存使用情况。
可以用于分析堆内存分区大小是否合理,新生代和老生代的大小分配是否合适等。
也许进程占用的总内存比较多,但我们在这里可以看到真正用到的并没有多少,很多都是"Free"。内存使用的堆积大多在老年代,内存池露始于此,所以要格外关心“Old Generation”。
--------------------------------------------------------------------------------
jmap -histo PID
这里会生成一个类的统计报表,此表非常简单,如显示什么类有多少个实例,共占了多少字节等。如下:
fs@inspur92:~/test/llxdata/081005/tmp$ jmap -histo 30774
num #instances #bytes class name
----------------------------------------------
1: 12077 37306240 [I
2: 8404 8913528 [B
3: 55627 8311744 <constMethodKlass>
4: 55627 7576152 <methodKlass>
5: 35982 6771360 [C
6: 4838 5536240 <constantPoolKlass>
7: 88849 4696992 <symbolKlass>
8: 4838 3735856 <instanceKlassKlass>
9: 4024 3334976 <constantPoolCacheKlass>
10: 4600 2201648 <methodDataKlass>
11: 35011 1120352 java.lang.String
12: 5286 549744 java.lang.Class
13: 6509 441272 [S
14: 7454 392128 [[I
其中关于I、B、C等的说明如下 Table 4.2.
BaseType Character Type Interpretation
B byte signed byte
C char Unicode character
D double double-precision floating-point value
F float single-precision floating-point value
I int integer
J long long integer
L<classname>; reference an instance of class de><classname>de>
S short signed short
Z boolean de>truede> or de>falsede>
[ reference one array dimension
--------------------------------------------------------------------------------
jmap -permstat
打印一些持久代上的内存使用状态,有“活”的,有“死”的。
class_loader classes bytes parent_loader alive? type
<bootstrap> 2099 12780072 null live <internal>
0x00000000c069dc58 1 1968 0x00000000c017e968 dead sun/reflect/DelegatingClassLoader@0x00000000b00685b0
0x00000000c05c37d8 1 2008 0x00000000c017e968 dead sun/reflect/DelegatingClassLoader@0x00000000b00685b0
0x00000000c069d900 1 1968 0x00000000c017e968 dead sun/reflect/DelegatingClassLoader@0x00000000b00685b0
不常用。
--------------------------------------------------------------------------------
-heap:format=b
产生一个HeapDump文件,此为生成heapdump文件的重要参数。
例:jmap -heap:format=b 2657
会产生一个heap.bin的heapdump文件。
需要注意的是,此生成heapdump的参数为JDK1.5,在1.6中的格式为:
jmap -dump:live,format=b,file=xxx 2657
这里更加强大一些,可以指定是存活的对象,还有生成heapdump的文件名。
当被测应用使用内容较大时(4G以上),dump需要花费较长时间,很可能导致dump失败。
dump下来的文件结合jhat进行分析会更方便。
--------------------------------------------------------------------------------
jhat
jhat是一个Java堆复制浏览器。这个工具分析Java堆复制文件(例如,由上面的"jmap -dump"所产生的)。Jhat启动一个允许堆中的对象在web浏览器中进行分析的web服务器。这个工具并不是想用于应用系统中而是用于"离线"分析。"jhat工具是平台独立的",其意思是,它可以被用来观察在任何平台上所产生的堆复制。例如,我们有可能在Linux系统上使用jhat来观察一个 在Solaris OS上所产生的堆复制。
把本机的java内存映像导出到heap.dmp中,其中PID为java进程的ID号。
jmap -dump:live,format=b,file=heap.dmp PID
导出后的映像文件可以用jhat来进行分析,-J是向java虚拟机传一个参数,如-mx768m是指定虚拟机可用最大的内存为768M。如果映像文件很大,你要指定一个很大的值,否则在分析过程中就会有OutOfMemeryError的错误。
jhat -J-mx768m -port <端口号:默认为7000> heap.dmp
转自:http://liulinxia02.blog.163.com/blog/static/26868772009111861834942/
分享到:
相关推荐
jhat 主要用来分析堆dump文件。语法格式如下:jhat [options] [dumpfile]。指令行参数选项解释如下: * -J options 传递给 JVM 的参数 * -port 端口号 例如:jhat -port 9999 dump.dat 五、jstat jstat 主要用来...
jhat 是 JavaHeapAnalysisTool 的缩写,它是一个 Java 虚拟机(JVM)堆分析工具,由 Sun Microsystems 提供,用于对 Java 应用程序的堆内存进行分析和诊断。下面是 jhat 的使用方法指南: jhat 的基本概念 jhat ...
MAT 是一个开源的java内存分析工具,能够快速的分析dump文件,可以直观的看到各个对象在内存占用的量大小,以及类实例的数量,对象之间的引用关系,找出对象的GC Roots相关的信息,此外还能生成内存泄露报表,疑似...
此外,还有一些第三方工具,如MAT(Memory Analyzer Tool)和YourKit,它们提供了更强大的内存分析功能,可以识别出潜在的内存泄露问题。 在分析内存泄露时,我们需要关注以下几个关键点: 1. **对象生命周期**:...
3. jinfo、jmap、jhat:命令行工具用于获取JVM配置、堆转储、堆分析等。 五、内存泄漏与检测 1. 内存泄漏:无用对象未被正确释放,占用内存持续增长。可通过内存分析工具找出泄漏源。 2. 常见泄漏原因:静态集合...
内存分析工具如jvisualvm、jmap、jhat和MAT(Memory Analyzer Tool)等,为Java开发者提供了分析JVM内存使用状况的能力。这些工具可以用来监控堆内存的使用情况,识别内存泄漏,分析内存使用趋势,帮助开发者进行...
- **MAT (Memory Analyzer Tool)**:Eclipse提供的一个高级内存分析工具,能够帮助用户分析heapdump,定位内存泄漏、分析对象引用关系等。 在进行内存分析时,我们关注的主要问题包括内存泄漏、对象的生命周期、...
提供多种JVM监控工具的使用示例,如jps、jstat、jmap、jhat、jstack、jinfo和jcmd,帮助开发者实时监控JVM的运行状态。 3. 内存管理与垃圾收集 演示如何通过调整JVM参数(如XX:PretenureSizeThreshold)来影响...
此外,还可以通过`jmap`、`jhat`等命令行工具获取更深入的内存分析数据。 总的来说,理解和掌握Java内存管理,合理设置JVM参数,以及熟练运用内存检查工具,是预防和解决Java内存问题的关键。对于长期运行的服务,...
jhat是JVM Heap Analysis Tool的缩写,主要用于分析jmap生成的dump。jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。需要注意的是,在服务器上不建议直接运行jhat,因为jhat是一...
内存泄漏则指对象无法正常释放,导致可用内存不断减少,可以使用内存分析工具定位持有对象引用的代码,及时释放不再使用的资源。 JVM的优化是Java开发中不可或缺的一部分,理解内存结构及其工作原理,结合有效的...
3. **`jhat`或`VisualVM`**:这些是更强大的内存分析工具,可以对`hprof`文件进行可视化分析,找出内存占用高的对象。 4. **源码分析**:对于开源的JVM实现,如OpenJDK,可以直接阅读源码来理解崩溃原因。 在分析...
3. **性能调优工具**:比如Java的`jmap`和`jhat`,可以用于获取堆转储,并分析堆内对象的分布,帮助定位内存泄漏的源头。 4. **自定义监控脚本**:开发者可以编写脚本定期收集ZooKeeper服务器的内存使用数据,然后...
在开发过程中,VisualVM 允许开发者进行实时的内存分析、线程检查、CPU性能剖析、类加载器和垃圾收集器的行为监测。它还能够显示JVM的配置信息,如JVM参数、系统属性和运行时类路径。此外,VisualVM 支持连接到远程...
2. jvisualvm:集成于JDK,提供更丰富的监控功能,包括内存分析、CPU性能分析等。 3. jmap:用于生成堆转储文件,以便离线分析。 4. jhat:配合jmap使用,分析堆转储文件,找出内存泄漏等问题。 5. VisualVM:...
6. **JVM日志与故障排查**:通过-JDK自带的jmap、jhat、jstack和jinfo等命令,可以生成堆转储、分析内存、查看线程堆栈信息和配置信息,辅助故障诊断。 7. **类加载机制**:JVM的双亲委派模型确保了类加载的一致性...
3. **jhat**:Java Heap Analysis Tool,与jmap配合使用,它可以分析由jmap生成的堆转储文件,提供一个基于HTTP/HTML的用户界面,以可视化的形式展示内存使用情况,便于找出可能的问题。 4. **jconsole**:这个工具...
了解和分析JVM内存使用情况,我们常常会用到一些工具,如JVisualVM、JConsole、JMX、JInfo、JMap、JHat等。这些工具可以帮助我们监控内存分配、垃圾收集、线程状态等,从而进行性能调优。 在实际开发中,理解这些...
通常,这会涉及使用jmap进行堆内存分析,jstat监控JVM的统计信息,jconsole或jvisualvm进行实时性能监控,以及jstack分析线程状态。 **三、源码分析** 对于"源码"这一标签,JDK工具中的`javap`命令是一个很好的...