gpt4 book ai didi

java - JConsole 总加载类行为

转载 作者:行者123 更新时间:2023-11-30 08:27:46 27 4
gpt4 key购买 nike

我监控了一个 Java7 应用程序几个星期,我观察到了一些我想了解的事情。

从应用程序开始加载类的总数不断增长,我认为这是正常的,因为应用程序(基于 netty 3.6 库)每小时打开和关闭大量 tcp 连接。我认为我也不应该为此担心,因为当前加载的类计数器没有增长。

我无法理解的是,为什么大约每 7 天总加载类数就会下降到当前加载类计数器。此外,堆内存使用似乎遵循相同的模式:堆空间增长到 70mb,然后减少到 20mb。

它就像每 7 天执行一次更“深入”的垃圾收集器执行。

应用程序从未重启过。

有人可以向我解释这种行为吗?谢谢。

附言不幸的是,我无法截取 JConsole 的屏幕截图。

最佳答案

在 Oracle JVM 中,堆中有多个内存池。其中一个是旧的 gen 池,另一个是 perm gen 池。 old gen 池包含在几次垃圾回收中幸存下来的对象。永久生成池包含加载的类和其他“永久”数据。

堆池的垃圾回收方式不同。您看到的标准垃圾回收通常在伊甸园池中运行,伊甸园池是放置新创建的对象的地方。理论是,如果你有很多短暂的对象,那么这些对象通常可以在一个小堆中被垃圾收集。与此同时,您的生命周期较长的对象会被提升到较旧的池中,并且收集频率会降低。

这一切都是为了允许更有效的垃圾收集,因为生命周期较长的对象不像生命周期较短的对象那样经常被考虑收集。因此,您看到的“更深层次”执行可能是在旧的 gen 池被收集时。碰巧的是,Oracle 决定实现一些事情,以便 perm gen 池与 old gen 池同时收集垃圾,这就是为什么它们同时被丢弃。

最后,简单地打开和关闭 TCP 连接不应导致加载新类。可能发生的情况是某些库在连接到达时正在创建新的动态代理。这个动态代理是一个在运行时创建的全新类,当它被创建时,它会增加你的类加载总数。

引用资料:

In Java is Permanent Generation space garbage collected?

Java 6 garbage collection details (来自甲骨文)

关于java - JConsole 总加载类行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20637225/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com