我正在调试我的代码,我看到我的线程在以下log4j TextEncoderHelper中被阻止。我使用的是log4j 2.8.2
我的所有线程都无法运行,它基本上阻止了整个应用程序。
有谁知道下面的内容?如果我有两个线程记录,它是否意味着它的死锁?
(我正在使用参数
运行-DLog4jContextSelector = org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -DAsyncLogger.RingBufferSize = 32768 * 32768 -DAsyncLogger.WaitStrategy = Sleep -Dlog4j2.AsyncQueueFullPolicy = Discard)
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 }
答案 0 :(得分:0)
如果调试器显示应用程序被阻止尝试写入底层appender,那么底层appender可能无法跟上工作负载。
问题没有提到正在使用什么appender所以我最初假设文件appender但是从注释中可以看出JmsAppender
被使用了。 (请在未来的问题中提及这样的细节:如果没有这些信息,我的想法是错误的。)
JMS本身就是一个很大的主题,但通常并不知道它具有高度的性能。可实现的实际吞吐量取决于实现产品及其配置。
我建议启用JMS调试选项以确认JMS队列确实是瓶颈。