我需要在内存中存储大量数据(对象)(用于计算).
由于计算是基于此数据完成的,因此所有数据都将驻留在同一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
由于计算是基于此数据完成的,因此所有数据都将驻留在同一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
我只是想知道是否有一些库用于这种情况,或者我需要从头开始.
为了更好地理解我的需求,想象一个处理大量记录并需要根据存储在内存中的数百万条其他记录(高处理速率)来分析它们的服务器.
解决方法
对于集合开销,请查看
trove – 它们的内存开销低于内置集合类(特别是对于JDK基于映射的映射和集合).
如果您有大型对象,可能值得将它们“序列化”保存为一些紧凑的二进制表示(而不是Java序列化)并在需要时反序列化为完整的对象)您还可以使用可以分页到磁盘的缓存库?看看 infinispan或 ehcache.另外,其中一些库(其中包括ehcache,如果内存服务)提供“堆外存储”作为jvm进程的一部分 – 一块不受GC管理的内存(本机) ) 图书馆.如果你有一个有效的二进制表示,你可以将它存储在那里(不会降低你的脚踏,但可能会使GC表现更好)
如果您有大型对象,可能值得将它们“序列化”保存为一些紧凑的二进制表示(而不是Java序列化)并在需要时反序列化为完整的对象)您还可以使用可以分页到磁盘的缓存库?看看 infinispan或 ehcache.另外,其中一些库(其中包括ehcache,如果内存服务)提供“堆外存储”作为jvm进程的一部分 – 一块不受GC管理的内存(本机) ) 图书馆.如果你有一个有效的二进制表示,你可以将它存储在那里(不会降低你的脚踏,但可能会使GC表现更好)