gpt4 book ai didi

java - log4j 层次结构中的内存泄漏

转载 作者:行者123 更新时间:2023-11-30 08:16:58 25 4
gpt4 key购买 nike

org.apache.log4j.Hierarchy 包含一个名为 ht 的哈希表,该表不断增长,直到我们在应用程序服务器中遇到 OutOfMemoryError .

ht 有数百万个条目,我不明白为什么。

在 log4.properties 中定义了几个类别,并且我希望对于与类别定义匹配的每个类,此哈希表中都有一次条目。

但是每次创建某个类的新实例时,都会在该哈希表中添加一个新的记录器..因此,我们无法控制它的大小,它会不断增长,直到 JVM 完全饱和为止。

有什么想法吗?是否有任何配置可以避免这种行为?我们应该定期清除这个 ht 吗?

使用 jmap histo 清楚地显示了这种不断的演变..

最佳答案

Log4 保留对其创建的每个记录器的引用。每个记录器都有一个唯一的名称,每次调用获取特定名称的记录器都将返回相同的记录器对象。 org.apache.log4j.Hierarchy.ht包含先前创建的记录器对象的缓存。这是 log4j 的正常且预期的行为。

最常见的模式是为每个类创建自己的记录器,以该类的名称命名。在这种情况下,记录器的数量自然会受到应用程序中创建记录器的类的数量的限制。

不过,应用程序可以创建具有其他名称的记录器。例如:

for (int ii = 0; ii < 100_000; ++ii) {
Logger logger = Logger.getLogger(String.valueOf(ii));
}

这个无可否认的人为示例创建了十万个以数字 0 到 99,999 命名的记录器。 Log4j 会将每个记录器的副本存储在 ht 表中,以防您多次运行该代码。

LogManager类有一个函数getCurrentLoggers()它返回已创建的记录器的枚举。您可以使用它来找出正在创建哪些记录器。也许您的应用程序正在使用不寻常的记录器命名模式来创建特殊的记录器,并且最终会产生大量记录器?

关于java - log4j 层次结构中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29518808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com