Tomcat サーバーにデプロイされた単純な webapp があります。webapp は REST Web サービスであり、各 Web リソースは MySQL データベースからデータをロードし、XML または JSON ドキュメントを返します。次のフレームワーク スタックを使用します: Jersey (1.14) + Spring (3.1) + Hibernate (4.1) + EHCache (2.5.1)。
jMeter で webapp をテストしました: web リソースを要求するために 5 つのスレッドを開始しました。数分後、ヒープがゆっくりといっぱいになり始めて 99% に達し、最終的に OOM 例外が返されます。メモリリークかどうかはわかりませんがorg.hibernate.hql.internal.ast.tree.SqlFragment
、メモリヒープに大量のオブジェクトが表示されると?!!
/usr/java/jdk/bin/jmap -histo:live 17047 > /tmp/histo.txt
num #instances #bytes class name
----------------------------------------------
1: 720143 69133728 org.hibernate.hql.internal.ast.tree.SqlFragment
2: 510537 63559320 [C
3: 360221 34581216 org.hibernate.hql.internal.ast.tree.BinaryLogicOperatorNode
4: 704652 33823296 java.util.HashMap$Entry
5: 360223 31699624 org.hibernate.hql.internal.ast.tree.SqlNode
6: 697354 27894160 java.lang.String
7: 370975 26710200 org.hibernate.hql.internal.ast.tree.Node
8: 171241 25623320 <constMethodKlass>
9: 208125 24948176 [Ljava.lang.Object;
10: 171241 20568632 <methodKlass>
11: 16012 17827384 <constantPoolKlass>
12: 383070 16623136 [I
13: 34829 15170176 [Ljava.util.HashMap$Entry;
14: 226869 12885896 <symbolKlass>
15: 16012 12590168 <instanceKlassKlass>
ここで私のjvmオプション:
JAVA_OPTS="-Xms1g -Xmx1g -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=30"