如何处理“ java.lang.OutOfMemoryError:Java堆空间”错误?
最终,无论你在什么平台上运行,都始终可以使用有限的最大堆。在Windows 32位环境中2GB(不是专门用于堆,而是每个进程的内存总量)。碰巧的是,Java选择减小默认值(大概是为了让程序员在没有遇到这个问题且不必仔细检查它们在做什么的情况下,无法创建内存分配失控的程序)。
因此,考虑到这种情况,你可以采用多种方法来确定所需的内存量或减少正在使用的内存量。Java或C#等垃圾收集语言的一个常见错误是,保留对不再使用的对象的引用,或者在可以重用它们时分配许多对象。只要对象引用了它们,它们将继续使用堆空间,因为垃圾收集器不会删除它们。
在这种情况下,你可以使用Java内存探查器来确定程序中哪些方法正在分配大量对象,然后确定是否有办法确保不再引用它们,或者首先不分配它们。我过去使用的一个选项是“ JMP” http://www.khelekore.org/jmp/。
如果确定你出于某种原因分配这些对象,并且需要保留引用(取决于实际情况),则仅需要在启动程序时增加最大堆大小。但是,一旦执行了内存分析并了解了对象的分配方式,就应该对所需的内存有一个更好的了解。
通常,如果你不能保证程序会在一定数量的内存中运行(也许取决于输入大小),则总是会遇到此问题。仅在用尽所有这些之后,你才需要研究将对象缓存到磁盘等中。在这一点上,你应该有一个很好的理由说“我需要Xgb的内存”,你不能通过改进来解决它。你的算法或内存分配模式。通常,只有在大型数据集(例如数据库或某些科学分析程序)上运行的算法才会出现这种情况,然后诸如缓存和内存映射IO之类的技术就变得有用。