Java运行时环境检测到意外错误

时间:2014-07-18 05:55:32

标签: java hibernate jboss

我正在通过java生成报告(CSV),我正在使用hibernate从数据库中获取数据。

我的部分代码如下:

ScrollableResults items = null;
String sql = " from " + topBO.getClass().getName() + " where " + spec;
StringBuffer sqlQuery = new StringBuffer(sql);
Query query = sessionFactory.getCurrentSession().createQuery(sqlQuery.toString());
items = query.setFetchSize( 1000 ).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY);
list = new ArrayList<TopBO>();
// error occurs in while loop. at the time of fetching more data.
while(items.next())
{           
     TopBO topBO2 =(TopBO) items.get(0); 
     list.add(topBO2 );
     topBO2 = null;
}
sessionFactory.evict(topBO.getClass());

环境信息

  • JVM配置:Xms512M -Xmx1024M -XX:MaxPermSize = 512M -XX:MaxHeapSize = 1024M
  • Jboss :JBoss 5.1运行时服务器
  • Oracle :10g
  • JDK :jdk1.6.0_24(32位/ x86)
  • 操作系统:Window 7(32位/ x86)
  • Ram :4gb

错误:当我获取高达50k的数据时,它可以正常工作。但是当我更多地获取数据时。它给了我错误:

#
# An unexpected error has been detected by Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 4096000 bytes for GrET in C:\BUILD_AREA\jdk6_11\hotspot\src\share\vm\utilities\growableArray.cpp. Out of swap space?
#
#  Internal Error (allocation.inline.hpp:42), pid=1408, tid=6060
#  Error: GrET in C:\BUILD_AREA\jdk6_11\hotspot\src\share\vm\utilities\growableArray.cpp
#
# Java VM: Java HotSpot(TM) Client VM (11.0-b16 mixed mode windows-x86)
# An error report file with more information is saved as:
# D:\jboss-5.1.0.GA\bin\hs_err_pid1408.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

当我设置Xms512M -Xmx768M -XX:MaxPermSize=512M -XX:MaxHeapSize=768M它会引发另一个例外:

java.lang.OutOfMemoryError: Java heap space

2 个答案:

答案 0 :(得分:0)

java.lang.OutOfMemoryError通常是由于缺少必需的堆空间造成的。你可以做的是使用标志-Xmx1548M或更多MB来增加你的jvm堆大小。

但是你似乎耗尽了系统内存,因此你应该使用更好的JVM来更有效地处理内存,我建议你进行JVM升级。如何将JVM 1.6升级到更新版本?

答案 1 :(得分:0)

这个问题的解决方案可能并不常见。尝试使用文章OutOfMemoryError: Out of swap space - Problem Patterns中的建议。

  

有多种情况可以导致原生   的OutOfMemoryError。

     
      
  • 由于在单个32位JVM上部署了太多Java EE应用程序而导致本机堆(C-Heap)耗尽(与大型Java结合使用)   堆,例如2 GB)*最常见的问题*
  •   
  • 由于非最佳Java堆大小导致的本机堆(C-Heap)耗尽,例如Java堆太大,无法满足单个应用程序的需求   32位JVM
  •   
  • 由于创建的Java线程太多而导致本机堆(C-Heap)耗尽,例如允许Java EE容器创建太多的线程   在单个32位JVM上
  •   
  • OS物理/虚拟内存耗尽,阻止HotSpot VM将本机内存分配给C-Heap(32位或64位VM)
  •   
  • OS物理/虚拟内存耗尽,阻止HotSpot VM在运行时扩展其Java堆或PermGen空间(32位或   64位虚拟机)
  •   
  • C-Heap /本机内存泄漏(第三方监控代理/库,JVM bug等)
  •   

我会从这样的建议开始进行故障排除:

  

查看您的JVM内存设置。对于32位VM,Java堆为2 GB +   真的可以开始增加C-Heap的压力点;取决于如何   您已部署的许多应用程序,Java Threads等......在这种情况下,   请确定您是否可以安全地减少大约256个Java堆   MB(作为起点)并查看它是否有助于改善您的JVM内存   “平衡”。

也可以尝试(但在人工成本方面更难)将环境升级到64位版本的操作系统和JVM,因为在x64操作系统上可以更好地利用4Gb的物理RAM。