Vie*_*iet 7 java memory-leaks hibernate out-of-memory heap-dump
我在linux服务器上用java运行代码服务器端应用程序.我使用hibernate打开数据库会话,使用本机sql查询它,并始终通过try,catch,finally关闭此会话.
我的服务器使用非常高频率的休眠查询数据库.
我已经定义了MaxHeapSize,因为它是3000M,但它通常在RAM上使用2.7GB,它可以减少但比增加慢.有时它的内存使用量会增长到3.6GB,比我的MaxHeapSize在启动时定义的要多.
当使用的内存为3.6GB时,我尝试使用-jmap命令转储它,并获得一个大小仅为1.3GB的heapdump.
我使用eclipse MAT来分析它,这里是来自MAT的统治者树
我认为hibernate是问题,我有这么多的org.apache.commons.collections.map.AbstractReferenceMap $ ReferenceEntry.它可能无法通过垃圾收集进行处理,或者可能会变慢.
我该如何解决?
Vla*_*cea 10
您的IN查询列表中有250k个条目.即使是原生查询也会使数据库陷入困境.出于性能原因,Oracle将IN查询列表限制为1000,因此您应该这样做.
提供更多RAM并不能解决问题,您需要通过使用分页将选择/更新限制为最多1000个条目的批次.
Streaming也是一个选项,但是,对于如此大的结果集,keyset分页通常是最佳选择.
如果您可以在数据库中执行所有处理,那么您不必将250k记录从数据库移动到应用程序.许多RDBMS提供高级过程语言(例如PL/SQL,T-SQL)是有充分理由的.
| 归档时间: |
|
| 查看次数: |
13231 次 |
| 最近记录: |