最终,无论您在什么平台上运行,您总是可以使用有限的最大堆。在 Windows 32 位中,这大约是 2gb(不是特别是堆,而是每个进程的内存总量)。碰巧Java恰好使默认值更小(大概是这样程序员无法创建具有失控内存分配的程序而不会遇到此问题并且必须准确检查他们在做什么)。
因此,鉴于您可以采取多种方法来确定所需的内存量或减少正在使用的内存量。垃圾收集语言(如 Java 或 C#)的一个常见错误是保留对不再使用的对象的引用,或者在可以重用它们时分配许多对象。只要对象有对它们的引用,它们就会继续使用堆空间,因为垃圾收集器不会删除它们。
在这种情况下,您可以使用 Java 内存分析器来确定程序中的哪些方法正在分配大量对象,然后确定是否有办法确保它们不再被引用,或者首先不分配它们。我过去使用的一个选项是“JMP” http://www.khelekore.org/jmp/。
如果您确定分配这些对象是有原因的,并且您需要保留引用(取决于您在做什么,这可能是这种情况),您只需要在启动程序时增加最大堆大小。但是,一旦您进行了内存分析并了解了您的对象是如何分配的,您应该对您需要多少内存有一个更好的了解。
一般来说,如果你不能保证你的程序会在有限的内存中运行(可能取决于输入大小),你总会遇到这个问题。只有在用尽所有这些之后,您才需要考虑将对象缓存到磁盘等。此时,您应该有一个很好的理由说“我需要 Xgb 内存”,而您无法通过改进来解决它您的算法或内存分配模式。通常,这通常仅适用于在大型数据集(如数据库或某些科学分析程序)上运行的算法,然后缓存和内存映射 IO 等技术变得有用。
使用命令行选项运行 Java,该选项-Xmx
设置堆的最大大小。
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html#nonstandard