1

这些天来,我们有很多便宜的 RAM 可用,但我们不能使用它,因为它会导致大量垃圾收集并停止应用程序,这是不可取的。当我读兵马俑时;我觉得这解决了我的问题,因为我将在兵马俑上使用我的额外内存,并且该内存不会被垃圾收集。

是不是在我的应用程序中我可以创建一些分布式哈希图,而我放在这个哈希图上的数据不会计入我的 java 堆大小?但这将意味着代码更改。这看起来和 MemCached 一样。

有什么办法吗?这样无需对我现有的应用程序进行任何代码更改(或者如果我使用像 jmeter 这样的第三方)我可以使用这个额外的 RAM 吗?

如果不能用兵马俑;有可能以其他方式吗?

4

2 回答 2

2

看看ByteBuffer#allocateDirect(int)。它在堆外(因此在感兴趣的 CG 区域之外)分配一个字节缓冲区(您可以对其进行读写)。

它在后台所做的是通过对JVM 选项com.sun.Unsafe的一些额外检查来委托调用。-XX:MaxDirectMemorySize表示可以使用-XX:MaxDirectMemorySize多少直接内存进行直接分配。(默认为 64MB IIRC)。

这就是 Ehcache 和 Terracota 为避免大量 GC 而做的事情。

但是,这并不意味着您不必更改应用程序即可使用它。注意,分配的字节缓冲区只是内存中的一个连续区域,除了读/写位置的值之外没有其他接口。因此,要通过Map接口访问它,您必须自己实现此映射。

于 2012-12-14T11:15:20.573 回答
1

Terracotta 有一个很好的特性,叫做BigMemory。它允许将数据存储在 JVM 堆之外,以访问计算机上的额外内存。它可以在您的 JVM 之外使用数十/数百 GB 的数据。

您现有的 ehcache 调用不会更改任何代码。它在 ehcache.xml 和 JVM 启动参数 (-XX:MaxDirectMemorySize) 中的唯一配置更改。

在配置中,您可以为缓存明确指定堆外大小:

<cache name="MyCache" ...
       maxBytesLocalOffHeap="5G"
       ...
</cache>

来自兵马俑文档

要将堆外用作数据层,缓存必须将 overflowToOffHeap 设置为“true”。如果 CacheManager 有一个配置为使用堆外的池,则所有缓存的 overflowToOffHeap 属性自动设置为“true”。在这种情况下,您可以通过将其 overflowToOffHeap 属性显式设置为“false”来防止特定缓存溢出到堆外。

于 2013-05-01T13:18:35.727 回答