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

时间:2010-06-11 11:48:53

标签: java memory memory-management

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

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

System.gc无效。

5 个答案:

答案 0 :(得分:7)

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

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

  

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

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

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

enter image description here

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

System.gc无法保证在运行时是否应释放任何内存。见Why is it bad practice to call System.gc()?

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

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

答案 4 :(得分:0)

正在发生以下两件事之一:

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

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