使用Sun JDK自带JVM内存使用分析工具HProf可以分析JVM堆栈,从而找到占用内存较大的对象。这对应经常出现内存泄漏(OOM)的JAVA系统进行调优很有帮助。
HProf使用方法
· 在WeblogicServer启动脚本中增加-Xrunhprof:heap=sites,重新启动WeblogicServer。
· 使用kill -3
从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.
java.util.zip.ZipFile$1.
java.util.zip.ZipFile.getInputStream(ZipFile.java:212)
java.util.zip.ZipFile.getInputStream(ZipFile.java:183)
再进一步分析则需要应用开发人员对应用代码做相应的分析定位。
注意:使用HProf非常消耗资源,切记不要在生产系统使用。