我可以理解,随着压缩哎呀,我们只能用内存32 GB。 有什么方法,我可以通过分配2堆或使用的东西比喜欢多吗?
由于比涅斯
我可以理解,随着压缩哎呀,我们只能用内存32 GB。 有什么方法,我可以通过分配2堆或使用的东西比喜欢多吗?
由于比涅斯
你不能有多个堆(你可以有多个JVM,虽然,这被称为向外扩展,而不是扩大)。
JVM使用压缩自动下面的存储器32吉布对象的指针。 如果你了解它是如何工作(从每个地址最小的下降三位,因为他们始终为0,由于内存对齐),你会明白,你不能走的更远。
有一个有趣的事实:一旦你超过了这个32吉布边境JVM将停止使用压缩对象指针,有效地减少了可用内存。 这意味着增加您的JVM堆的上面32吉布你必须去的方式之上。 据伟大的一切我学过关于JVM性能调整@twitter (13:00左右)呈现增加堆从32吉布低于48吉布东西实际上会减少可用内存 (!) 的量 ,因为压缩对象指针已不再存在。
如果您需要超过32 GB,我建议你可以考虑使用一些堆外的内存。 这有效地为您提供了不占用太多堆额外的存储空间。
例如,我经常使用200-800 GB,但只有1-2 GB的是堆。 这意味着我必须压缩哎呀,几乎无限的容量最有效的形式。 注意:有压缩哎呀三种形式,
使用堆外存储的两种方式是直接存储字节缓冲区和内存映射文件。 直接存储器很好地扩展到你的主内存大小的约3/4。 内存映射文件很好地扩展到你的硬盘空间的大小(通常是更多)
在这里,我已经应用很多的优化,使得在年底的空间80%是通过引用而不是实际的数据吃掉。
这听起来像是你不使用最有效的数据结构。 可以使用不同的数据结构,其中数据是更所使用的空间或至少2 /三分之二的。
可以使用更大的堆的大小与附加参数: -XX:ObjectAlignmentInBytes=alignment
该参数是Java对象的固定调节。 缺省值是8
(字节)。 所指示的值必须是二的幂,并且范围是从8
到256
。
以字节为单位的堆大小限制被计算为:
4GB * ObjectAlignmentInBytes
64GB的堆大小将可以与下面的行压缩指针:
-XX:ObjectAlignmentInBytes=16
有较大的堆大小,虽然在文档中要考虑的说明:
注:由于对准值增加,物体之间的未使用的空间也将增加。 其结果是,你可能不知道使用压缩指针与大的Java堆大小带来任何好处。
如果我是你的话,我会研究每个如下:
每个上面都有解决你的问题的可能性。 这是最合适的是真的,我们很难说。
空间80%是通过引用而不是实际的数据吃掉。
这听起来相当极端。 这可能是值得重新您的数据结构,并把重点放在减少对象的引用数。 我做的事情沿着过去这些线路,但它是很难给出具体的建议,不知道您的问题,您正在使用的数据结构。
究竟什么是数据的性质是什么?
做到这一点的方法可能是将数据存储关闭Java堆。 您可以通过获取举办一些离堆内存,通常使用这样做直接ByteBuffer
,然后以字节为单位的形式存储在它的数据。 这有许多优点; 对象可以非常紧凑地收纳,你不需要有一个巨大的堆,而对象不会被垃圾收集器进行扫描。 缺点是复杂性和内存泄漏的风险。
有图书馆,它可以帮助你做到这一点,其中包括: