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

Kou*_*avi 1 java eclipse multithreading memory-leaks memory-management

正如标题所暗示的那样,我在一个帖子中遇到了这个错误.

令人讨厌的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); 
}
Run Code Online (Sandbox Code Playgroud)

最后的String discreteObjects []声明是我得到错误的地方.我在一个线程中运行此代码.当我得到这个时,我有两个当前活动的线程.我也尝试过使用eclipse中的MAT工具.这里是一些内部图表文件的链接: PLC图表文件(dropbox URL)
如果有人对这个问题有任何想法,我将不胜感激.PS:我想删除循环虽然它在第一次循环传递中失败了.
(当程序失败时,我在输出中得到这个)

Expected data size: 10
Repeat: 0 ...
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid3793.hprof ...
Heap dump file created [1404020 bytes in 0.015 secs]
Exception in thread "1" java.lang.OutOfMemoryError: Java heap space
    at planetlab.app.factory.Worker$15.run(Worker.java:796)
    at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)

不相关的东西:
在堆栈溢出中发布帖子时,代码没有正确格式化/预期错误是什么?我花了15分钟才弄清楚要做什么:@:S:@

Pre*_*ton 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);   
Run Code Online (Sandbox Code Playgroud)