繁体   English   中英

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

[英]LogManager.getLogger stalls Application for ~10-30 Seconds when using JDK8:

//更新1:

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

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

有人可以阐明可能存在的差异吗?

// 更新结束 1

// 原帖:

来自我在这里提出的一个较旧的问题: Wrapped .exe with launch4j and jdk8 requires very long to start。 使用 jdk7 几乎立即开始

现在我知道它与带有 jdk8 的 launch4j 无关,但它似乎是由 log4j 在我的应用程序中结合 jdk8 引起的。 这里讨论了类似的问题: Log4j 2 hangs when creating logger和这里: log4j LogManager.getLogger get's stand 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 中执行代码(调试或运行配置无关紧要)时,即时输出(开始和完成 < 1 秒)与预期的一样:

正在执行 MyTestCase...

初始化材料 1...

初始化东西 2...

正在初始化记录器...

初始化完成!

正在启动图形用户界面...

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

正在执行 MyTestCase...

初始化材料 1...

初始化东西 2...

正在初始化记录器...

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

初始化完成!

正在启动图形用户界面...

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

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

CJWizards-0.22

commons-codec-1.10

commons-io-2.4

commons-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-core-2.8.1

sl4j-api-1.7.22

slf4j-nop-1.7.22

swingx-all-1.6.5-1

表格布局

vlcj-3.10.1

zip4j_1.3.2

知道是什么原因造成的吗?

回顾:

  • 从 Eclipse 中运行不会发生此问题(无论使用 jdk 7 还是 8)

  • 使用 JDK 或 JRE 7 作为可运行的 jar 或 exe 运行不会出现问题

  • 使用 JDK 或 JRE 8 作为可运行的 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>

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

我在导出 - 可运行的 JAR 文件 -> 将所需的库打包到生成的 JAR 更改为下面解决了我的问题 -> 将所需的库提取到生成的 JAR

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM