JVM分析工具

1、JConsole可以图形化查看JVM中内存的变化状况,JConsole是JDK 5及以上版本中自带的工具,位于JDK的bin目录下,运行时直接运行JConsole.exe或JConsole.sh(要求支持图形界面)。


如果要监视远程Java进程,需要在远程服务器上做相应的设置

1)windows系统下,需要修改 tomcat主目录\bin\ catalina.bat文件


set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"

修改成
set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port="8080"

-Dcom.sun.management.jmxremote.authenticate="false"

-Dcom.sun.management.jmxremote.ssl="false"

2)Linux系统下,需要修改 tomcat主目录\bin\ catalina.sh文件

增加一行

CATALINA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=218.28.198.188 -Dcom.sun.management.jmxremote.port=9527 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"即可

然后使用JConsole就可以监控Tomcat啦。

点击%JAVA_HOME%\bin下的jconsole.exe即可



2、JVisualVM是JDK 6 update 7之后推出的一个工具,它类似于JProfiler的工具,基于此工具可查看内存的消耗情况、线程的执行状况及程序中消耗CPU、内存的动作。

3、JMap是JDK中自带的一个用于分析JVM内存状况的工具,位于JDK的bin目录下。使用JMap可查看目前JVM中各个代的内存状况、JVM中对象的内存的占用状况,以及导出整个JVM中的内存信息。

