- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
稍后编辑:(为什么我认为这与 here 的情况不同)
所有操作都在一个实例方法中完成,进进出出,我处理的每个文件一次。我提取的本地字段(而不是内联)没有在其他任何地方使用,所以 GC 在迭代后无论如何都会清除它......
--
在标准的 J2SE 应用程序中(main
方法从 Eclipse 运行),同时使用 apache pdfbox 和 pdf2dom 进行一些 pdf 到 html 的转换,我想清除一些不需要的 INFO 日志条目。
意外情况:
这段代码每次都能正常工作:
Logger logger = Logger.getLogger("org.mabb.fontverter.opentype.TtfInstructions.TtfInstructionParser");
logger.setLevel(Level.WARNING);
但是,如果我内联 logger
变量,它就会开始出现意外行为:
Logger.getLogger("org.mabb.fontverter.opentype.TtfInstructions.TtfInstructionParser").setLevel(Level.WARNING);
在第二种情况下,记录器上的更改仅在允许经过一小段时间间隔后才生效:
这是什么原因?
谢谢。
最佳答案
简而言之,添加本地引用足以延长对象的生命周期。
Oracle 的 Vladimir Ivanov 在 [PATCH] Reduce Chance Of Mistakenly Early Backing Memory Cleanup 中解释了这一点在 OpenJDK 核心库邮件列表中:
JIT-compilers in HotSpot aggressively prune dead locals, but they do that based on method bytecode analysis (and not on optimized IR). So, any usage of a local extends its live range, even if that usage is eliminated in generated code. It means an oop in that local will live past its last usage in generated code and all safepoints (in generated code) till last usage (on bytecode level) will enumerate the local it is held in.
If there were GC-only safepoints supported, then JITs could still prune unused locals from oop maps, but HotSpot doesn't have them and all safepoints in generated code keep full JVM state, so it's always possible to deoptimize at any one of them (and then run into the code which is eliminated in generated code).
If there are no safepoints till the end of the method, then nothing will keep the object alive. But there's no way for GC to collect it, since GCs rely on safepoints to mark thread stack. (That's why I mentioned GC-only safepoints earlier.)
因此,只要本地 ref 延长记录器对象的生命周期,使得 Logger.getLogger
返回由本地 var 创建和持有的记录器,它就可以正常工作。
对于日志记录,不要使用方法本地引用。而是将对记录器的引用保存在 wider scope 中并最好在记录器开始发布记录之前设置一次级别。
关于java - Logger.getLogger 行为不一致,取决于变量是否内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49053855/
我正在努力提高我的 Java 优化技能。为了实现这一目标,我制作了一个旧程序,我正在尽最大努力让它变得更好。在这个程序中,我使用 SL4J 进行日志记录。为了获得记录器,我做了: private st
我正在尝试使用 log4j2 在 Java 中创建一个简单的日志记录应用程序。 看起来是这样的: package com.company; import java.io.IOException; im
我创建了一个扩展 logging.Logger 的 CustomLogger。我正在尝试使用 getLogger 来获取我的记录器实例化。这是我的代码: import os import sys im
我尝试将 getLogger 放在模块级别。然而,它也有一些缺点。这是我的例子: from logging.handlers import TimeRotatingFileHandler log_mo
在我的模块我有这个: import logging import my_module_name.log log = logging.getLogger(__name__) 这工作正常,但我希望能够覆盖
如何获取给定 python 实例的日志文件路径 logging调用 getLogger() 后的对象? 我的 python 应用程序在主 python 脚本中设置日志记录如下。 import logg
我将 copy-webpack-plugin 从 4.6.0 升级为 6.0.2我改变了我的代码 plugins: [ new CopyWebpackPlugin([{ from:
我设置了一个基本的 Java 程序。我正在关注这个tutorial并有这个确切的代码: import org.slf4j.Logger; import org.slf4j.LoggerFactory;
我想知道如何获取我的自定义记录器通过log4j的LogManger.getLogger()方法。 我几乎确定我的项目不需要自定义记录器并使用默认的 log4j 记录器。 但是,如有必要,我想使用自定义
我已经阅读了大量帖子和文档(在本网站和其他地方),指出 SFL4J 日志记录的推荐模式是: public class MyClass { final static Logger logger
为什么大多数 log4net 示例通过这样做来获取类的记录器: private static ILog logger = LogManager.GetLogger( System.Re
这个问题在这里已经有了答案: python & suds “ImportError: cannot import name getLogger” 但是我好像遇到了一个无法用答案解释的情况。 详情如下:
当我执行以下代码时,日志事件仅记录一次。我正在使用 log4j2 记录器。但是当我使用 java.util.logger 时,所有 3 个日志事件均已成功发布。 public class Tes
稍后编辑:(为什么我认为这与 here 的情况不同) 所有操作都在一个实例方法中完成,进进出出,我处理的每个文件一次。我提取的本地字段(而不是内联)没有在其他任何地方使用,所以 GC 在迭代后无论如何
要在 Java 中使用记录器,现在我使用如下代码: Logger logger = Logger.getLogger("MyLog"); FileHandler fh; try { // This
来自logging howto对于 Python 2.7(我的重点): A good convention to use when naming loggers is to use a module-
我有这段代码要测试: log = logging.getLogger(__name__) class A(object): def __init__(self): log.de
Logger来自log4j自己的包。如果用Logger.getLogger,需要一个log4j的jar包,用此方式你只能依log4j: LogFactory来自common-logging包。如果
我知道应该通过 LogManager.getLogger() 创建一个 log4j 记录器实例,它会执行一些反射魔法来检测调用类,因此名称对于特定的日志级别配置很重要。但是,如果我不喜欢手动创建记录器
我正在处理一些遗留代码,其中包含很多代码 private final Logger logger = LogManager.getLogger(ThisClassName.class); 我想知道输入
我是一名优秀的程序员,十分优秀!