我有一个 Java 应用程序,它等待用户按键然后运行任务。一旦完成,它就会返回并再次等待。我正在使用 jvisualvm 查看此应用程序的内存配置文件,它显示出不断增加的模式。
承诺内存大小为 16MB。
应用程序启动时使用的内存为 2.7 MB,然后随着中间下降(垃圾收集)而攀升。一旦这种锯齿模式接近 16MB,内存使用量就会大幅下降,下降到接近 4MB。不过,这个主要下降点一直在增加。 4MB、6MB、8MB。使用量从未超过 16 MB,但整个锯齿模式正在向 16 MB 攀升。
我有内存泄漏吗?
由于这是我第一次在 StackOverflow 上发帖,因此没有足够的声誉来发布图像。
现代 SunOracle JVM 使用所谓的分代垃圾收集器:
- 当收集器运行时,它首先尝试部分收集,仅释放最近分配的内存
- 最近创建的仍处于活动状态的对象会被“升级”
- 一旦一个对象被提升了几次,即使它准备好被收集,它也不会再被部分收集清理。
- 这些对象称为“tenured”,只有在需要完整收集时才会被清理,以便为程序继续运行留出足够的空间
因此,基本上,程序中保留足够长的时间而被快速“部分”收集错过的部分将一直保留,直到 JVM 决定必须执行完整收集。如果你让它持续足够长的时间,你最终应该会看到完整的收集发生,并且使用量下降回原来的起点。
如果这种情况从未发生,并且您最终得到内存不足异常,那么您可能存在内存泄漏:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)