jvm入门

1、GC log配置及参数

-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

 

2、控制台输出

-verbose:gc   控制台输出
-Xloggc:/users/gc.log       文件输出,而且还可以打印时间

 

3、分代回收机制

jvm入门_第1张图片

 

younggc解读

jvm入门_第2张图片

 

括号中的值,这块区域通俗的讲就是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

fullgc解读

jvm入门_第3张图片

 

 

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

4、jvm参数调整

 

-Xms:设置启动时初始堆的大小

-Xmx:设置应用程序能获得的最大堆的大小

-Xss:设置线程栈的大小

-XX:NewSize:设置新生代的大小

-XX:NewRatio:设置年老代与新生代的比例

-XX:SurviorRatio:设置新生代中eden区与survivor区的比例

-XX:MaxPermSize:设置最大的永久区大小

-XX:PermSize:设置永久区的初始值

5、dump堆快照

导出二进制文件查看

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

6、自带命令

(1)jps

 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

(2)jmap

 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

(3)jhat

jhat(Java Head Analyse Tool ):是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等。
jhat export.bin -J-Xmx1g
http://localhost:7000/ 查看

(4)jstat

 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次样本

   jvm入门_第4张图片

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

(5)jstack

 Jstack,(Java Stack Trace) 用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64"

   jvm入门_第5张图片

 

(6)jconsole

    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

 

(7)jvisualvm

 

jvisualvm命令(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool) 。jvisualvm同jconsole都是一个基于图形化界面的、可以查看本地及远程的JAVA GUI监控工具,Jvisualvm同jconsole的使用方式一样,直接在命令行打入Jvisualvm即可启动,不过Jvisualvm相比,界面更美观一些,数据更实时。

输入jvisualvm,然后选择要监控的pid

(8)javamelody

JavaMelody能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、Guice)的执行数量,平均执行时间,错误百分比等。图表可以按天,周,月,年或自定义时间段查看。

http://code.google.com/p/javamelody/

你可能感兴趣的:(jvm入门)