问题描述
weblogic的8G内存快用完了,无法动弹。最后我打出了堆的快照文本版,发现这个类的实例数如下:1676170 53637440 org.hibernate.dialect.function.StandardSQLFunction请问这是hibernate导致的内存泄露吗?截了heap前面一段如下: num #instances #bytes class name---------------------------------------------- 1: 15204922 1976686888 [C 2: 14829022 711793056 java.util.HashMap$Entry 3: 3639041 624496040 [Ljava.util.HashMap$Entry; 4: 14928211 597128440 java.lang.String 5: 15849568 547661280 [Ljava.lang.String; 6: 3063227 236661312 [I 7: 3541079 226629056 java.util.HashMap 8: 3298829 158343792 java.util.Hashtable$Entry 9: 1236719 158300032 java.lang.reflect.Field 10: 2111606 151391384 [Ljava.lang.Object; 11: 4245281 138673976 [Z 12: 5367001 128808024 java.lang.Integer 13: 1639686 117194176 [[Ljava.lang.String; 14: 697296 105988992 java.lang.reflect.Method 15: 384938 94193368 [B 16: 96722 85889136 org.hibernate.persister.entity.SingleTableEntityPersister 17: 483610 81246480 org.hibernate.loader.entity.EntityLoader 18: 102502 76745048 [Lorg.apache.commons.collections.map.AbstractHashedMap$HashEntry; 19: 511824 71447968 <constMethodKlass> 20: 511824 69621248 <methodKlass> 21: 102876 61305040 [Ljava.util.Hashtable$Entry; 22: 49904 54155264 <constantPoolKlass> 23: 1676170 53637440 org.hibernate.dialect.function.StandardSQLFunction 24: 677054 48747888 org.hibernate.loader.DefaultEntityAliases 25: 741427 47451328 org.hibernate.tuple.StandardProperty 26: 49904 39234016 <instanceKlassKlass> 27: 491828 35411616 org.hibernate.event.FlushEntityEvent 28: 838169 33526760 org.hibernate.property.Dom4jAccessor$ElementGetter 29: 40434 31074368 <constantPoolCacheKlass> 30: 193444 30951040 org.hibernate.loader.entity.CascadeEntityLoader 31: 838169 26821408 org.hibernate.property.Dom4jAccessor$ElementSetter 32: 290196 24759432 [Lorg.hibernate.property.Getter; 33: 290196 24759432 [Lorg.hibernate.property.Setter; 34: 431149 24695944 <symbolKlass> 35: 96722 23213280 org.hibernate.tuple.entity.EntityMetamodel 36: 580122 23204880 org.hibernate.property.DirectPropertyAccessor$DirectSetter 37: 580122 23204880 org.hibernate.property.DirectPropertyAccessor$DirectGetter 38: 694792 22148992 [Ljava.lang.Class; 39: 677054 21665728 [Lorg.hibernate.loader.EntityAliases; 40: 677054 21665728 [Lorg.hibernate.type.EntityType; 41: 677054 21665728 [Lorg.hibernate.LockMode; 42: 677054 21665728 [Lorg.hibernate.persister.entity.Loadable; 43: 423055 20306640 java.util.concurrent.ConcurrentHashMap$HashEntry 44: 838169 20116056 org.hibernate.property.MapAccessor$MapSetter 45: 838169 20116056 org.hibernate.property.MapAccessor$MapGetter 46: 310800 19891200 java.util.LinkedHashMap$Entry 47: 491930 19677200 org.hibernate.engine.Cascade 48: 348729 19528824 java.io.ObjectStreamClass$WeakClassKey 49: 322340 18051040 org.hibernate.dialect.function.SQLFunctionTemplate 50: 280441 17948224 java.util.TreeMap$Entry 51: 207351 17719760 [[I 52: 204879 17477912 [[Z 53: 540236 17287552 org.hibernate.util.IdentityMap$IdentityMapEntry 问题补充:+++++++++++++++++++++++++++++++++++++++++ 发现问题所在了。确实有一个模块有问题,它使用了jpa,用的是Hibernate-3.6的实现,有个业务方法需要使用到EntityManagerFactory实例,调用的方法如下:public static EntityManagerFactory getPlatformEntityManagerFactory() { EntityManagerFactory factory=Persistence.createEntityManagerFactory("PLATFORM_DS"); return factory;}问题就出在这个方法上,不应该每次都创建一个EntityManagerFactory的,应该每次都返回原来的单例。否则这方法被大量调用,就会造成EntityManagerFactory无限创建,就造成了上面提到的内存泄露了。谢谢各位的答复。
解决方案
为什么不GC,肯定是因为那些东西在使用。内存都使用8G了,应该是程序没写好
解决方案二:
你看 HashMap 占用了那么多内存,应该是内存泄漏了吧。用 JProfiler 看看吧,问题那么明显,应该很容易就看出原因的。
解决方案三:
我也很奇怪。。。。能耗掉8g内存的vm, 那个jvm是啥子。。(对不起,这是夸张说法,我的意思是:应该不是你的应用造成的,该检查该机器上其他程序,比如数据库、缓存等)