使用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的工作正常。 你没有从你没有使用的记忆中获益。