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

最小化java进程中的应用程序数据内存开销,java,performance,caching,memory,Java,Performance,Caching,Memory,我需要在内存中存储大量数据(对象)(用于计算)。 由于计算是基于此数据进行的,因此所有数据都将驻留在同一JVM进程内存中是至关重要的。 大多数数据将由字符串、整数和其他子对象(集合、哈希集等)生成。 由于Java的对象内存开销很大(字符串是UTF-16,每个对象有8个字节的开销),所以我正在寻找能够以较低开销在内存中存储此类数据的库。 我读过关于减少记忆的有趣文章: * * 我只是想知道是否有这样的场景库,或者我需要从头开始。 为了更好地理解我的需求,假设一台服务器处理大量的记录,并且需要根据

我需要在内存中存储大量数据(对象)(用于计算)。
由于计算是基于此数据进行的,因此所有数据都将驻留在同一JVM进程内存中是至关重要的。
大多数数据将由字符串、整数和其他子对象(集合、哈希集等)生成。
由于Java的对象内存开销很大(字符串是UTF-16,每个对象有8个字节的开销),所以我正在寻找能够以较低开销在内存中存储此类数据的库。
我读过关于减少记忆的有趣文章:
* *

我只是想知道是否有这样的场景库,或者我需要从头开始。

为了更好地理解我的需求,假设一台服务器处理大量的记录,并且需要根据存储在内存中的数百万条其他记录对其进行分析(以获得较高的处理率)。

关于收集开销,请看一看-它们的内存开销低于内置的收集类(特别是对于JDK中基于地图的地图和集合)。

如果您有大型对象,则可能值得将它们“序列化”为某种紧凑的二进制表示形式(而不是java序列化),并在需要时反序列化回完整的对象)
您还可以使用可以分页到磁盘的缓存库?看看或者。此外,其中一些库(如果内存可用,则其中包括ehcache)提供“堆外存储”,作为jvm进程的一部分—不受(本机)库管理的GC约束的内存块。如果您有一个有效的二进制表示,您可以将其存储在那里(不会降低占用空间,但可能会使GC表现得更好)

关于字符串,还可以查看-XX:+UseCompressedStrings jvm选项,但看起来是从最新的jvm更新中删除的,有关可以存储字节[]的字符串位,请参阅您可以从String.getBytes(“UTF8”)中获得。如果再次需要字符串对象,则可以从ByteArray再次创建它。当然,为了一次又一次地创建字符串对象,它会占用更多的CPU,因此这将是sizespeed之间的折衷

谢谢!特洛夫图书馆看起来很棒。您是否熟悉一些减少字符串开销的库?不太熟悉。除了将ascii字符串存储为二进制并“反序列化”它们之外,我知道你能做的事情不多——java只有一个内部字符串表示形式,那就是unicode。好吧,现在我再考虑一下,如果这些字符串重复它们自己,你可以对它们进行intern()以获得唯一的实例,但另一方面,这些独特实例的池驻留在permgen中(至少在Java6中),并且没有清理,因此可能会泄漏。如果它们真的重复,也许你可以添加自己独特的字符串池