使用JDK8时,LogManager.getLogger将应用程序停顿约10-30秒:

时间:2017-03-16 09:45:34

标签: java eclipse logging java-8 log4j2

//更新1:

我做了一些测试,删除了大部分的lib并注释掉了lib特定的代码,导致了相同的行为,这让我得出结论,这个问题不是(直接)由那些libs引起的,但似乎是一般的在我的代码和/或设置中出现问题。

这里的主要问题是我不明白为什么它在eclipse(即时启动,高性能等)中启动时运行完美,而同样的代码在我在eclipse之外启动它时就会出现所描述的问题(如使用相同的JDK运行JAR!)。

有人可以了解可能存在的差异吗?

// END OF UPDATE 1

//原帖:

来自我在这里提出的一个较旧的问题:Wrapped .exe with launch4j and jdk8 takes very long to start. Using jdk7 instead starts almost instant

现在我知道它与使用jdk8的launch4j无关,但它似乎是由我的应用程序中jdk8组合的log4j引起的。这里讨论了类似的问题:Log4j 2 hangs when creating logger和此处:log4j LogManager.getLogger get's stuck in an infinite loop

但这些解决方案都不适用于我。问题对我来说也有点不同。 我们走了:

我的应用程序的主要方法在初始化Logger对象之前执行一些初始化操作(比如清理旧的日志文件等)。打印每个步骤以通过System.out.println进行调试。这是一个简化的例子:

public class MyTestCase {
    private static Logger logger; 

    public static void main(String[] args) throws Exception {
        System.out.println("Executing MyTestCase...");

        doInitstuff1();

        doInitstuff2();

        System.out.println("Initializing Logger...");    

        logger = LogManager.getLogger(MyTestCase.class.getName()); 

        System.out.println("Init complete!");

        doTheRealStuff();
    }

    private void doInitstuff1() {
        System.out.println("Init Stuff 1...");
    }

    private void doInitstuff2() {
        System.out.println("Init Stuff 2...");
    }

    private void doTheRealStuff() {
        System.out.println("Launching GUI...");
    }
}

当我从Eclipse中执行代码时(调试或运行配置无关紧要),immedeate输出(<1秒开始和结束)是预期的:

  

执行MyTestCase ...

     

Init Stuff 1 ...

     

Init Stuff 2 ...

     

初始化记录器......

     

初始化完成!

     

启动GUI ...

当我创建一个可运行的JAR或一个包装的.exe(带有l4j)并在目标平台上安装JDK或JRE 8来执行应用程序时,结果如下:

  

执行MyTestCase ...

     

Init Stuff 1 ...

     

Init Stuff 2 ...

     

初始化记录器......

应用程序挂起/停顿约10-45秒,具体取决于设备&lt; - 这是实际问题!

  

初始化完成!

     

启动GUI ...

当我针对JDK 7编译完全相同的事情时,“已部署”的可执行文件的启动速度与Eclipse内部一样快。这真的很奇怪,我不知道该怎么办。

我的构建路径/库用于测试目的&amp;实验:

  

CJWizards-0.22

     

公地编解码器 - 1.10

     

公地-IO-2.4

     

公地lang3-3.4

     

共享记录-1.2

     

番石榴-20.0

     

iText的-2.1.7

     

JDatePicker-1.3.5

     

JNA-4.3.0

     

JNA平台-4.3.0

     

的log4j-API-2.8.1

     

的log4j核-2.8.1

     

sl4j-API-1.7.22

     

SLF4J-NOP-1.7.22

     

swingx-ALL-1.6.5-1

     

tablelayout

     

vlcj-3.10.1

     

zip4j_1.3.2

知道造成这种情况的原因是什么?

回顾:

  • 从日食中运行此问题不会发生(无论是否使用jdk 7或8)

  • 使用JDK或JRE 7作为runnable jar或exe运行问题不会发生

  • 以JDK或JRE 8作为runnable jar或exe运行时出现问题

以下是我的log4j2.xml配置文件的内容,以防您需要它:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
    <appenders>
        <File name="MyTestCase.debug" fileName="${sys:user.home}/.mtc/log/MyTestCase.debug.log">
            <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="ACCEPT"/>
            <PatternLayout pattern="%d{yyyy-MM-dd | HH:mm:ss.SSS} | [%t] %-5level | %logger{42}  | %msg%n"/>            
        </File>
                <Async name="Async.debug">
                    <appender-ref ref="MyTestCase.debug"/>
                </Async>        
        <File name="MyTestCase.error" fileName="${sys:user.home}/.mtc/log/MyTestCase.error.log">
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy-MM-dd | HH:mm:ss.SSS} | [%t] %-5level | %logger{42}  | %msg%n"/>        
        </File>
                <Async name="Async.error">
                    <appender-ref ref="MyTestCase.error"/>
                </Async>
    </appenders>
    <loggers>       
        <root level="debug">                        
            <appender-ref ref="Async.debug" level="debug"/>
            <appender-ref ref="Async.error" level="error"/>
        </root>
    </loggers>
</configuration>

1 个答案:

答案 0 :(得分:1)

已经有一段时间了,但问题已“解决”,因为该项目已迁移到JDK 9。 我仍然不知道是什么原因导致了JDK 8的这些问题,但它们已经使用JDK 9消失了。所以我认为这个“已经解决”了。