解析java.lang.OutOfMemoryError:Java堆空间

时间:2011-08-28 16:11:35

标签: java multithreading eclipse memory-management memory-leaks

正如标题所示,我在一个帖子中收到了这个错误。

违规的LOC看起来像这样:

for (int i = 0; i < objectListSize; i++) {
   logger.INFO("Loop repeat: "+i+" ...", true);
   final Double discreteScore = sp.getDouble(superPeerSocket);
   final int expectedObjectIDs = sp.getInteger(superPeerSocket);
   final String discreteObjects[] = new String[expectedObjectIDs];
   for ( int j = 0; j < expectedObjectIDs; j++)
      discreteObjects[j] = sp.getString(superPeerSocket);
   htPlus.attachInitialDiscreteList2L1(discreteScore, discreteObjects); 
}

最后的String discreteObjects []声明是我得到错误的地方。我在一个线程中运行此代码。当我得到这个时,我有两个当前活动的线程。我也尝试过使用eclipse中的MAT工具。这里是一些内部图表文件的链接: PLC chart files (dropbox URL)
如果有人对这个问题有任何想法,我将不胜感激。 P.S。:我想删除循环虽然它在第一次循环传递中失败了 (当程序失败时,我在输出中得到这个)
for (int i = 0; i < objectListSize; i++) {
   logger.INFO("Loop repeat: "+i+" ...", true);
   final Double discreteScore = sp.getDouble(superPeerSocket);
   final int expectedObjectIDs = sp.getInteger(superPeerSocket);
   final String discreteObjects[] = new String[expectedObjectIDs];
   for ( int j = 0; j < expectedObjectIDs; j++)
      discreteObjects[j] = sp.getString(superPeerSocket);
   htPlus.attachInitialDiscreteList2L1(discreteScore, discreteObjects); 
}
不相干的东西:
在堆栈溢出中发布帖子时,代码没有正确格式化/预期错误是什么?我花了15分钟才弄清楚要做什么:@:S:@

1 个答案:

答案 0 :(得分:6)

每个Java程序都在沙箱中运行。虽然您的操作系统可能有10 GB的RAM可用,但您的应用可能只有128 MB。

您需要确保应用程序通过使用-Xms -Xmx参数为JVM分配了足够的ram。 -Xms表示最小值,-Xmx表示最小值

评论中建议您的expectedObjectID似乎有点高。我当然会检查出来。但是,您可以使用以下代码来了解内存使用情况和可用内存。使用该信息,您可以相应地调整-Xms -Xmx。

祝你好运!

Runtime runtime = Runtime.getRuntime();  

long maxMemory = runtime.maxMemory();  
long allocatedMemory = runtime.totalMemory();  
long freeMemory = runtime.freeMemory();  

System.out.println("free memory: " + freeMemory / 1024);  
System.out.println("allocated memory: " + allocatedMemory / 1024);  
System.out.println("max memory: " + maxMemory /1024);  
System.out.println("total free memory: " +   
   (freeMemory + (maxMemory - allocatedMemory)) / 1024);