-Xloggc:/users/caibosi/gc.log (给出gc前后堆栈情况,包括堆栈总大小)
-XX:+PrintGCDetails (还给出新生代、年老代、永久区各自的gc信息)
-XX:+PrintGCTimeStamps (给出gc发生的时间)
-XX:+PrintHeapAtGC (每次gc的时候打印堆的使用情况,包括gc前后eden与survivior)
-XX:+PrintGCApplicationStoppedTime (GC发生时停顿时间)
-XX:+PrintGCApplilcationConcurrentTime (应用程序在GC停顿期间的执行时间)
出现oom异常时dump
-XX:+HeapDumpOnOutOfMemoryError (在出现异常时dump堆快照)
-XX:HeapDumpPath=C:\M.hprof
-verbose:gc 控制台输出
-Xloggc:/users/gc.log 文件输出,而且还可以打印时间
括号中的值,这块区域通俗的讲就是JVM从OS那里已经申请到并且已经标记为自己占用的内存空间(尽管这块内存空间JVM自己可能并未分配给实际的Java对象),或称为堆空间的总量。the total of the generations (perm一般与垃圾回收没啥关系,total=young+old)
+PrintGCDetails
Minor gc减少的值不是严格等于后边的JVM堆内存减少的值,大约等于/一般情况下是等于(有的差几k,有的差好几千k)
668.888: [GC [PSYoungGen: 977513K->31712K(1001600K)] 1846869K->911014K(2050176K), 0.0212780 secs] [Times: user=0.14 sys=0.00, real=0.02 secs]
977513-31712=945801
1846869-911014=935855
644.175: [GC [PSYoungGen: 981287K->20024K(1000320K)] 1807053K->866093K(2048896K), 0.0270670 secs] [Times: user=0.15 sys=0.01, real=0.03 secs]
981287-20024=961263
1807053-866093=940960
3879.810: [Full GC [PSYoungGen: 30267K->0K(994304K)] [ParOldGen: 1017074K->282915K(1048576K)] 1047341K->282915K(2042880K) [PSPermGen: 91615K->91615K(92416K)], 0.3570290 secs] [Times: user=1.78 sys=0.01, real=0.36 secs]
年轻代+年老代总减少值:30267-0+1017074-282915=764426
JVM总减少值:1047341-282915=764426
Perm区总减少值:91615-91615=0
730.745: [Full GC [PSYoungGen: 19180K->0K(1001792K)] [ParOldGen: 1018653K->295926K(1048576K)] 1037834K->295926K(2050368K) [PSPermGen: 92397K->91535K(92416K)], 1.0207170 secs] [Times: user=4.51 sys=0.87, real=1.02 secs]
年轻代+年老代总减少值:19180-0+1018653-295926=741907
JVM总减少值(不包括perm):1037834-295926=741908
Perm区总减少值:92397-91535=862
-Xms:设置启动时初始堆的大小
-Xmx:设置应用程序能获得的最大堆的大小
-Xss:设置线程栈的大小
-XX:NewSize:设置新生代的大小
-XX:NewRatio:设置年老代与新生代的比例
-XX:SurviorRatio:设置新生代中eden区与survivor区的比例
-XX:MaxPermSize:设置最大的永久区大小
-XX:PermSize:设置永久区的初始值
导出二进制文件查看
jps -lvm (see target jvm pid)
jmap -dump:format=b,file=/users/caibosi/export.bin -F 2817
jhat export.bin -J-Xmx1g
或者直接在内存查看
jps -lvm
jmap -histo pid -J-Xmx1g
内存可能不够,可以这样设置:-J-Xmx1g
jps -- Java Virtual Machine Process Status Tool 可以列出本机所有java进程的pid jps [ options ] [ hostid ] 选项 -q 仅输出VM标识符,不包括class name,jar name,arguments in main method -m 输出main method的参数 -l 输出完全的包名,应用主类名,jar的完全路径名 -v 输出jvm参数 -V 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 -J option 传递参数到vm,例如: -J-Xms48m hostid [protocol:][[//]hostname][:port][/servername] jps –lvm 127.0.0.1
Jmap (Java Memory Map) 的用途是为了展示java进程的内存映射信息,或者堆内存详情 (1)jmap -histo [:live] pid [>mem.txt] 打印堆的对象统计,包括对象数、内存大小等等(方括号里面为可选参数,要加时去掉方括号即可) (2)jmap -heap pid 展示pid的整体堆信息 (3)jmap -dump:[live,]format=b,file=<filename> --dump堆到文件,live指明是活着的对象,file指定文件名,b就是binary的意思,以二进制的格式导出 (4)jmap -finalizerinfo 打印等待回收对象的信息 (5)jmap -permstat 打印java堆perm区的classloader统计 (6)-F 强制,在jmap -dump或jmap -histo中使用,如果pid没有相应的回复 -J 提供jvm选项,如:-J-Xms256m
jhat(Java Head Analyse Tool ):是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等。 jhat export.bin -J-Xmx1g http://localhost:7000/ 查看
Jstat 全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。 jstat -gcutil 2834 250 9 通常用-gcutil来查看gc的统计情况 vmid — VM的进程号,即当前运行的java进程号 interval– 间隔时间,单位为秒或者毫秒 count — 打印次数,如果缺省则打印无数次 在250毫秒的时间间隔里面取9次样本
S0 — Heap上的 Survivor space 0 区已使用空间的百分比 S1 — Heap上的 Survivor space 1 区已使用空间的百分比 E — Heap上的 Eden space 区已使用空间的百分比 O — Heap上的 Old space 区已使用空间的百分比 P — Perm space 区已使用空间的百分比 YGC — 从应用程序启动到采样时发生 Young GC 的次数 YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒) FGC — 从应用程序启动到采样时发生 Full GC 的次数 FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒) http://java.sun.com/javase/6/docs/technotes/tools/share/jstatd.html http://www.51testing.com/?uid-77492-action-viewspace-itemid-203728 http://www.oracle.com/technetwork/java/javase/tooldescr-136044.html#gblfb
Jstack,(Java Stack Trace) 用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64"
jconsole命令(Java Monitoring and Management Console)。一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打 jconsole,选则进程就可以了。
Jconsole 打开界面后,选择要监控的进程 或者直接 jconsole –f pid 可以直接用来替代jmap、jhat、jsat等命令,动态监视jvm 需要注意的就是在运行jconsole之前,必须要先设置环境变量DISPLAY,否则会报错误,Linux下设置环境变量如下: export DISPLAY=:0.0 http://blog.csdn.net/fenglibing/article/details/6411965
jvisualvm命令(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool) 。jvisualvm同jconsole都是一个基于图形化界面的、可以查看本地及远程的JAVA GUI监控工具,Jvisualvm同jconsole的使用方式一样,直接在命令行打入Jvisualvm即可启动,不过Jvisualvm相比,界面更美观一些,数据更实时。
输入jvisualvm,然后选择要监控的pid
JavaMelody能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、Guice)的执行数量,平均执行时间,错误百分比等。图表可以按天,周,月,年或自定义时间段查看。
http://code.google.com/p/javamelody/