使用 JDK8 时,LogManager.getLogger 会使应用程序停止大约 10-30 秒:

2024-05-02

// 更新 1:

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

这里的主要问题是我不明白为什么它在从 Eclipse 内部启动时运行完美(即时启动、高性能等),而一旦我在 Eclipse 外部启动它(作为可运行 JAR 使用相同的 JDK!)。

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

// 更新 1 结束

// 原帖:

来自我在这里提出的一个较旧的问题:用 launch4j 和 jdk8 包装的 .exe 需要很长时间才能启动。使用jdk7代替几乎立即启动 https://stackoverflow.com/questions/37185972/wrapped-exe-with-launch4j-and-jdk8-takes-very-long-to-start-using-jdk7-instead

现在我知道它与 launch4j 和 jdk8 无关,但它似乎是由 log4j 与我的应用程序中的 jdk8 组合引起的。这里讨论了类似的问题:Log4j 2 创建记录器时挂起 https://stackoverflow.com/questions/35970675/log4j-2-hangs-when-creating-logger和这里:log4j LogManager.getLogger 陷入无限循环 https://stackoverflow.com/questions/17838807/log4j-logmanager-getlogger-gets-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 中执行代码时(调试或运行配置无关紧要),立即输出(开始和完成不到 1 秒)如预期:

执行 MyTestCase...

初始化东西 1...

初始化东西 2...

正在初始化记录器...

初始化完成!

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

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

执行 MyTestCase...

初始化东西 1...

初始化东西 2...

正在初始化记录器...

应用程序挂起/停止大约 10-45 秒,具体取决于设备

初始化完成!

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

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

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

CJ奇才-0.22

公共编解码器-1.10

公共-io-2.4

公共语言3-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

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

Recap:

  • 从 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 这些问题已经消失。所以我认为这个问题“已解决”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JDK8 时,LogManager.getLogger 会使应用程序停止大约 10-30 秒: 的相关文章

  • 手动编辑 Jar 以更改包名称

    我有一个来自外部源的 jar 文件 jar 中的所有类都位于 com xyz 包中 我想将所有类移动到 com xyzold 包中 这是否像解压缩 jar 将 xzy 文件夹重命名为 xyzold 并重新压缩它一样简单 或者我还需要修改每个
  • URL.setURLStreamHandlerFactory

    我正在使用带有嵌入式 Jetty 的可执行 jar 开发一个 Web 应用程序 我的jar包含一个依赖jar jar in jar 我参考了JarRsrcLoader and RsrcURLStreamHandlerFactory由 Ecl
  • 无法使用 json 架构验证器根据预定义的 yaml 文件验证查询参数

    我需要根据预定义的 yaml 文件架构验证查询参数的架构 因此我使用 json 架构验证器 验证如何失败 我正在执行以下步骤 填充参数和相应的架构 final List
  • 如何在远程 WebSphere 上进行 JNDI 查找期间解决 sun/io/MalformedInputException

    我使用 WebSphere 8 5 来托管我的应用程序 并在应用程序服务器上配置了一些 JDBC 资源 我还使用瘦客户端运行时库开发了一个客户端应用程序 当按以下方式执行 JNDI 查找时 env put Context INITIAL C
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JTable 和 JScrollpane 大小的问题

    我有一个JScrollPane with a JTable在里面 在里面JTable我最初有 3 行 稍后添加行 默认JTable我的 3 行很难看 因为JScrollPane calls getPreferredScrollableVie
  • JFace ColumnWeigthData 导致父级增长

    我有一个 Eclipse RCP 应用程序 并且想要在TableViewer using ColumnWeigthData as ColumnLayoutData 问题是父表单 ScrolledForm在示例代码中 每当我布局表格时都会增加
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • Heroku Rails 应用程序级别不记录日志

    我在 Heroku 上有一个 Rails 应用程序 它没有在应用程序级别进行日志记录 当前版本 红宝石1 9 3 导轨3 1 3 在 config environment development rb 中有以下几行 config logge
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java:java.util.ConcurrentModificationException

    我正在制作 2D 目前正在研究用子弹射击 子弹是一个单独的类 所有项目符号都存储在称为项目符号的数组列表中 当它超出屏幕一侧 Exception in thread main java util ConcurrentModification
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • 为什么我的代码会产生错误:该语句没有返回结果集[重复]

    这个问题在这里已经有答案了 我正在从 Microsoft SQL Server Studio 执行以下查询 该查询工作正常并显示结果 SELECT INTO temp table FROM md criteria join WHERE us
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • Java:使用 Graph API 在线更新 Sharepoint 上的 docx 文件

    我在使用 Java 在线更新 Sharepoint 上的 docx 文件时遇到问题 首先 我检查了构建 PUT 请求的 URL 此处 并使用此请求 PUT drives drive id items item id content 我首先使

