Java 如何将JVM配置为仅在确实需要时分配内存?
我有一个应用程序,当我使用jvm命令Java 如何将JVM配置为仅在确实需要时分配内存?,java,memory-management,jvm,jvm-arguments,Java,Memory Management,Jvm,Jvm Arguments,我有一个应用程序,当我使用jvm命令-Xmx65m时可以执行。虽然运行良好,但我希望允许应用程序消耗更多内存,因为它有一些需要的特性。问题是,如果我增加-Xmx选项,JVM将分配更多内存来运行仅需65MB即可处理的功能 是否可以将JVM配置为仅在选项用尽且即将抛出OutOfMemoryError时向SO请求更多内存?JVM在启动时将最大堆大小保留为虚拟内存,但它只使用所需的内存量(即使设置了最小大小,也可能不会使用那么多)如果它使用了大量内存,但不再需要它,它可以返回给操作系统(但通常不需要)
-Xmx65m
时可以执行。虽然运行良好,但我希望允许应用程序消耗更多内存,因为它有一些需要的特性。问题是,如果我增加-Xmx
选项,JVM将分配更多内存来运行仅需65MB即可处理的功能
是否可以将JVM配置为仅在选项用尽且即将抛出OutOfMemoryError时向SO请求更多内存?JVM在启动时将最大堆大小保留为虚拟内存,但它只使用所需的内存量(即使设置了最小大小,也可能不会使用那么多)如果它使用了大量内存,但不再需要它,它可以返回给操作系统(但通常不需要)
也许你没有看到一个逐渐增加,因为你的最大值是如此之小。尝试使用最大值
-mx1g
并在jvisualvm
中查看最大堆大小是如何增长的。JVM在启动时将最大堆大小保留为虚拟内存,但它只使用它所需的数量(即使您设置了最小大小,也可能不会使用那么多)如果它使用了大量内存,但不再需要它,它可以返回给操作系统(但通常不需要)
也许你没有看到一个逐渐增加,因为你的最大值是如此之小。尝试使用最大值
-mx1g
并在jvisualvm
中查看最大堆大小是如何增长的。请添加最小、最大内存设置。这样JVM就可以从最小所需内存开始,并在需要时不断分配更多内存
-Xms65m-Xmx512m
希望这有帮助。请添加最小和最大内存设置。这样JVM就可以从最小所需内存开始,并在需要时不断分配更多内存 -Xms65m-Xmx512m 希望这有帮助 是否可以将JVM配置为仅在选项用尽且即将抛出OutOfMemoryError时向SO请求更多内存 随着JVM接近最终耗尽空间,它运行GC的频率越来越高,应用程序吞吐量(以每CPU每秒完成的有用工作计算)急剧下降。如果你能避免的话,你不希望发生这种事 有一个GC调优选项可用于阻止JVM增加堆。
-XX:MinHeapFreeRatio
选项设置“GC后堆空闲的最小百分比,以避免扩展”。如果您将此值从默认值40%减少到(比如)20%,那么GC将不那么急于扩展堆
不利的一面是,如果减少-XX:MinHeapFreeRatio
,JVM作为一个整体将花费更大比例的时间运行垃圾收集器。如果走得太远,后果可能相当严重。(就个人而言,我根本不建议更改此设置…)
是否可以将JVM配置为仅在选项用尽且即将抛出OutOfMemoryError时向SO请求更多内存
随着JVM接近最终耗尽空间,它运行GC的频率越来越高,应用程序吞吐量(以每CPU每秒完成的有用工作计算)急剧下降。如果你能避免的话,你不希望发生这种事
有一个GC调优选项可用于阻止JVM增加堆。-XX:MinHeapFreeRatio
选项设置“GC后堆空闲的最小百分比,以避免扩展”。如果您将此值从默认值40%减少到(比如)20%,那么GC将不那么急于扩展堆
不利的一面是,如果减少
-XX:MinHeapFreeRatio
,JVM作为一个整体将花费更大比例的时间运行垃圾收集器。如果走得太远,后果可能相当严重。(就个人而言,我不建议更改此设置…您能解释一下它与JVM当前的工作有什么不同吗?“是否可以将JVM配置为只向SO请求更多内存,而仅当它没有选项并且即将抛出OutOfMemoryError时?”基本上,不。但这就是Xms
选项的用途。您能解释一下它与JVM当前的工作有什么不同吗?“是否可以将JVM配置为只向SO请求更多内存,而仅当它没有选项并且即将抛出OutOfMemoryError时?”基本上,没有。但这就是Xms
选项的用途。