私のコードをデバッグしています。スレッドが次のlog4j TextEncoderHelperでブロックされています。私はlog4jを使用しています2.8.2TextEncoderHelperでスレッドがブロックされましたcopyDataToDestination
私のスレッドは実行できず、基本的にアプリケーション全体をブロックしました。
誰でも次のことを知っていますか?私は2つのスレッドのログを持っている場合、それはデッドロックを意味するのでしょうか?
(私はパラメータを指定して実行しているよ
-DLog4jContextSelector = org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -DAsyncLogger.RingBufferSize = 32768 * 32768 -DAsyncLogger.WaitStrategy =スリープ-Dlog4j2.AsyncQueueFullPolicy =デバッガは、アプリケーションが根底にあるアペンダへの書き込みしようとしてブロックされて表示されている場合、おそらく根本的なアペンダは、ワークロードに追いつくことはできません)
private static void copyDataToDestination(final ByteBuffer temp, final ByteBufferDestination destination) {
61 synchronized (destination) {
62 ByteBuffer destinationBuffer = destination.getByteBuffer();
63 if (destinationBuffer != temp) { // still need to write to the destination
64 temp.flip();
65 if (temp.remaining() > destinationBuffer.remaining()) {
66 destinationBuffer = destination.drain(destinationBuffer);
67 }
68 destinationBuffer.put(temp);
69 temp.clear();
70 }
71 }
72 }
デバッガの外で動作しているときにスタックダンプを実行して結果を表示できますか?または、Log4j2のissueトラッカーでJIRAチケットを開いて、スレッドダンプ結果を表示します。 –
私はこれを見ました https://issues.apache.org/jira/browse/LOG4J2-1874 2.10.0で試しました。 ブロックが消えましたが、asyncLoggerスレッドがflush-> writeToDestinationを呼び出すのに時間がかかりました。基本的にディスクにブロックのように書くことができる最適なリングバッファサイズは何ですか? (もしそれが長いフラッシュを避けるために遊ぶ必要がある設定なら - > writeToDestination呼び出し) – Mag
あなたは、非同期ロガースレッドがフラッシュするのに長い時間がかかると思いますか?基本的に、非同期スレッドは、キューが空になるたびに自動的にフラッシュされます。デフォルトキューサイズは128 K(1K = 1024)です。 42:: –