随机推荐

  • 按复杂对象中的列表排序

    我有两节课 public class Customer public string FirstName get set public string LastName get set public List
  • 根指令上的 Angular 2 输入参数[重复]

    这个问题在这里已经有答案了 This https angular io docs ts latest api core Input var html示例展示了如何在子组件上使用 Input 注释 我的问题是如何在根组件上使用它 例如 如果您
  • Code First 中的一对多关系播种

    我得到了以下简单模型 该模型正在代码优先方法中实现 部门和课程是一对多的关系 一个系可以有很多门课程 而一门课程可以只属于一个系 这是模型 public class Department public int DepartmentId ge
  • 如何从设备名(UITableViewCell)的tableview中显示蓝牙支持的服务?

    我正在开发蓝牙应用程序 我在表视图中有一个可用蓝牙设备的名称 如果按下一个设备意味着我想知道另一个带有表视图的视图控制器中支持的所有服务 UUID 名称 给我一个想法 1 外设管理器 NSObject 2 FirstViewControll
  • 美丽的汤 - urllib.error.HTTPError:HTTP 错误 403:禁止

    我正在尝试下载 GIF 文件urrlib 但它抛出了这个错误 urllib error HTTPError HTTP Error 403 Forbidden 当我从其他博客网站下载时 不会发生这种情况 这是我的代码 import reque
  • 在 Pascal 中将文本文件中的字符串读入数组

    使用这个程序 我试图读取一个文件并将其随机打印到控制台 我想知道是否必须使用数组 例如 我可以将字符串分配到一个数组中 然后从数组中随机打印 但是 我不确定如何解决这个问题 另一个问题是 我当前的程序没有从我的文件中读取第一行 我有一个文本
  • 两个人同时在 git 中处理一个文件[重复]

    这个问题在这里已经有答案了 可能的重复 当两个对等点同时将更改推送到同一个远程时 git 如何工作 https stackoverflow com questions 4643998 how git works when two peers
  • 如何在 React 中实现拖放行为

    我正在尝试使用 React 和实现拖放行为反应美丽 dnd https github com atlassian react beautiful dnd图书馆 我想使用选择一些图像反应 dropzone https react dropzo
  • Python setup.py:data_files无法复制“目录”:不存在或不是常规文件

    我有以下 python 项目结构 setup py doc file css file html file js src matlabsources
  • ValueError:缺少“favicon.ico”的静态文件清单条目

    我得到了一个ValueError跑步时python manage py test 我的项目名为fellow go 我目前正在开发一个名为pickup 请注意 此错误是在最近对 Django 的提交中添加的 已修复 24452 修复了 Has
  • 从不同的程序集中动态加载类(具有自定义行为)?

    我们正在为少数客户构建应用程序 每个客户都有自己的要求以及类似的要求 我们还希望将所有代码保留在同一个应用程序中 而不是对其进行分支 并且 IF 不是一个好的选择 因为它会遍布各处 我计划为所有人开设基础课程 然后每个客户都会有自己的类 其
  • 即使更改内容后,Chrome 扩展程序弹出窗口也会重置

    在我的 chrome 扩展中 我必须从背景更改弹出 html 更改会影响然后 再次单击扩展图标后 将显示未更改的弹出窗口 为什么 每次您单击远离弹出窗口时 该窗口都会重置 解决此问题的一种方法是使用后台页面来存储会话数据 在 popup j
  • 如何从 Graph Explorer 查询另一个 Azure Active Directory 租户

    我正在使用 Azure Graph API 资源管理器 我想查询租户中的应用程序列表 我是tenant x 最初创建用户的位置 中的用户 也是tenant y 后来与我的用户创建的 中的管理员 据我所知 当我登录时 我直接进入原始租户 即t
  • 使用rapidjson设置浮点精度

    有没有办法控制使用rapidjson生成的JSON的输出精度 例如 writer String length writer Double 1 0 3 0 这会生成类似以下内容的内容 length 0 33333333 我发送了很多值 并且几
  • 如何使小部件溢出以使滚动条出现在 Qt 中?

    我的小部件的结构是 QWidget 定制为带有圆角边框的面板 要在边界内包含一个带有滚动条并带有边距的区域 然后我将其放入其中 QScrollArea 与 QVBoxLayout 垂直添加内容 然后我在其中添加一系列 标题间距为 0 的 Q
  • 从 C# 程序集中执行 JavaScript

    我想从 C 程序集中执行 JavaScript 代码 并将 JavaScript 代码的结果返回到调用 C 代码 定义我不想做的事情更容易 我并不是试图从我的代码隐藏中调用网页上的 JavaScript 函数 我不想加载 WebBrowse
  • 在 Windows 上使用 PHP 进行分叉/线程的最佳方法是什么?

    我有一个 php 脚本 用于检查许多 数千个 网站上的更新 有时 随着站点数量的增加 情况会更频繁 我在更新其中一个站点时会遇到执行超时 整个脚本都会付诸东流 我能想到的最好的想法是分叉每个更新 所以如果它死了 整体更新就会继续 从我收集到
  • subject.next 不在 ngOnInit 中触发

    有谁知道为什么这段代码 从主题初始化一个值 不起作用 是否存在错误或设计使然 我究竟做错了什么 ts import Component OnInit from angular core import Subject from rxjs Co
  • 载波扩展白名单不工作

    这是一个类似的案例 但没有解决方案CarrierWave extension white list 似乎不起作用 https stackoverflow com questions 11348510 carrierwave extensio
  • 使用 JDK8 时,LogManager.getLogger 会使应用程序停止大约 10-30 秒:

    更新 1 我做了更多测试 删除了大部分库并注释掉了库特定代码 导致了相同的行为 这让我得出结论 这个问题不是 直接 由这些库引起的 但似乎是我的一个普遍问题代码和 或设置 这里的主要问题是我不明白为什么它在从 Eclipse 内部启动时运行