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

2022-09-04 04:39:33

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

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

伊甸园太空雄猫8:

enter image description here

enter image description here

伊甸园太空雄猫6:

enter image description here

enter image description here

你知道为什么会这样吗?

编辑1:

这些是来自jdk 1.8和Tomcat 8的生产环境的数据。由于GC周期,CPU几乎总是非常高。对此有何评论?

enter image description here enter image description here

编辑2:

这是一个堆瘫分析(1.8GB转储):

enter image description here


答案 1

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

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

我只建议你可以钻取到更新日志中,找到新的东西或变化,你可能会认为他们像这样的气球机制一样浪费地实现了。

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


答案 2

谢谢大家抽出宝贵时间。最后,问题是tomcat 8.0_23中的一个错误。使用Javosize,我看到一个线程消耗了几乎所有的CPU时间:

enter image description here

在互联网上寻找我发现这个雄猫AJP错误

在 adittion 中,我已经测试了 tomcat 8.0_32,并且该 Poller 线程甚至不存在,因此问题解决了。

问候