apache-tomcat-8.0.14中的内存泄漏

时间:2014-10-11 16:08:02

标签: java tomcat grails

运行标准的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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

有没有OOM错误?如果是这样,请提供详细信息。 你正在使用什么JDK?您是否监控堆使用情况以确定它是否与Eden或终身空间有关。 我建议使用jvisualvm之类的工具进行内存采样,以找出哪个类正在使用那么多内存。

肯定有些东西正在吃你的记忆,在你抽样之前你找不到。

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

答案 1 :(得分:1)

你以前用过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真正合作 - 我很惊讶你能够获得尽可能多的东西。不同的次要版本有不同的问题,但我无法获得实际工作的设置组合。您应该下载到1.7,直到Grails和Groovy正式宣布支持Java 8。