Java内存使用在使用应用程序时会增加,但在不使用时不会减少

Java内存使用在使用应用程序时会增加,但在不使用时不会减少,java,memory,memory-management,Java,Memory,Memory Management,我有一个java应用程序,它在使用时会占用大量内存,但当程序不被使用时,内存使用率不会下降 有没有办法强迫Java释放这个内存?因为当时不需要这个内存,我可以理解保留少量内存,但Java只保留它曾经使用过的所有内存。它以后也会重用这个内存,但必须有一种方法迫使Java在不需要时释放它 System.gc不工作。正如注释中指出的,垃圾收集器在处理对象时是否会将内存返回给系统,这一点尚不确定 也许可以为您的问题提供解决方案: 默认情况下,JVM在每个GC上增大或缩小堆,以将每个集合的可用空间与活动对

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

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


System.gc不工作。

正如注释中指出的,垃圾收集器在处理对象时是否会将内存返回给系统,这一点尚不确定

也许可以为您的问题提供解决方案:

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

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

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


System.gc
无法保证在运行时是否应该释放任何内存。看

如果将
Xmx
JVM参数设置为一个较大的值,请尝试向下调整它,并查看JConsole中的内存使用和GC活动情况。通常你会看到锯齿状的图案


您可能还希望使用探查器查看内存的使用位置并识别任何泄漏。

发生了以下两种情况之一:

1) 你的应用程序正在泄漏引用。当您不再需要对象时,是否确定您没有抓住它们?如果这样做,Java必须在内存中维护它们


2) Java运行得很好。你不会从你不使用的内存中得到任何好处。

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

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

System.gc只建议进行垃圾收集。。。它实际上并不强制垃圾收集。检查“free-m”可能其中很多都是缓存,你的堆正常运行并使用gc完成。很好的一点。我不是那样想的。更新答案。