这个内存使用模式是否表明我的Java应用程序泄漏内存?
我有一个Java应用程序,它等待用户点击一个键,然后运行一个任务。一旦完成,它将返回并再次等待。我用jvisualvm查看了这个应用程序的内存配置文件,它显示了一个不断增长的模式 提交的内存大小为16MB。 在应用程序启动时,使用的内存为2.7MB,然后随着中间内存下降(垃圾收集)而上升。一旦这个锯齿形模式接近16MB,就会出现一个大的下降,内存使用量下降到接近4MB。不过,这一主要下降点一直在增加。4MB,6MB,8MB。使用量从未超过16MB,但整个锯齿模式正在向16MB攀升 我有内存泄漏吗这个内存使用模式是否表明我的Java应用程序泄漏内存?,java,Java,我有一个Java应用程序,它等待用户点击一个键,然后运行一个任务。一旦完成,它将返回并再次等待。我用jvisualvm查看了这个应用程序的内存配置文件,它显示了一个不断增长的模式 提交的内存大小为16MB。 在应用程序启动时,使用的内存为2.7MB,然后随着中间内存下降(垃圾收集)而上升。一旦这个锯齿形模式接近16MB,就会出现一个大的下降,内存使用量下降到接近4MB。不过,这一主要下降点一直在增加。4MB,6MB,8MB。使用量从未超过16MB,但整个锯齿模式正在向16MB攀升 我有内存泄漏吗
由于这是我第一次向StackOverflow发帖,因此没有足够的声誉来发布图像。这种锯齿状模式是常见的,并不表示内存泄漏
因为大块垃圾收集比持续收集少量垃圾更有效,所以JVM会分批收集垃圾。这就是为什么你会看到这种模式 正如其他人所说,这种行为是正常的。是对垃圾收集过程的良好描述。总之,JVM使用分代垃圾收集器。绝大多数物体的寿命都很短,存活时间较长的物体往往寿命更长。知道了这一点,GC将首先检查新一代对象,以避免重复检查不太可能访问的旧对象。经过一段时间后,幸存者转移到老一代。这颗不断增长的锯齿正是你所看到的——上升的波谷是由于老一辈人在幸存者被转移到那里时变得越来越大。如果您的程序运行足够长的时间,那么检查新一代程序将无法释放足够的内存,并且必须对旧一代程序进行GC
希望能有所帮助。现代SunOracle JVM使用所谓的分代垃圾收集器:
如果这种情况从未发生,并且最终出现内存不足异常,那么可能是内存泄漏:)看起来不像。这看起来像一个正常的GC模式。如果你的内存使用率毫无限制地上升,我会担心的。但是使用的内存没有接近初始内存使用率2.7MB。这样可以吗?初始内存使用率并不是最好的比较对象。您可能希望与分配的堆进行比较(例如,出于实验目的,通过
Xmx
选项,您可以使用System.gc()
“强制”垃圾收集。如果重复多次执行此操作,您通常可以强制它执行完全收集,并且您将能够看到内存配置文件返回到基线(略微增加,以说明仍在“使用中”的较旧的gen对象)。我今天在GC上找到了其他资源。谢谢。我将尝试运行足够长的时间并查看。到目前为止,没有异常。