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

标签 java garbage-collection memcached terracotta spymemcached

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

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

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

如果不能用赤土陶器;有没有可能以任何其他方式?

最佳答案

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

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

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

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

关于java - 如何在现有 Java 应用程序(不将其暴露给 GC)或我使用的第三方工具上使用我盒子的额外 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13877399/

相关文章:

memcached - 在 Zend Framework 2 中使用 Memcached 设置 ttl 和命名空间

python - 如何在python中获取垃圾值

mysql - 使用 memcached 和 mysql 搜索查询的最佳实践?

c# - 使用 AWS Elasticache 和 Enyim memcached 客户端时 Memcache 过期时间为 1 小时

java - 在 JSTL 中接受对象

c - 使用 C API 的弱表和 GC 终结器

memory-leaks - Lua 中是否收集了数字、 bool 值或 nils 垃圾?

java - 尝试复制工作 map 的 ConcurrentModificationException

java - java.lang.Double 实现中的不一致(Oracle JDK 1.8)?

java - 获取最新的文件