Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理;java.lang.OutOfMemoryError:java堆空间;错误?_Java_Jvm_Out Of Memory_Heap Memory - Fatal编程技术网

如何处理;java.lang.OutOfMemoryError:java堆空间;错误?

如何处理;java.lang.OutOfMemoryError:java堆空间;错误?,java,jvm,out-of-memory,heap-memory,Java,Jvm,Out Of Memory,Heap Memory,我正在Java5上编写一个客户端Swing应用程序(图形字体设计器)。最近,我遇到了java.lang.OutOfMemoryError:java堆空间错误,因为我在内存使用方面并不保守。用户可以打开无限数量的文件,程序将打开的对象保存在内存中。经过快速的研究,我发现和其他人说在Windows机器上JVM默认最大堆大小为64MB 在这种情况下,我应该如何处理这种限制 我可以使用java的命令行选项增加最大堆大小,但这需要计算可用RAM并编写一些启动程序或脚本。此外,增加到某个finitemax并

我正在Java5上编写一个客户端Swing应用程序(图形字体设计器)。最近,我遇到了
java.lang.OutOfMemoryError:java堆空间
错误,因为我在内存使用方面并不保守。用户可以打开无限数量的文件,程序将打开的对象保存在内存中。经过快速的研究,我发现和其他人说在Windows机器上JVM默认最大堆大小为
64MB

在这种情况下,我应该如何处理这种限制

我可以使用java的命令行选项增加最大堆大小,但这需要计算可用RAM并编写一些启动程序或脚本。此外,增加到某个finitemax并不能最终摆脱这个问题

我可以重写一些代码,以便经常将对象持久化到文件系统(使用数据库也是一样),从而释放内存。这可能行得通,但可能也要做很多工作


如果你能给我指出以上想法的细节或一些替代方案,如自动虚拟内存、动态扩展堆大小等,那就太好了。

最终,无论你在什么平台上运行,你都可以使用有限的最大堆。在Windows 32位中,这大约是
2GB
(不是堆,而是每个进程的内存总量)。恰好Java选择将默认值变小(可能是为了让程序员无法创建内存分配失控的程序,而不遇到这个问题,并且必须准确地检查它们在做什么)

因此,有几种方法可以用来确定所需的内存量或减少正在使用的内存量。Java或C等垃圾收集语言的一个常见错误是保留对不再使用的对象的引用,或者在可以重用对象时分配许多对象。只要对象有对它们的引用,它们就会继续使用堆空间,因为垃圾收集器不会删除它们

在这种情况下,您可以使用Java内存分析器来确定程序中的哪些方法正在分配大量对象,然后确定是否有办法确保不再引用这些对象,或者一开始就不分配它们。我过去使用的一个选项是“JMP”

如果您确定分配这些对象是有原因的,并且需要保留引用(取决于您正在执行的操作,可能是这种情况),那么启动程序时只需要增加最大堆大小。但是,一旦您完成了内存分析并了解了对象是如何分配的,您就应该更好地了解您需要多少内存


一般来说,如果您不能保证您的程序将在有限的内存中运行(可能取决于输入大小),您将始终遇到这个问题。只有在耗尽所有这些之后,您才需要研究将对象缓存到磁盘等。此时,您应该有一个很好的理由说“我需要Xgb的内存”,而您不能通过改进算法或内存分配模式来解决它。通常情况下,这只适用于在大型数据集(如数据库或某些科学分析程序)上运行的算法,然后缓存和内存映射IO等技术变得有用。

使用命令行选项
-Xmx
运行Java,该选项设置堆的最大大小


.

是的,使用
-Xmx
可以为JVM配置更多内存。
确保不会泄漏或浪费内存。获取堆转储并使用它来分析内存消耗

如果您需要在运行时监控内存使用情况,
java.lang.management
包提供了
MBean
,可用于监控VM中的内存池(例如,eden空间、终身生成等)以及垃圾收集行为

根据GC行为,这些MBean报告的可用堆空间会有很大的不同,特别是如果您的应用程序生成了许多后来进行GC-ed的对象,则更是如此。一种可能的方法是在每次完整GC之后监控可用堆空间,您可以使用这些空间来决定通过持久化对象释放内存

最终,您最好的选择是在性能保持可接受的情况下尽可能限制内存保留。正如前面的评论所指出的,内存总是有限的,但是你的应用程序应该有一个处理内存耗尽的策略

大警告——在我的办公室,我们发现(在一些windows机器上)Java堆的分配不能超过5.12亿。这原来是由于卡巴斯基反病毒产品安装在其中一些机器上。卸载该AV产品后,我们发现我们可以分配至少1.6gb,即
-Xmx1600m
(m是强制性的,否则会导致另一个错误“初始堆太小”)


不知道其他AV产品是否会发生这种情况,但可能是因为AV程序在每个地址空间中保留了一小块内存,从而防止了一次真正大的分配否则,您将需要一个特定于操作系统的启动器来设置所需的参数。

我在其他地方读到,您可以尝试-catch java.lang.OutOfMemoryError,在catch块上,您可以
//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);

Runtime runtime = Runtime.getRuntime();

if(runtime.freeMemory()<minRunningMemory)
 System.gc();
 Run As - Run Configuration - Arguments - Vm Arguments, 
-Xmx2048m
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m 
-Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m 
-XX:MaxPermSize=256m -XX:+DisableExplicitGC"
-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)
   touch /opt/tomcat/bin/setenv.sh
nano  /opt/tomcat/bin/setenv.sh 

export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"
...
org.gradle.jvmargs=-XX\:MaxHeapSize\=1024m -Xmx1024m