Tomcat 6和Tomcat 8中使用Java 1.8的内存分配行为

相关问题: 从Java 6 + Tomcat 6升级到Java 8 + Tomcat 8时的垃圾收集器使用情况

我有一组用Java 8编译的webapps。如果我在Tomcat 8中运行它们,我会得到许多带有随机内存分配的次要GC集合。 在Tomcat 6中,内存分配更加线性和稳定(两种情况下都是空闲,没有流量)。

伊甸园空间雄猫8:

在此处输入图像描述

在此处输入图像描述

伊甸园空间雄猫6:

在此处输入图像描述

在此处输入图像描述

你知道为什么会这样吗?

编辑1:

这些是来自生产环境的数据,包括jdk 1.8和Tomcat 8.由于GC循环,CPU几乎总是很高。 对此有何评论?

在此处输入图像描述 在此处输入图像描述

编辑2:

这是一个heapdump analisis(1.8GB转储):

在此处输入图像描述

这是伊甸园的空间,而不是终身空间。 所以,仅此一点就是好消息。

但是那个记忆步骤似乎是tomcat8在年轻的GC之后立即分配了一些东西。 它可能是一种“气球”技术吗? (将一个较大的弱引用缓冲区快速分配给’deflate’,以确保在内存压力的情况下有一些空间)。 它也可能隐藏在NIO连接器中,如’oomParachute’参数(默认情况下为1 MB,但它是每个httpprocessor线程吗?如果你有200分钟的线程,那将与看到的200 MB相匹配)。

我只建议您可以深入更新日志以查找您可能认为他们实施的新事物或更改,如此类气球机制。

另外:你应该在你的jdk8中运行tomcat6来查看它是否真的是tomcat8。 伊甸园的空间可以做得更大,以防万一G1GC如此激进,以至于当使用仅200MB时GC感觉有义务。

谢谢你们所有人的时间。 最后,问题是tomcat 8.0_23中的一个错误。 使用Javosize,我看到一个线程消耗几乎所有的CPU时间:

在此处输入图像描述

在互联网上看,我发现了这个Tomcat AJP Bug

在adittion中,我测试了tomcat 8.0_32,并且Poller线程甚至不存在,所以问题解决了。

问候