Java到底有多耗内存

今天要加载一个社交网络的好友关系矩阵到内存,类似于这样的数据:
uid -> friendid1, friendid2, …….
全部数据写在文本中大概3G+。我想heapsize设置成-Xmx20g怎么也应该够了吧。

1. 图省事,friendlist使用HashSet<Integer>存储。结果数据加载到一半,卡着不动了。直观判断,内存hold不住了;
2. 只好改成LinkedList<Integer>,加载成功!但是算法跑到一半,还是吃不住;
3. 最后改成了int[],顺利加载,顺利跑完算法。代价是重新了不少代码,复杂度上去了;

气愤之余,搜了些资料。不查不知道,一查吓一跳:

一个小小的Double Object竟然需要24个Bytes,2/3是overhead;

一个包含8个char的String需要64 Bytes,3/4的Bytes是多余的;

100个Entry<Double, Double>的TreeMap需要8.6KB

这些开销,如果是临时性的数据,马上会被GC清理掉,也就无所谓了。但是像我一样要加载大数据到内存,就必须精打细算。

推荐:截图均来自“Building Memory-efficient Java Applications: Practices and Challenges

Advertisements
相册 | 此条目发表在Java分类目录。将固定链接加入收藏夹。

One Response to Java到底有多耗内存

  1. Pingback引用通告: trove4j:大数据下的轻量Java Collections库 | Great Power Law

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s