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

Ula*_*har 5 java eclipse logging java-8 log4j2

//更新1:

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

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

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

// END OF UPDATE 1

//原帖:

来自我在这里问到的一个较旧的问题:使用launch4j和jdk8包装.exe需要很长时间才能启动.使用jdk7开始几乎是即时的

现在我知道它与使用jdk8的launch4j无关,但它似乎是由我的应用程序中的jdk8组合的log4j引起的.这里讨论了类似的问题:创建logger时Log4j 2挂起,这里:log4j LogManager.getLogger陷入无限循环.

但是这些解决方案都不适合我.问题对我来说也有点不同.开始了:

我的应用程序的主要方法是在初始化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...");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我从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秒,具体取决于设备< - 这是实际问题!

初始完成!

启动GUI ...

当我针对JDK 7编译完全相同的事情时,"部署的"可执行文件的启动速度与Eclipse内部一样快.这真的很奇怪,我不知道如何对付它.

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

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>
Run Code Online (Sandbox Code Playgroud)

Ula*_*har 1

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