Unix交换和避免java堆空间异常



当我运行hypergraph构建应用程序时,我得到了这个异常

    java.lang.OutOfMemoryError: Java heap space

我使用ubuntu 12.04异常发生前几分钟free -m命令的输出为:

noura@noura-Inspiron-N5050:~$ free -m
         total       used       free     shared    buffers     cached
Mem:          3939       2672       1266          0         80        610
-/+ buffers/cache:       1981       1957
Swap:         7328         65       7263

我注意到交换没有被充分利用可以利用它来避免此异常

java虚拟机有一些限制,您可以在启动java命令时增加堆栈和堆限制。

显然你必须传递像

这样的东西
java -Xmx6g myprogram

其中6g应该将堆限制为6 GiB

增加Java中的堆大小

OutOfMemory错误可能由于多种原因而发生(例如,由于程序中的内存泄漏导致堆耗尽,您的程序需要更多内存来运行,本机内存耗尽等)。找出OutOfMemory的原因的最好方法是让JVM在进入OutOfMemory时生成一个堆转储。你可以使用-XX:+HeapDumpOnOutOfMemoryError选项来实现。

生成堆转储后,可以使用eclipse内存分析器分析堆。

http://www.eclipse.org/mat/

分析将确定您是否有内存泄漏或您的程序是否真的需要额外的内存。如果需要额外的内存,可以使用-Xmx选项进行配置。

默认限制是主内存的1/4。如果你提高你的最大值,你可以使用更多。

你应该注意:

  • 为JVM应用程序使用交换空间是一个非常糟糕的主意,因为GC会杀死你的进程,如果不是你的机器的话。
  • 买更多内存可能值得考虑,你可以花300美元买64 GB。
顺便说一句,我给我8岁的儿子买了一台他自己做的电脑。;) 售价240英镑,8gb内存。

最新更新