类似netty的directBuffer,在堆外申请一块内存,在堆内有一个相应的reference对象,堆外内存的释放,依赖于堆内reference的清理。一般来说,这类reference都是短生命周期的临时对象,所以,younggc就会清理掉这些reference
但是,负载搞的情况下,这些reference对象可能晋升到old区,导致这些堆外内存不能及时释放。就会导致堆外内存触发System.gc()
System.gc()会直接触发系统的FullGC,导致STW脚长时间,一般是秒级别。
对于OLD区使用CMS的应用,也会触发STW的FullGC。 但是这个参数又不能通过 DIsableExplicitGC关掉,否者会导致OOM direct memory.
如果使用CMS,可以增加 -XX:+ExplicitGCInvokesConcurrent 参数,使System.gc()触发的FullGC为CMS,防止过长的STW时间。
网友评论