我的应用程序目前消耗了相当多的内存,因为正在运行物理模拟。问题在于,通常在第51次模拟时,Java会抛出错误,而这往往是由于堆空间不足(我的程序最终要运行数千个模拟)。
是否有任何方法可以不仅增加堆空间,还可以修改程序,使堆空间在每次运行后被清除,以便我可以运行任意数量的模拟?
编辑:谢谢大家。原来模拟器软件没有在每次运行后清除信息,而我已经将这些运行结果都存储在了一个ArrayList
中。
我的应用程序目前消耗了相当多的内存,因为正在运行物理模拟。问题在于,通常在第51次模拟时,Java会抛出错误,而这往往是由于堆空间不足(我的程序最终要运行数千个模拟)。
是否有任何方法可以不仅增加堆空间,还可以修改程序,使堆空间在每次运行后被清除,以便我可以运行任意数量的模拟?
编辑:谢谢大家。原来模拟器软件没有在每次运行后清除信息,而我已经将这些运行结果都存储在了一个ArrayList
中。
无法在程序运行时动态增加堆大小,因为Java虚拟机在启动时分配了堆空间。
但是,您可以使用此命令
java -Xmx1024M YourClass
将内存设置为1024,
或者,您可以设置最小和最大值。
java -Xms256m -Xmx1024m YourClassNameHere
有各种工具可用于帮助诊断此问题。JDK包括JVisualVM,它可以让您附加到正在运行的进程并显示可能正在失控的对象。Netbeans周围有一个包装器,效果相当不错。Eclipse有Eclipse Memory Analyzer,这是我最常用的一个,似乎更好地处理大型转储文件。还有一个命令行选项 -XX:+HeapDumpOnOutOfMemoryError ,它会在程序崩溃时给您一个文件,基本上是您进程内存的快照。您可以使用上述任何工具来查看它,在诊断此类问题时,它确实可以帮助很多。
根据程序工作的难度,它可能只是JVM不知道何时进行垃圾收集的简单情况,您也可以查看并行垃圾收集选项。
尝试添加-Xmx以获取更多内存(java -Xmx1024M YourClass
),并且不要忘记停止引用您不再需要的变量(内存泄漏)。
你是否保留了不再需要的变量引用(例如来自先前模拟的数据)?如果是这样,那么你就有了内存泄漏。你只需要找到发生泄漏的地方,并确保在不再需要这些变量时删除对它们的引用(如果它们超出作用域,则会自动发生此操作)。
如果你实际上需要所有来自先前模拟的数据保留在内存中,你需要增加堆大小或更改算法。
System.gc()
要求运行,但不能保证运行。-Xmx256m
来增加内存。