1. 开启jdb,有2种方式:
1) 另开一个JVM进行调试:
jdb ClassName
2) 在已存在的JVM中进行调试:
java -agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=n ClassName
jdb -attach jdbconn
2. jdb基本命令
5) cont 继续运行直到下个断点
6) step 步进
7) print obj 输出变量值
8) catch ExceptionClassName 当发生指定异常时stop
9) ignore 取消catch命令的效果
10) exit 退出jdb
使用 jmap 和 jhat 来监控内存:
1) jmap -dump:live,format=b,file=dumpfile pid
2) jhat -J-mx512m dumpfile
然后会提示类似如下:
Reading from e:/heap2.tmp... Dump file created Thu Mar 21 15:29:59 CST 2013 Snapshot read, resolving... Resolving 586350 objects... Chasing references, expect 117 dots............................................. ........................................................................ Eliminating duplicate references................................................ ..................................................................... Snapshot resolved. Started HTTP server on port 7000 Server is ready.
然后可以访问以下地址,查看相关信息:
http://localhost:7000/
http://localhost:7000/histo/
http://localhost:7000/showInstanceCounts/
http://localhost:7000/showInstanceCounts/includePlatform/
http://localhost:7000/oql/
监控VM使用量: jstat
jstat -class pid 显示加载class的数量,及所占空间等信息
jstat -compiler pid 显示VM实时编译的数量等信息
jstat -gc pid 显示gc的信息,查看gc的次数及时间。最后五项分别是: young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity pid 显示VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid new对象的信息。
jstat -gcnewcapacity pid new对象的信息及其占用量。
jstat -gcold pid old对象的信息。
jstat -gcoldcapacity pid old对象的信息及其占用量。
jstat -gcpermcapacity pid perm对象的信息及其占用量。
jstat -gcutil pid 统计gc信息统计。
jstat -printcompilation pid 当前VM执行的信息。 除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
see:
JDK自带VM分析工具jps,jstat,jmap,jconsole
性能测试 -- jmap 输出内存中对象 的工具使用 --监控java内存溢出
JMX命令行工具: jmxterm(一个基于jconsole的jmx client命令行工具,不需要事先开启JMX服务端口)
1) 运行: java -jar jmxterm-xxx.jar
2) $>jvms 列出当前java进程
3) $>open PID 连接上要查看的java进程
4) $>domains 显示当前可查看的bean域
5) $>beans 上一步所列出的domain(如:$>beans java.lang ) 显示该域下可查看的bean
6) $>bean 上一步所列出的bean(如:$>bean java.lang:type=Memory)选定该bean
7) $>info 显示上一步所选定的bean下可查看的属性
8) $>get 上一步所列出的属性名(如:$>get ObjectPendingFinalizationCount) 显示该属性值
过程中显示的信息如下:
c:\>java -jar jmxterm-1.0.jar Welcome to JMX terminal. Type "help" for available commands. $>jvms 9184 ( ) - jmxterm-1.0.jar 8760 ( ) - jdiary.jar 4200 ( ) - $>open 8760 #Connection to 8760 is opened $>domains #following domains are available JMImplementation com.sun.management java.lang java.util.logging $>beans java.lang #domain = JMImplementation: JMImplementation:type=MBeanServerDelegate #domain = com.sun.management: com.sun.management:type=HotSpotDiagnostic #domain = java.lang: java.lang:name=Code Cache,type=MemoryPool java.lang:name=CodeCacheManager,type=MemoryManager java.lang:name=PS Eden Space,type=MemoryPool java.lang:name=PS MarkSweep,type=GarbageCollector java.lang:name=PS Old Gen,type=MemoryPool java.lang:name=PS Perm Gen,type=MemoryPool java.lang:name=PS Scavenge,type=GarbageCollector java.lang:name=PS Survivor Space,type=MemoryPool java.lang:type=ClassLoading java.lang:type=Compilation java.lang:type=Memory java.lang:type=OperatingSystem java.lang:type=Runtime java.lang:type=Threading #domain = java.util.logging: java.util.logging:type=Logging $>bean java.lang:type=Memory #bean is set to java.lang:type=Memory $>info #mbean = java.lang:type=Memory #class name = sun.management.MemoryImpl # attributes %0 - HeapMemoryUsage (javax.management.openmbean.CompositeData, r) %1 - NonHeapMemoryUsage (javax.management.openmbean.CompositeData, r) %2 - ObjectPendingFinalizationCount (int, r) %3 - Verbose (boolean, rw) # operations %0 - void gc() # notifications %0 - javax.management.Notification(java.management.memory.threshold.exceeded ,java.management.memory.collection.threshold.exceeded) $>get ObjectPendingFinalizationCount #mbean = java.lang:type=Memory: ObjectPendingFinalizationCount = 0; $>
其他命令可通过help进行查询,对于每个命令也可以通过 -h 查看其参数用法。