私はこれと同じ問題に取り組んできました.私が見つけたすべての情報に基づいて、そこには間違いなく何らかのリスクがあるようです. @millimoose からの元の投稿へのコメントとhttps://bugs.openjdk.java.net/browse/JDK-6200079によると、NIO が直接バッファーが使用されています。これらは、私たちが使用している Websphere 8.5 アプリ サーバーの内部実装で使用されているようです。これをデバッグ中にキャプチャできたスタック トレースは次のとおりです。
3XMTHREADINFO "WebContainer : 25" J9VMThread:0x0000000006FC5D00, j9thread_t:0x00007F60E41753E0, java/lang/Thread:0x000000060B735590, state:R, prio=5
3XMJAVALTHREAD (java/lang/Thread getId:0xFE, isDaemon:true)
3XMTHREADINFO1 (native thread ID:0x1039, native priority:0x5, native policy:UNKNOWN)
3XMTHREADINFO2 (native stack address range from:0x00007F6067621000, to:0x00007F6067662000, size:0x41000)
3XMCPUTIME CPU usage total: 80.222215853 secs
3XMHEAPALLOC Heap bytes allocated since last GC cycle=1594568 (0x1854C8)
3XMTHREADINFO3 Java callstack:
4XESTACKTRACE at java/lang/System.gc(System.java:329)
4XESTACKTRACE at java/nio/Bits.syncReserveMemory(Bits.java:721)
5XESTACKTRACE (entered lock: java/nio/Bits@0x000000060000B690, entry count: 1)
4XESTACKTRACE at java/nio/Bits.reserveMemory(Bits.java:766(Compiled Code))
4XESTACKTRACE at java/nio/DirectByteBuffer.<init>(DirectByteBuffer.java:123(Compiled Code))
4XESTACKTRACE at java/nio/ByteBuffer.allocateDirect(ByteBuffer.java:306(Compiled Code))
4XESTACKTRACE at com/ibm/ws/buffermgmt/impl/WsByteBufferPoolManagerImpl.allocateBufferDirect(WsByteBufferPoolManagerImpl.java:706(Compiled Code))
4XESTACKTRACE at com/ibm/ws/buffermgmt/impl/WsByteBufferPoolManagerImpl.allocateCommon(WsByteBufferPoolManagerImpl.java:612(Compiled Code))
4XESTACKTRACE at com/ibm/ws/buffermgmt/impl/WsByteBufferPoolManagerImpl.allocateDirect(WsByteBufferPoolManagerImpl.java:527(Compiled Code))
4XESTACKTRACE at com/ibm/io/async/ResultHandler.runEventProcessingLoop(ResultHandler.java:507(Compiled Code))
4XESTACKTRACE at com/ibm/io/async/ResultHandler$2.run(ResultHandler.java:905(Compiled Code))
4XESTACKTRACE at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1864(Compiled Code))
3XMTHREADINFO3 Native callstack:
4XENATIVESTACK (0x00007F61083DD122 [libj9prt26.so+0x13122])
4XENATIVESTACK (0x00007F61083EA79F [libj9prt26.so+0x2079f])
....
NIOダイレクトバイトバッファが使用されているときに -XX:+DisableExplicitGC を設定することの完全な影響が正確に何であるかはまだ完全には明らかではありません(これによりメモリリークが発生しますか?)が、少なくともいくつかのリスクがあるように見えますそこの。Websphere 以外のアプリ サーバーを使用している場合は、無効にする前に、アプリ サーバー自体が NIO 経由で System.gc() を呼び出していないことを確認することをお勧めします。ここで、NIO ライブラリへの正確な影響について明確にすることを願っている関連する質問があります: Impact of setting -XX:+DisableExplicitGC when NIO direct buffers are used
ちなみに、Websphere は起動プロセス中に手動で System.gc() を数回呼び出すようです。通常、アプリ サーバーが起動されてから最初の数秒以内に 2 回、最初の 1 ~ 2 分以内に 3 回目です (おそらくアプリケーションが起動したとき)。配備されています)。私たちの場合、これが最初に調査を開始した理由です。System.gc() 呼び出しはすべて、アプリケーション コードからではなく、アプリ サーバーから直接行われているようです。
また、NIO ライブラリに加えて、RMI 分散ガベージ コレクションの JDK 内部実装もSystem.gc() を呼び出す
ことに注意してください。
API
-XX:+DisableExplicitGC を有効にすると、RMI DGC にも大混乱が生じるかどうかは、私には少しわかりません。私が見つけることができた唯一の参照は、これに対処することでさえ、上記の最初の参照であり、
「ただし、ほとんどの場合、効果的な DGC には通常の GC アクティビティで十分です」
その「ほとんどの場合」の修飾子は、私には非常に希望に満ちたものに聞こえるので、繰り返しになりますが、すべての System.gc() 呼び出しを停止するだけで、少なくともいくつかのリスクがあるようです。可能であればコードを作成し、最後の手段として完全にオフにするだけです。