我有一个记忆问题,我完全理解原因,但不知道修复。我试图使用-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万用户怎么办?还是数以百计的地区?
有了这么多数据,数据库是使用这些信息进行模拟的唯一可行方法吗?
答案 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。