Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个内存使用模式是否表明我的Java应用程序泄漏内存?_Java - Fatal编程技术网

这个内存使用模式是否表明我的Java应用程序泄漏内存?

这个内存使用模式是否表明我的Java应用程序泄漏内存?,java,Java,我有一个Java应用程序,它等待用户点击一个键,然后运行一个任务。一旦完成,它将返回并再次等待。我用jvisualvm查看了这个应用程序的内存配置文件,它显示了一个不断增长的模式 提交的内存大小为16MB。 在应用程序启动时,使用的内存为2.7MB,然后随着中间内存下降(垃圾收集)而上升。一旦这个锯齿形模式接近16MB,就会出现一个大的下降,内存使用量下降到接近4MB。不过,这一主要下降点一直在增加。4MB,6MB,8MB。使用量从未超过16MB,但整个锯齿模式正在向16MB攀升 我有内存泄漏吗

我有一个Java应用程序,它等待用户点击一个键,然后运行一个任务。一旦完成,它将返回并再次等待。我用jvisualvm查看了这个应用程序的内存配置文件,它显示了一个不断增长的模式

提交的内存大小为16MB。 在应用程序启动时,使用的内存为2.7MB,然后随着中间内存下降(垃圾收集)而上升。一旦这个锯齿形模式接近16MB,就会出现一个大的下降,内存使用量下降到接近4MB。不过,这一主要下降点一直在增加。4MB,6MB,8MB。使用量从未超过16MB,但整个锯齿模式正在向16MB攀升

我有内存泄漏吗


由于这是我第一次向StackOverflow发帖,因此没有足够的声誉来发布图像。

这种锯齿状模式是常见的,并不表示内存泄漏


因为大块垃圾收集比持续收集少量垃圾更有效,所以JVM会分批收集垃圾。这就是为什么你会看到这种模式

正如其他人所说,这种行为是正常的。是对垃圾收集过程的良好描述。总之,JVM使用分代垃圾收集器。绝大多数物体的寿命都很短,存活时间较长的物体往往寿命更长。知道了这一点,GC将首先检查新一代对象,以避免重复检查不太可能访问的旧对象。经过一段时间后,幸存者转移到老一代。这颗不断增长的锯齿正是你所看到的——上升的波谷是由于老一辈人在幸存者被转移到那里时变得越来越大。如果您的程序运行足够长的时间,那么检查新一代程序将无法释放足够的内存,并且必须对旧一代程序进行GC


希望能有所帮助。

现代SunOracle JVM使用所谓的分代垃圾收集器:

  • 当收集器运行时,它第一次尝试部分收集只释放最近分配的内存
  • 最近创建的仍处于活动状态的对象将“升级”
  • 一旦一个对象被提升了几次,它将不再被部分收集清理,即使在它准备好收集之后也是如此
  • 这些被称为终身对象的对象只有在需要完整的集合时才被清理,以便为程序继续运行留出足够的空间
  • 因此,基本上,程序中的某些部分如果停留的时间足够长,以至于被快速的“部分”集合遗漏,那么它们将一直停留,直到JVM决定必须进行完整的集合为止。如果你让它持续足够长的时间,你最终会看到完整的收集发生,使用率下降到你最初的起点


    如果这种情况从未发生,并且最终出现内存不足异常,那么可能是内存泄漏:)

    看起来不像。这看起来像一个正常的GC模式。如果你的内存使用率毫无限制地上升,我会担心的。但是使用的内存没有接近初始内存使用率2.7MB。这样可以吗?初始内存使用率并不是最好的比较对象。您可能希望与分配的堆进行比较(例如,出于实验目的,通过
    Xmx
    选项,您可以使用
    System.gc()
    “强制”垃圾收集。如果重复多次执行此操作,您通常可以强制它执行完全收集,并且您将能够看到内存配置文件返回到基线(略微增加,以说明仍在“使用中”的较旧的gen对象)。我今天在GC上找到了其他资源。谢谢。我将尝试运行足够长的时间并查看。到目前为止,没有异常。