无法GC导致内存暴涨

问题描述

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是啥子。。(对不起,这是夸张说法,我的意思是:应该不是你的应用造成的,该检查该机器上其他程序,比如数据库、缓存等)

时间: 2024-10-31 06:22:36

无法GC导致内存暴涨的相关文章

记一次 Node.js 应用内存暴涨分析

起因 之前 TMS 在运行时 CPU 中占用率和内存占用一直很高,导致应用运行状态不是很良好,需要频繁重启.经过排查,找出了部分原因: 使用的 html-minifier 模块有问题,如果输入的内容是一个有错误的 HTML 结构,会使解析进入死循环,导致 CPU 占用率 100%. 在使用 vm 模块时,使用姿势错误,导致内存占用无法释放,使内存占用暴涨. 第一个问题我们今天不予讨论,主要来说一下第二个问题. VM(Virtual Machine) 模块 我们就先了解下 VM 这个模块. 从它的

未释放事件Handler可能导致内存泄漏

以前曾看见过这样一个问题:托管代码会不会导致内存泄漏.自己对GC的了解也不是很深,但还是比较赞成这样的观点:托管代码不会产生内存泄漏,除非你没有正确释放非托管资源. 今天看到一个非常有趣的例子,关于没有释放事件的Handler导致的内存泄漏. 以前对于释放Handler的观念是一点也没有,这主要因为没此方面的意识,没有养成好的习惯.只知道当关心这个事件的时候就注册一下, 暂时不关心了就移除掉.却从来没有想到最终不移除不必要的Handler会导致此类无法被正常回收,导致不必要的内存浪费. 事情是这

redis-Redis2.8.17 内存暴涨怎么解决?

问题描述 Redis2.8.17 内存暴涨怎么解决? 现在公司用Redis来作为内存管理数据,自己写一个模拟队列方式来处理大数据 写读来支撑,却发现内存一直在暴涨,要达到服务器物理内存,导致系统性能下降,在网上搜了一番,如下方式我试过了都起不作用: 1. 删除过期key(因为我采用队列方式只有一个key,所以不能这样做). 2. 增加服务器内存(这个有点不现实) 3. 配置文件中配置限制内存maxmemory,这个当达到峰值时候,莫名的报一些 Redis服务错误,导致服务停止. 4. Redis

关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看

问题描述 关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看 之前一段时间使用一段时间老是导致内存升高,而且内存也不回收,一步一步的排除了很多地方, 到最后发现问题是出在adapter中,但是也不知道怎么改了. 大神帮看看哪些地方会导致内存泄露! public void setmList(List mList) { if (isgroup) { isDiaplayNickName = SharePreferenceUtil.get_Boolean

WPF循环加载图片导致内存溢出如何解决

程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成"动画". 生成BitmapImage的方法有多种: 1.var source=new BitmapImage(new Uri("图片路径",UriKind.xxx)); 一般的场景使用这种方法还是比较方便快捷,但是对于本场景,内存恐怕得爆.2. var data =File.ReadAllBytes("图片路径"); var ms = new System.IO.MemoryStrea

sqlserver-加锁导致内存占用逐渐加大?怎么办

问题描述 加锁导致内存占用逐渐加大?怎么办 2 这是第一个窗体的代码 3 4 private void button1_Click(object sender, EventArgs e) 5 { 6 while (true) 7 { 8 SqlConnection conn = new SqlConnection("Data Source=DMWIAJHLRQMX6QS;Initial Catalog=test;Persist Security Info=True;User ID=sa;Pwd=

不停的用simpleadapter加载更新gridview导致内存溢出,怎么解决

问题描述 不停的用simpleadapter加载更新gridview导致内存溢出,怎么解决 public class Myragment extends Fragment { private GridView grid; ArrayList> arraylist = null; int[] temp = new int[] {R.id.cell}; String[] temp1 = new String[] { "cell" }; MyHandler handler = new

winform的webbrowser显示的网页中加载flash会导致内存飙升怎么解决

问题描述 winform的webbrowser显示的网页中加载flash会导致内存飙升怎么解决 5C winform的webbrowser显示的网页中加载flash会导致内存飙升,报错如下: 问题签名: 问题事件名称: APPCRASH 应用程序名: iexplore.exe 应用程序版本: 9.0.8112.16421 应用程序时间戳: 4d76255d 故障模块名称: Flash32_11_2_202_235.ocx 故障模块版本: 11.2.202.235 故障模块时间戳: 4f9af5a

viewpager加载多张大图导致内存溢出

问题描述 viewpager加载多张大图导致内存溢出 同样的app程序,在原生Android系统上就不出现内存溢出,在华为系统上就会出现内存溢出的情况, viewpager 加载多个布局,每个布局里面都有一张大图,实现了类似于图片游览器的功能. 里面有写回收图片操作和压缩为原图一半的操作