在linux上执行jmap -heap [pid],就可查看整个JVM中内存的状况,看到的信息类似如下(和JDK版本、GC策略有关):
using thread-local object allocation.  
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1610612736 (1536.0MB)
NewSize = 524288000 (500.0MB)
MaxNewSize = 524288000 (500.0MB)
OldSize = 4194304 (4.0MB)
NewRatio = 8
SurvivorRatio = 8
PermSize = 100663296 (96.0MB)
MaxPermSize = 268435456 (256.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 430702592 (410.75MB)
used = 324439936 (309.4100341796875MB)
free = 106262656 (101.3399658203125MB)
75.32806675098904% used
From Space:
capacity = 46333952 (44.1875MB)
used = 13016424 (12.413429260253906MB)
free = 33317528 (31.774070739746094MB)
28.092626331550566% used
To Space:
capacity = 46792704 (44.625MB)
used = 0 (0.0MB)
free = 46792704 (44.625MB)
0.0% used
PS Old Generation
capacity = 1086324736 (1036.0MB)
used = 945707880 (901.8973159790039MB)
free = 140616856 (134.1026840209961MB)
87.05572548059884% used
PS Perm Generation
capacity = 100663296 (96.0MB)
used = 46349592 (44.202415466308594MB)
free = 54313704 (51.797584533691406MB)
46.044182777404785% used



导出整个JVM中的内存信息

  通过以上方法能查看到JVM中对象内存的占用情况,但很多时候还要知道这个对象到底是谁创建的。例如上面显示出来的[C,只知道它占用了那么多的空间,但不知道是什么对象创建出的[C,于是jmap提供了导出整个jvm中的内存信息的支持。基于一些jvm内存的分析工具,例如sun JDK 6中的jhat、Eclipse Memory Analyzer,可以分析jvm中内存的详细信息,例如[C是哪些对象创建的。

  执行如下命令即可导出整个jvm中的内存信息:

jmap -dump:format=b,file=文件名 [pid]

4、JHat是Sun JDK 6及以上版本中自带的一个用于分析jvm堆dump文件的工具,基于此工具可分析jvm heap中对象的内存占用状况、引用关系等。

  执行如下命令分析jvm堆的dump文件:

jhat -J-Xmx1024M [file]


执行后等待console中输出Started HTTP server on port 7000,看到后就可以通过浏览器访问http://ip:7000了,此页面默认为按package分类显示系统中所有的对象实例。在页面的最下端有Other Queries导航,其中有显示jvm中对象实例个数的链接、有显示jvm中对象大小的链接等,点击显示jvm中对象大小的链接



./bin/jhat -J-Xmx1024M /home/xxxxx/jvm.dump
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.


Package <Arrays>

class [Lantlr.Token; [0xb276b450]
class [Lantlr.collections.AST; [0xb277f9b8]
class [Lcom.ctc.wstx.sr.Attribute; [0xb41af208]
class [Lcom.ctc.wstx.util.SymbolTable$Bucket; [0xb40db8b8]
class [Lcom.esotericsoftware.kryo.Kryo$Listener; [0xb0f18eb8]
class [Lcom.sun.jersey.api.client.ClientResponse$Status; [0xb63e6f98]
class [Lcom.sun.jersey.api.uri.UriComponent$Type; [0xb3e52ed8]
class [Lcom.sun.jersey.core.header.reader.HttpHeaderReader$Event; [0xb2f09368]
class [Lcom.sun.jersey.core.reflection.AnnotatedMethod; [0xb2dda758]
class [Lcom.sun.jersey.core.spi.component.ComponentScope; [0xb2ddf660]
class [Lcom.sun.jersey.core.util.KeyComparatorHashMap$Entry; [0xb2dfe068]
class [Lcom.sun.xml.bind.v2.model.annotation.AnnotationSource; [0xb484c3a8]
class [Lcom.sun.xml.bind.v2.model.annotation.Locatable; [0xb438baa8]
class [Lcom.sun.xml.bind.v2.model.annotation.Quick; [0xb438bd80]
class [Lcom.sun.xml.bind.v2.model.core.ID; [0xb43de388]
class [Lcom.sun.xml.bind.v2.model.core.PropertyInfo; [0xb484c6b8]
class [Lcom.sun.xml.bind.v2.model.core.PropertyKind; [0xb43dab20]
class [Lcom.sun.xml.bind.v2.model.impl.ClassInfoImpl$PropertyGroup; [0xb43d8d68]
class [Lcom.sun.xml.bind.v2.model.impl.ClassInfoImpl$SecondaryAnnotation; [0xb43c5e30]
class [Lcom.sun.xml.bind.v2.model.impl.PropertyInfoImpl; [0xb484c990]



Class 0xb3dba700

class [Ljavax.servlet.FilterConfig;

Superclass:

class java.lang.Object
Loader Details

ClassLoader:

org.apache.catalina.loader.StandardClassLoader@0xc0000690 (122 bytes)
Signers:

<null>
Protection Domain:

java.security.ProtectionDomain@0xc0018898 (58 bytes)
Subclasses:

Instance Data Members:

Static Data Members:

Instances

Exclude subclasses
Include subclasses
References summary by Type

References summary by type
References to this object:
### 常见的JVM性能分析工具 对于JVM性能分析,有多种工具可供选择。以下是几种常见的推荐工具及其功能描述: #### 图形化工具 - **jvisualvm** 是一种图形化的工具,能够用于内存、线程和垃圾回收(GC)的分析[^1]。它提供了丰富的插件支持,可以扩展其功能。 - **VisualVM** 同样是一款图形化监控工具,适合对多个JVM实例进行性能监控[^1]。它可以显示实时的内存使用情况、线程状态以及类加载信息。 - **JConsole** 是JDK内置的一个性能监控工具,主要用于监视JVM中的内存、线程和类等资源的使用情况[^4]。它是基于JMX技术构建的,可以通过远程连接到目标JVM实例,方便开发者了解应用运行时的行为。 #### 商业化工具 - **YourKit** 和 **JProfiler** 属于商业化的性能分析工具,特别适用于复杂的大规模应用程序[^1]。它们不仅能够深入分析CPU和内存的使用情况,还能诊断潜在的性能瓶颈、内存泄漏和线程死锁等问题[^3]。 #### 日志分析工具 - 对于垃圾回收行为的分析,可以选择专门的日志分析工具如 **GCViewer** 或者 **GCEasy**。这些工具可以从复杂的GC日志中提取有用的信息,帮助开发人员理解GC的工作原理并优化其参数设置。 #### 生产环境监控工具 - **Flight Recorder** 和 **Mission Control** 提供了一种低开销的方式来进行生产环境下的持续监控。这类工具有助于捕获长时间跨度内的性能数据,非常适合在线服务场景下的问题排查。 #### JDK自带命令行工具 除了上述高级别的可视化或者商用解决方案外,JDK本身还附带了一系列轻量级但非常实用的小型工具,位于 `$JAVA_HOME/bin` 下面,比如 `jps`, `jinfo`, `jstack`, `jmap`, 和 `jstat` 等[^2]。这些工具虽然不具备友好的界面,但在特定情况下却极其有效,例如快速查看进程列表(`jps`)、获取堆转储文件(`jmap`)或是统计垃圾收集器的表现(`jstat`)。 ```bash # 查看当前系统上的所有Java进程ID jps # 获取指定PID对应的JVM启动参数 jinfo <pid> # 打印某个进程中所有的线程栈信息 jstack <pid> # 创建一份heap dump文件以便后续离线分析 jmap -dump:live,format=b,file=heap.bin <pid> ``` 以上就是一些主流且被广泛使用的JVM性能分析工具介绍,每款都有各自的特点与适用范围,实际操作过程中可以根据具体需求挑选合适的选项组合起来使用效果更佳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值