使用NIO直接缓冲区时设置-XX:+ DisableExplicitGC的影响

使用NIO直接缓冲区时设置-XX:+ DisableExplicitGC的影响,第1张

使用NIO直接缓冲区时设置-XX:+ DisableExplicitGC的影响

禁用显式GC不会阻止缓冲区,因此不会阻止缓冲区保留的本地内存被收集。但这可能会拖延很长时间。

这意味着直接缓冲区分配的内存可能会在收集之前积累很长时间。从长远来看,这并不是真正的泄漏,但是它将增加峰值内存使用率。

http://hg.openjdk.java.net/jdk8u/jdk8u-dev/jdk/file/4a1e42601d61/src/share/classes/java/nio/Bits.java

据我了解,达到限制后,

System.gc()
调用就会释放缓冲区
reserveMemory
。预留请求量之后
ByteBuffer.allocateDirect
会调用
Unsafe.allocateMemory
它可能会做自己的呼叫模式,不应由受到影响
DisableExplicitGC
,如果尝试失败MMAP。

我们至少可以做些什么来降低其被调用的频率?

仅在达到

MaxDirectMemorySize
限制时调用。如果您可以调整GC或应用程序代码,使其符合以下选项之一:

  • 它使用一组固定的缓冲区(永远不会超出->限制)
  • 尽早收集缓冲液(寿命短的缓冲液->在年轻的GC中死亡)
  • 在直接缓冲区空间用完之前,定期收集旧一代
  • 使用堆缓冲区而不是直接缓冲区

System.gc()
无需通话。

在热点上,还存在一个

ExplicitGCInvokesConcurrent
选项。也许IBM的VM具有类似的功能。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4984438.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存