打开 %java_home%\bin 下面,看一堆的命令
windows下是一堆exe文件。
挑几个主要的来学习记录下,蛮有用的,居家旅行,调错装x,必备!~
java :忽略
javac :忽略 , 唯一需要知道 javac -g ,
并且通过实地证明,eclipse,mvn编译都是默认加了-g进行编译的。(感谢R_Fx指导,名字太长记不住。。。)
javah :忽略。jni才用得到!~
javaw:原来是启动图形界面用到的!~
jvisualvm.exe 这个点了就知道了。很给力~~~
javap :
详细讲,这玩意是分析运行前代码和了解jvm,class机制的好家伙!
jconsole : 会用就无视了
下面4个是解决很多oom或者监视运行中的JVM的必备武器。
jhat
jps
这个很简单,用一下就知道,通过这个查看java的进程id。
服务器输出 写道
[admin@v014108 ~]$ jps
14950 Jps
31664 Main
jmap
1:jmap -heap [pid]
写道
[admin@xxx ~]$ jmap -heap 31664
Attaching to process ID 31664, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 10.0-b23
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1610612736 (1536.0MB)
NewSize = 335544320 (320.0MB)
MaxNewSize = 335544320 (320.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 = 187367424 (178.6875MB)
used = 149624088 (142.6926498413086MB)
free = 37743336 (35.994850158691406MB)
79.85597752574108% used
From Space:
capacity = 72679424 (69.3125MB)
used = 2218824 (2.1160354614257812MB)
free = 70460600 (67.19646453857422MB)
3.0528915584141116% used
To Space:
capacity = 69664768 (66.4375MB)
used = 0 (0.0MB)
free = 69664768 (66.4375MB)
0.0% used
PS Old Generation
capacity = 1275068416 (1216.0MB)
used = 496040208 (473.06080627441406MB)
free = 779028208 (742.9391937255859MB)
38.903026831777474% used
PS Perm Generation
capacity = 100663296 (96.0MB)
used = 95414112 (90.99398803710938MB)
free = 5249184 (5.006011962890625MB)
94.78540420532227% used
好吧,我发现我见识浅了,看到这儿我欣喜若狂。如此清楚。
2:jmap -histo [pid] 或者 jmap -histo [pid] > heapDump.log
用用有惊喜。
写道
[admin@xxxx~]$ jmap -histo 31664 > heapDump.log
[admin@xxxx~]$
[admin@xxxx~]$ vi heapDump.log
写道
num #instances #bytes class name
----------------------------------------------
1: 1417850 97522464 [C
2: 703592 61916096 com.taobao.forest.domain.dataobject.std.impl.DefaultStdCategoryPropertyValueDO
3: 790666 56248464 [Ljava.lang.Object;
4: 91101 46575560 [I
5: 1467357 35216568 java.lang.String
6: 408526 32682080 com.taobao.forest.domain.dataobject.proprepo.impl.DefaultPropertyValueDO
7: 49821 29456896 [B
8: 195943 24656024 <constMethodKlass>
9: 537905 17212960 java.io.ObjectStreamClass$WeakClassKey
10: 127367 15981640 [Ljava.util.HashMap$Entry;
11: 653443 15682632 java.util.HashMap$Entry
12: 195943 15682208 <methodKlass>
13: 317288 15229824 com.taobao.forest.domain.dataobject.proprepo.impl.DefaultValueDO
14: 412358 13195456 java.util.LinkedHashMap$Entry
15: 259224 12435280 <symbolKlass>
16: 177 11546520 [Ljava.io.ObjectInputStream$HandleTable$HandleList;
内存dump,
友情提示:内存dump就dump一次一般没太多参考意义,推荐多dump几次,然后通过分析工具进行分析观察,方为王道;
3:jmap -dump:format=b,file=formatDump [pid]
这个才是王道的分析导出。。。
各个分析工具分析这个比较给力,上面哪个是文本,这个是format后的二进制文件。
而且耗时有一会。。。
写道
[admin@xxxx~]$ jmap -dump:format=b,file=formatDump 31664
Dumping heap to /home/admin/formatDump ...
Heap dump file created
[admin@xxxx~]$
jstack
用法:jstack [pid]
正如其名,visualVm里面的线程dump用的也就是这玩意了。
可以dump当前的所有线程堆栈。
写道
……
"Signal Dispatcher" daemon prio=10 tid=0x08117c00 nid=0x7bb7 runnable [0x00000000..0x44070b80]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=10 tid=0x080f6800 nid=0x7bb6 in Object.wait() [0x440cf000..0x440cff20]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
- locked <0x54c79120> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
"Reference Handler" daemon prio=10 tid=0x080f5800 nid=0x7bb5 in Object.wait() [0x44120000..0x44120fa0]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x54c1a290> (a java.lang.ref.Reference$Lock)
"VM Thread" prio=10 tid=0x080f2400 nid=0x7bb4 runnable
"GC task thread#0 (ParallelGC)" prio=10 tid=0x08072800 nid=0x7bb2 runnable
"GC task thread#1 (ParallelGC)" prio=10 tid=0x08073800 nid=0x7bb3 runnable
"VM Periodic Task Thread" prio=10 tid=0x0824c800 nid=0x7bc0 waiting on condition
JNI global references: 19493
jhat
用法:jhat -J-mx1024m heap_file_name
前面dump出来的二进制文件,现在用。
放在我这里用就是:jhat -J-mx1024m formatDump
。。。这玩意太慢了。。随便dump一个都500来M,真是恐怖~~~
写道
Reading from formatDump...
Dump file created Wed Dec 29 19:20:40 CST 2010
Snapshot read, resolving...
Resolving 9500142 objects...
#
# An unexpected error has been detected by Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 131072000 bytes for GrET in C:\BUILD_ARE
A\jdk6_13\hotspot\src\share\vm\utilities\growableArray.cpp. Out of swap space?
#
# Internal Error (allocation.inline.hpp:42), pid=5492, tid=8632
# Error: GrET in C:\BUILD_AREA\jdk6_13\hotspot\src\share\vm\utilities\growableA
rray.cpp
#
# Java VM: Java HotSpot(TM) Client VM (11.3-b02 mixed mode windows-x86)
# An error report file with more information is saved as:
# C:\Users\guoliang\Downloads\hs_err_pid5492.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
这个太尴尬了。。。Out of swap space?。。。。
jstatd
jstat(sun.tools.jstat)
jstat实用程序可以用于收集各种各样不同的统计数据。jstat统计数据被分类到“选项”中,这些选项在命令行中被指定作为第一参数。对于JDK 1.6来说,您可以通过采用命令-options运行jstat查看可用的选项清单。清单1中显示了部分选项:
清单1.jstat选项
1.
2.
3. -class
4. -compiler
5. -gc
6. -gccapacity
7. -gccause
8. -gcnew
9. -gcnewcapacity
10. -gcold
11. -gcoldcapacity
12. -gcpermcapacity
13. -gcutil
14. -printcompilation
实用程序的JDK记录将告诉您清单1中每个选项返回的内容,但是其中大多数用于收集垃圾的收集器或者其部件的性能信息。-class选项显示了加载及未加载的类(使其成为检测应用程序服务器或代码中ClassLoader泄露的重要实用程序,且-compiler和-printcompilation都显示了有关Hotspot JIT编译程序的信息。
默认情况下,jstat在您核对信息时显示信息。如果您希望每隔一定时间拍摄快照,请在-options指令后以毫秒为单位指定间隔时间。jstat将持续显示监控进程信息的快照。如果您希望jstat在终止前进行特定数量的快照,在间隔时间/时间值后指定该数字。
如果5756是几分钟前开始的运行SwingSet2程序的VMID,那么下列命令将告诉jstat每250毫秒为10个佚代执行一次gc快照转储,然后停止:
15. jstat -gc 5756 250 10
请注意Sun(现在的Oracle)保留了在不进行任何预先通知的情况下更改各种选项的输出甚至是选项本身的权利。这是使用不受支持实用程序的缺点。请参看Javadocs了解jstat输出中每一列的全部细节。