使用巨大的ArrayLists,Java OutOfMemoryError:Java堆空间...使用db?

时间:2011-01-11 19:56:54

标签: java database memory-management heap out-of-memory

我有一个记忆问题,我完全理解原因,但不知道修复。我试图使用-Xmx2g标记并使堆大小更大,但似乎有一个隐藏的最大值。 (如果我使用-Xmx512m,我同时用完了空间。)

假设我有2个对象,一个区域和一个用户。 My Area对象包含一个用户ArrayList:

public class Area {
      int numUsers;
      ArrayList<User> userList;
}

我的User类包含一个朋友的ArrayList:

public class User {
      int userID;
      int numFriends;
      ArrayList<User> friends;
}

只使用一个区域,拥有100万用户,平均每个用户200个朋友,在创建了大约680,000个用户后,我的堆空间耗尽。显然,如果我将朋友/用户的平均数量降低到接近100,我可以将所有这些对象存储在堆中。

如果我想模拟一个区域内的200万用户怎么办?还是数以百计的地区?

有了这么多数据,数据库是使用这些信息进行模拟的唯一可行方法吗?

3 个答案:

答案 0 :(得分:1)

当然,你可以在64位java上运行超过2米,但这无法解决问题。顺便说一句,对于Area,你可能需要id(不是numUsers),用户/朋友的数量可以从list.size()获得

数据库/磁盘存储是表示大量对象的自然解决方案,您也可以使用服务器集群(旁边运行一个带有500 + GB内存的巨大盒子)

要回答这个问题,你必须提供更多数据:区域/朋友图表的重点是什么。


如果你可以使用ByteBuffer编写自己的struct(ure)(这可能不是一件容易的事),你可以超越java.io.MappedByteBuffer,ScatteringByteChannel / GatheringByteChannel的32位限制。然而,无论如何这不是一个新手任务,但如果你喜欢编程,我建议你试试。

祝你学习顺利。

答案 1 :(得分:1)

磁盘/数据库只是一个解决方案,如果你可以承受因素100.000失去随机访问性能(你可能会有很多系统使用数据库)。使用专门的数据结构可以做得更好。为完全连接的子网络执行特殊操作可能会节省大量空间。

答案 2 :(得分:0)

要访问更多堆内存,请转到64位操作系统和64位JVM。如果您遇到-Xmx512m的问题,那么您使用的是32位操作系统和/或JVM。