如何在现有的java应用程序上使用我盒子的额外RAM(不将其暴露给GC)或我使用的第三方工具



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

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

有什么办法;这样,在不对我现有的应用程序进行任何代码更改的情况下(或者如果我使用的是像jmeter这样的第三方),我可以使用这个额外的RAM

如果兵马俑不可能,还有别的方式吗?

看看ByteBuffer#allocateDirect(int) .它在堆外部(因此在感兴趣的 CG 区域之外)分配一个字节缓冲区(您可以读取和写入)。

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

这就是Ehcache和Terracota为避免大量GC所做的。

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

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

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

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

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

来自兵马俑文档:

若要将堆外用作数据层,缓存必须具有 overflowToOffHeap 设置为"真"。如果缓存管理器具有配置为使用 off-heap,overflowToOffHeap 属性自动设置为 对于所有缓存,"true"。在这种情况下,您可以阻止特定的缓存 通过显式设置其从溢出到堆外 overflowToOffHeap 属性为 "false"。

相关内容

最新更新