使用App时Java内存使用量会增加,但在不使用时不会减少

我有一个java应用程序,使用时会占用大量内存,但是当程序没有被使用时,内存使用量不会下降。

有没有办法强制Java释放这个内存? 因为当时不需要这个内存,我可以理解保留少量内存,但Java只保留它曾经使用过的所有内存。 它也会在以后重用这个内存,但必须有一种方法可以强制Java在不需要时释放它。

System.gc无法正常工作。

正如评论中所指出的那样,当垃圾收集器处理对象时,它并不确定它会给系统带来内存。

也许Tuning Garbage Collection Outline为您的问题提供了解决方案:

默认情况下,JVM会在每个GC上增大或缩小堆,以使每个集合中的可用空间与活动对象的比率保持在指定范围内。

  • -XX:MinHeapFreeRatio – 当一代中的可用空间百分比低于此值时,生成将扩展为满足此百分比。 默认值为40
  • -XX:MaxHeapFreeRatio – 当一代中的可用空间百分比超过此值时,生成将缩小以满足此值。 默认值为70

否则,如果您怀疑您正在泄漏引用,那么您可以弄清楚对象泄漏的方式,内容和位置是监视JVisualVM(与标准SDK捆绑在一起的工具)中的堆。 您可以通过此程序执行堆转储并获取对象内存消耗的直方图:

在此处输入图像描述

你的意思是什么? 如果它是RAM(而不是Java VM本身使用的堆空间量)那么这可能是正常的。 分配内存是一项相对昂贵的操作,因此一旦JVM获得了一些内存,即使当时不需要它也很不愿意将其归还。

你考虑过使用内存分析器吗? 如果您没有访问权限,可以先捕获一堆jmap -histo 并编写脚本来计算差异。

System.gc无法保证在运行时是否应释放任何内存。 请参阅为什么调用System.gc()是不好的做法?

如果设置为较大的值,请尝试调整Xmx JVM arg并查看JConsole以查看内存使用情况和GC活动的情况。 通常你会看到一个锯齿形图案。

您可能还想使用分析器来查看内存的使用位置并识别任何泄漏。

发生以下两件事之一:

1)您的申请正在泄露参考资料。 当你不再需要它们时,你确定没有挂在物体上吗? 如果这样做,Java必须将它们保存在内存中。

2)Java的工作正常。 你没有从你没有使用的记忆中获益。