最小化Java进程中的应用程序数据内存开销

时间:2013-01-05 17:13:50

标签: java performance caching memory

我需要在内存中存储大量数据(对象)(用于计算) 由于计算是基于此数据完成的,因此所有数据都将驻留在同一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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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