在log4j的层次结构中的内存泄漏

问题描述 投票:1回答:1

org.apache.log4j.Hierarchy包含一个哈希表名为HT,保持增长和增长,直到我们打我们的应用服务器的OutOfMemoryError。

HT有几百万的条目,我不明白为什么。

几类在log4.properties定义,我会期望有项目在此哈希表一次为每个类匹配的类别定义。

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

有任何想法吗 ?是否有任何配置,以避免这种行为?我们应该清楚这个规律HT?

使用JMAP HISTO清楚地表明这个不断发展..

java memory logging log4j
1个回答
1
投票

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()它返回已创建的记录器的枚举。您可以使用它来找出正在创建的内容记录器。也许你的应用程序使用一个不同寻常的记录命名模式创建特殊记录器,它的结束了大批伐木工人?

© www.soinside.com 2019 - 2024. All rights reserved.