有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要在内存中存储大量数据(对象)(用于计算)
由于计算是基于这些数据进行的,所以所有数据都必须驻留在同一个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

我只是想知道是否有这样的场景库,或者我需要从头开始
为了更好地理解我的需求,设想一台服务器处理大量记录,并需要根据存储在内存中的数百万条其他记录进行分析(以获得较高的处理率)


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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