[英]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.