HPROF又什么是?HPROF是J2SE自带的一个简单的profiler
agent。 他是一个动态链接库文件,监控CPU的使用率,Heap分配情况等。将这些信息输出到文件或到socket。
java –Xrunhprof
ToBeProfiledClass [:help]|[:=,
...]
例如:
>java
-Xrunhprof:heap=all
org.colimas.jni.test.JniTest
在当前目录会生成java.hprof.txt文件。文件内记载了JVM运行时Heap的运行情况
Sun JDK自带JVM内存使用分析工具HProf
2008-10-14 11:27
Sun
JDK自带JVM内存使用分析工具HProf 使用Sun
JDK自带JVM内存使用分析工具HProf可以分析JVM堆栈,从而找到占用内存较大的对象。这对应经常出现内存泄漏(OOM)的JAVA系统进行调优很有帮助。
HProf使用方法
· 在WeblogicServer启动脚本中增加-Xrunhprof:heap=sites,重新启动WeblogicServer。
· 使用kill -3
或退出WeblogicServer均会生成java.hprof.txt文件,直接打开此文件便可分析JVM的具体运行情况。
tomcat的生成在bin目录下
从java.hprof.txt记录的JVM堆栈结果中可以发现JVM占用内存较大的对象:
percent live alloc'ed stack class
rank self
accum bytes
objs bytes objs trace name
1 4.57%
4.57% 2289696 47702 8392224 174838 4251 [C
2 3.99%
8.57% 2000016 1 2000016 1
12308 [C
3 3.65%
12.22% 1827552 9622 1852672 10082 43265 [C
4 2.58%
14.80% 1293912 53913 3929424 163726 4258 java.lang.String
5 2.05%
16.85% 1028664 7585 3207272 24923 4252 [C
6 2.03%
18.88% 1015816 159 1015816 159 18694 [B
7 1.88%
20.77% 942080 230 2740224 669
20416 [B
8 1.61%
22.37% 805752 2142 2150856 4635
45318 [B
9 1.60%
23.98% 802880 772 802880 772
24710 weblogic.servlet.utils.URLMatchMap$URLMatchNode
10 1.60%
25.57% 799400 19985 2781400
69535 45073 cnc.util.Field
11 1.36%
26.93% 679360 3805 679360
3805 494 [B
12 1.35%
28.28% 674856 28119 5181240
215885 2985 java.util.HashMap$Entry
……
……
96 0.19%
63.73% 94776
3112 94776 3112 9146 [C
97 0.19%
63.92% 93456
3894 123936 5164 23631 java.lang.String
98 0.19%
64.10% 93224
3884 123968 5165 23644 java.lang.String
99 0.19%
64.29% 93192
3883 123936 5164 23636 java.lang.String
100 0.18%
64.47% 89528
238 240264 520 33227 [B
101 0.17%
64.64% 86448
1901 103472 2255 18715 java.lang.Object
102 0.17%
64.81% 85464
676 85768 695 18715 [S
103 0.17%
64.98% 85184
1331 85184 1331 28266
weblogic.ejb20.internal.MethodDescriptor
104 0.17%
65.15% 84224
752 84224 752 24148
weblogic.servlet.internal.dd.ServletDescriptor
105 0.17%
65.32% 84136
528 50471136
348769 63
[C
106 0.16%
65.48% 79968
1428 388976 6946 5503 java.lang.reflect.Method
107 0.15%
65.63% 77520
1615 77520 1615 27967
weblogic.ejb20.deployer.mbimpl.MethodInfoImpl
108 0.15%
65.79% 77056
4816 469808 29363 20250 java.lang.Object
109 0.15%
65.94% 76960 74 76960 74 23695 [B
110 0.15%
66.09% 76104
3171 215040 8960 45071 cnc.util.FyCol
111 0.15%
66.24% 74688
3112 74688 3112 9152
java.util.Hashtable$Entry
112 0.15%
66.39% 74688
3112 74688 3112 9147
java.lang.String
113 0.15%
66.54% 74280 61 794328 788 45313
[C
114 0.14%
66.68% 72480
1510 436032 9084 45353 [C
115 0.14%
66.82% 70720 68 70720 68 25869 [B
116 0.14%
66.97% 70720 68 70720 68 27448 [B
117 0.14%
67.11% 70272
1279 142672 2439 5503 [C
118 0.14%
67.24% 69256 86 69256 86 6584 [S
119 0.13%
67.38% 67056 66 67056 66 28882
java.lang.Object
120 0.13%
67.51% 66176
752 66176 752 24170
weblogic.servlet.internal.dd.UIDescriptor
121 0.13%
67.64% 65688
715 65688 715 25389 [C
122 0.13%
67.77% 65600 4
885600 54 23939 [C
123 0.13%
67.90% 65600 4
623200 38 40639 [C
124 0.13%
68.03% 65576
367 65576 367 51686 [C
125 0.13%
68.17% 65568 2 65568 2 30610
java.util.HashMap$Entry
126 0.13%
68.30% 65568 2
130816 16 43271
java.util.HashMap$Entry
127 0.13%
68.43% 65552 1 65552 1 16617
[B
128 0.13%
68.56% 64600
1615 64600 1615 27969
java.util.HashMap
129 0.13%
68.68% 63888
2662 64032 2668 16951
java.util.HashMap$Entry
130 0.13%
68.81% 63888
2662 64032 2668 16997
java.util.HashMap$Entry
131 0.13%
68.94% 63888
2662 64032 2668 16996
weblogic.rmi.internal.ClientMethodDescriptor
132 0.13%
69.07% 63888
2662 99120 4130 16949
java.lang.String
133 0.13%
69.19% 63888
2662 64032 2668 16976
java.lang.String
134 0.13%
69.32% 63232
152 63232 152 9655
weblogic.utils.collections.ConcurrentHashMap$Entry
135 0.13%
69.45% 63232
152 63232 152 9704
weblogic.utils.collections.ConcurrentHashMap$Entry
136 0.12%
69.57% 62168
3885 82632 5164 23628 [B
137 0.12%
69.69% 61680
406 66904
468 1 [C
138 0.12%
69.82% 61504 4
246016 16 47372 [B
139 0.12%
69.94% 61144 36 91019160
23904 92
[B
140 0.12%
70.06% 61040
763 61040 763 24194
weblogic.servlet.internal.dd.ServletMappingDescriptor
141 0.12%
70.18% 60400
1510 363360 9084 45338 java.util.Hashtable
142 0.12%
70.30% 59544
827 59544 827 24746
weblogic.servlet.internal.ServletRuntimeMBeanImpl
143 0.12%
70.42% 59248
1058 484984 8664 33236 oracle.jdbc.ttc7.TTCItem
144 0.12%
70.53% 58152
232 187176 764 748 [C
145 0.12%
70.65% 57888
2412 161904 6746 16621 java.lang.String
146 0.11%
70.77% 57400
1435 57400 1435 16855
java.util.HashMap
……
……
根据以上的结果,在java.hprof.txt中定位到导致分配大内存的操作如下:
TRACE 63:
java.lang.StringBuffer.expandCapacity(StringBuffer.java:202)
java.lang.StringBuffer.append(StringBuffer.java:401)
java.util.zip.ZipFile.getEntry(ZipFile.java:148)
java.util.jar.JarFile.getEntry(JarFile.java:198)
TRACE 92:
java.util.zip.InflaterInputStream.(InflaterInputStream.java:71)
java.util.zip.ZipFile$1.(ZipFile.java:240)
java.util.zip.ZipFile.getInputStream(ZipFile.java:212)
java.util.zip.ZipFile.getInputStream(ZipFile.java:183)
再进一步分析则需要应用开发人员对应用代码做相应的分析定位。
注意:使用HProf非常消耗资源,切记不要在生产系统使用。