分类: Java
2016-09-13 00:46:27
jps用于获取启动的java程序的进程号(pid),可能存在正在运行的多个java进程。用pid可以细查某个进程的状态。jmap:
jmap是分析进程内存占用状态的神器,可以查看指定pid的内存使用状态。
jmap [option] {pid}
常用选项包括:
gc log:-histo:可以查看该pid占用内存中,各类对象的实例数和占用空间。通过不同类型对象的占用空间,可以初步判断是哪段代码可能出现的内存泄漏(通过判断哪里的代码会大量new出某种对象)。-histo:live 仅打印活对象的信息。-dump:[live,]format=b,file={path} 使用hprof二进制形式,输出jvm的heap内容到path下。live可选,和上面一样。
-finalizerinfo 打印正等候回收的对象的信息。
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况。
gc log是指java运行时,垃圾回收的日志。默认是关闭状态,在启动程序时可以添加选项打印gc log。选项如下:-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息-Xloggc:{path} 日志文件的输出路径以上选项可以合并使用。指定gc日志进入的文件,详细记录了gc的日志。每条日志会说明该条日志对应哪个区的gc,前后占用内存,gc用时间等等。
对于新生代回收的一行日志,其基本内容如下:
2014-07-18T16:02:17.606+0800: 611.633: [GC 611.633: [DefNew: 843458K->2K(948864K), 0.0059180 secs] 2186589K->1343132K(3057292K), 0.0059490 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
含义如下:
2014-07-18T16:02:17.606+0800(当前时间戳): 611.633(时间戳): [GC(表示Young GC) 611.633: [DefNew(单线程Serial年轻代GC): 843458K(年轻代垃圾回收前的大小)->2K(年轻代回收后的大小)(948864K(年轻代总大小)), 0.0059180 secs(本次回收的时间)] 2186589K(整个堆回收前的大小)->1343132K(整个堆回收后的大小)(3057292K(堆总大小)), 0.0059490 secs(回收时间)] [Times: user=0.00(用户耗时) sys=0.00(系统耗时), real=0.00 secs(实际耗时)]
老年代回收的日志如下:
2014-07-18T16:19:16.794+0800: 1630.821: [GC 1630.821: [DefNew: 1005567K->111679K(1005568K), 0.9152360 secs]1631.736: [Tenured: 2573912K->1340650K(2574068K), 1.8511050 secs] 3122548K->1340650K(3579636K), [Perm : 17882K->17882K(21248K)], 2.7854350 secs] [Times: user=2.57 sys=0.22, real=2.79 secs]