让 JVM 根据需要增加内存需求,直至达到虚拟机限制的大小?

2022-09-03 03:48:11

我们发布了一个Java应用程序,其内存需求可能会有很大差异,具体取决于它正在处理的数据的大小。如果未设置最大 VM(虚拟内存)大小,则 JVM 通常会因大数据上的 GC 故障而退出。

我们希望看到的是,JVM请求更多的内存,因为GC无法提供足够的内存,直到总的可用VM耗尽。例如,从128Mb开始,每当GC失败时,就会以几何方式(或其他一些步骤)增加。

JVM(“Java”)命令行允许显式设置最大VM大小(各种-Xm*命令),并且您认为这已经足够了。我们尝试在应用程序附带的 .cmd 文件中执行此操作。但是,如果您选择任何特定的数字,则会出现以下两种不良行为之一:1)如果您的数字足够小,可以在大多数目标系统上工作(例如,1Gb),则对于大数据来说还不够大,或者2)如果您将其设置为非常大,JVM将拒绝在实际VM小于指定值的系统上运行。

如何设置Java以在需要时使用可用的VM,而无需事先知道该数字,也无需在启动时将其全部抓取?


答案 1

您还可以使用以下选项:-XX:+AggressiveHeap

根据[文档][1]:

-XX:+AggressiveHeap 选项检查计算机资源(内存大小和处理器数量),并尝试将各种参数设置为长时间运行的内存分配密集型作业的最佳参数。它最初是为具有大量内存和大量CPU的机器设计的,但在J2SE平台的1.4.1及更高版本中,即使在四台处理器机器上,它也表明自己是有用的。使用此选项时,吞吐量收集器 (-XX:+UseParallelGC) 与自适应大小调整 (-XX:+UseAdaptiveSizePolicy) 一起使用。计算机上的物理内存必须至少为 256MB,然后才能使用 AggressiveHeap。初始堆的大小是根据物理内存的大小计算的,并尝试最大限度地利用堆的物理内存(即,算法尝试使用几乎与总物理内存一样大的堆)。

[1]:http://java.sun.com/docs/hotspot/gc1.4.2/#4.2.2。侵略性|外线


答案 2

最大VM大小确实满足了这种需求(它设置了最大值,但VM将逐步只需要),但是如果您需要几种配置,除了提供不同的“cmd”文件之外,我真的看不到一种方法(尽管我会搜索更多一些)

[编辑]使用第一个程序/脚本(甚至是另一个java程序),它会检查系统的可用资源,然后根据从系统中检索到的内容,仅使用适当的-Xm调用您的程序怎么样?这样,它就可以适应机器,即使你以前不了解它们。可能是一个想法...

[第二次编辑]好吧,这已经是斯卡夫曼提出的了,我的坏。


推荐