禁用显式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具有类似的功能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)