【问题标题】:Memory leak in apache-tomcat-8.0.14apache-tomcat-8.0.14 中的内存泄漏
【发布时间】:2014-10-11 16:08:01
【问题描述】:

运行标准的 tomcat 8.0.14,开箱即用全新安装,在托管公司运行。 我在 CentOS 服务器上使用 java jre1.8.0_05。从一开始唯一的改变就是改变一些端口。

到目前为止一切顺利,欢迎使用 Apache 消息,然后我的托管公司将其杀死,因为它已超过 1048 mb。所以想我会在 setenv.sh 中设置最大内存

export JAVA_OPTS="-Djava.awt.headless=true -server -Xms48m -Xmx256m"

应该将最大内存设置为 256,但如果我部署 hello.war,它只会继续增长(基本上,运行 grails hello world 然后添加一个渲染,这是项目的休息)。它现在高达 399 mb

那么有没有办法设置一个硬限制,为什么一个hello world会觉得它需要399mb

有什么建议吗?

【问题讨论】:

    标签: java tomcat grails


    【解决方案1】:

    是否有任何 OOM 错误?如果是这样,请提供详细信息。 你用的是什么JDK?您是否监控堆使用情况以了解 Eden 或永久空间是否存在问题。 我建议使用 jvisualvm 之类的工具进行内存采样,以找出哪个类使用了那么多内存。

    肯定有什么东西正在吞噬你的记忆,直到你进行采样才能找到。

    或者,您也可以使用堆转储来找出正在增长的对象。

    【讨论】:

    • JDK是jdk1.8.0_11,没有监控堆
    • OOM 是“Out of memory”的首字母缩写,即 OutOfMemoryError。非常适合 Google 使用
    【解决方案2】:

    你以前用过 Grails 吗 :) ?这很棒,但它比同等的基于 Java 的应用程序使用更多的内存。这来自几个不同的来源,一个是每个班级都有一个MetaClass。为 Groovy 提供的一切付出很小的代价。

    这通常不是一个严重的问题,因为使用的额外内存还不错。请注意,尽管您所看到的与 Grails 或 Tomcat 无关 - 您可以轻松使用(或似乎使用)比指定的最大值更多的内存。这篇博文已有几年历史了,但仍然非常相关:https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t

    较新的 JDK 的另一个有趣的特性与此有些相关,即现在 JRockit JVM 已合并到“主”JVM 中,没有“永久”生成,因此没有更多的 permgen 问题。字符串和类构成了永久生成中的大部分内容,因此在 Grails 中更为明显,因为有大量文件(许多是在运行时创建的)。唯一真正改变的是 permgen 中的内容将在其他地方,但会产生相同的内存使用,因此真正的 permgen 泄漏将是一般泄漏,并将导致服务器崩溃。同样,这是相关的,但与您所看到的无关。

    另一件奇怪的事情是 Java 1.8 并不能真正与 Grails 一起工作——我很惊讶你能做到这一点。不同的次要版本有不同的问题,但我无法获得实际有效的设置组合。在正式宣布对 Grails 和 Groovy 的 Java 8 支持之前,您应该降到 1.7。

    【讨论】:

    • 我会尝试下到 java 1.7 看看这是否让事情更快乐:)
    猜你喜欢
    • 2012-11-06
    • 2014-12-25
    • 2012-08-20
    • 2015-12-27
    • 1970-01-01
    • 2015-08-15
    • 2019-12-13
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多