如果代码需要在运行时生成数十亿个对象,如何执行此操作并克服OutOfMemoryError错误?顺便说一句,我无法访问JVM设置以增加堆大小,也不允许在工作站上写入硬盘驱动器。
答案 0 :(得分:2)
问题不是创建数十亿个对象,而是同时将它们全部存储在内存中。
类似于以下内容的代码不会创建OutOfMemoryErrors
,因为为循环的每个步骤分配的对象不超过一个
for (long i = 0; i < 1_000_000_000L; i++) {
Object obj = new Object();
// Do something with obj
}
基本上你需要问问自己是否需要保留内存中的所有数据。
如果你不这样做,你只需删除对象的所有引用,使其成为垃圾回收对象。
如果你需要保留内存中的所有对象,这可能是一个糟糕的软件设计。而且你需要暂时存储一些内存(文件,数据库......)并在需要时恢复它们。
如果你真的需要保留内存中的这么多对象来估计它们所需的内存:
memory_to_use = size_per_node * maximum_number_of_nodes
如果这是一个合理的值,您可以对JVM的内存参数进行操作(选中-Xmx parameter)。如有必要,请更新您拥有的内存数量。
如果此值不是合理的值,则需要将部分节点存储在与内存(通常是文件或数据库)不同的物理元素上,并在需要时检索它们。
另一种可能性是将问题分解到不同机器中的子问题,每个机器都能够处理部分数据。