繁体   English   中英

apache-tomcat-8.0.14中的内存泄漏

[英]Memory leak in apache-tomcat-8.0.14

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

有什么建议么?

是否存在OOM错误? 如果是这样,请提供该细节。 您正在使用什么JDK? 您是否监视了堆的使用情况,以查找它是否与Eden或使用权空间有关。 我建议使用jvisualvm之类的工具进行内存采样,以找出哪个类正在使用那么多的内存。

肯定有一些东西正在消耗您的记忆,并且您必须进行采样才能找到。

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

您以前是否曾使用Grails :)? 很好,但是它比同等的基于Java的应用程序使用更多的内存。 这来自几个不同的来源,一个是每个类都有一个MetaClass 支付Groovy提供的所有内容的很小的代价。

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

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

另一件事很奇怪,那就是Java 1.8不能真正与Grails一起使用-我很惊讶您所取得的成就。 不同的次要版本有不同的问题,但是我无法获得实际有效的设置组合。 在正式宣布对Grails和Groovy的Java 8支持之前,您应该降至1.7。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM