7

我需要在内存中存储大量数据(对象)(用于计算)。
由于计算是基于此数据完成的,因此所有数据都将驻留在同一 JVM 进程内存中是至关重要的。
大多数数据将由字符串、整数和其他子对象(集合、哈希集等)构建。
由于 Java 的对象内存开销很大(字符串是 UTF-16,每个对象有 8 个字节的开销),我正在寻找能够以较低开销将此类数据存储在内存中的库。
我读过有关减少内存的有趣文章:
* http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf * http://blog.griddynamics.com/2010 /01/java-tricks-reducing-memory-consumption.html

我只是想知道是否有一些用于此类场景的库,或者我需要从头开始。
为了更好地理解我的要求,想象一个服务器处理大量记录并需要根据存储在内存中的数百万条其他记录来分析它们(以实现高处理率)。

4

3 回答 3

5

对于集合开销,请查看trove - 它们的内存开销低于内置的 Collections 类(特别是对于在 JDK 中基于映射的映射和集合)。
如果您有大型对象,可能值得将它们“序列化”保存为一些紧凑的二进制表示(不是 java 序列化)并在需要时反序列化回完整的对象)
您还可以使用可以分页到磁盘的缓存库? 看看infinispanehcache. 此外,其中一些库(其中的 ehcache,如果有内存的话)提供“堆外存储”作为 jvm 进程的一部分 - 一块不受(本机)库管理的 GC 的内存。如果你有一个有效的二进制表示,你可以将它存储在那里(不会降低你的足迹,但可能会使 GC 表现更好)

于 2013-01-05T17:15:40.300 回答
1

对于 String 位,您可以存储从 String.getBytes("UTF8") 获得的 byte[]。如果您再次需要 String 对象,则可以从 ByteArray 再次创建它。当然,它会导致更多的 CPU 用于一遍又一遍地创建 String 对象,因此这将是大小<->速度之间的权衡。

于 2013-01-05T17:45:17.143 回答
0

关于字符串,还请查看 -XX:+UseCompressedStrings jvm 选项,但看起来它已从最新的 jvm 更新中删除,请参阅this other question

于 2013-01-05T17:41:33.983 回答