【问题标题】:PermGen space increasing due to LogManager.getLogger(Logger.class.getName());由于 LogManager.getLogger(Logger.class.getName()); 导致 PermGen 空间增加
【发布时间】:2015-03-28 20:35:53
【问题描述】:

我一直遇到 PermGen 内存问题,并使用 Java VisualVM 对其进行调试。

我将问题追溯到导致内存使用量增加且从未减少的单行代码。使用这行代码不会卸载任何类。

代码行是:

LogManager.getLogger(Logger.class.getName());

我正在使用 log4j2。有没有人有任何建议来修复这条线以摆脱内存问题?

【问题讨论】:

  • 你能补充更多细节吗?这是 webapp、j2ee 还是独立的?你在用什么 log4j2 函数? (所有记录器异步,混合同步/异步,...)如果是 webapp,log4j2 jars 和配置文件在哪里? (在容器库中还是在 webinf/lib 中?)

标签: java memory log4j2 visualvm


【解决方案1】:

这是一个有根据的猜测。正如the link offered @Joachim in the comments 所建议的那样,增加PermGen 空间意味着ClassLoader 加载的类数量增加,或者内部字符串数量增加。

(See this StackOverflow question to learn more about String interning)

基于此,我将更改您的代码以引用静态的东西,这可能getName() 没有给您。

我建议:

LogManager.getLogger(Logger.class.getName().intern());

或者更常见的:

LogManager.getLogger(Logger.class);

但是你真的是要登录Logger.class吗?

也许考虑实际做:

LogManager.getLogger(MyClassWhereLoggingHappens.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 2014-02-01
    • 2015-04-22
    • 1970-01-01
    • 2011-01-04
    • 2016-09-01
    • 2012-09-15
    相关资源
    最近更新 更多