在启动前确定最佳Java运行时参数?

在启动前确定最佳Java运行时参数?,java,batch-file,memory,heap,Java,Batch File,Memory,Heap,我们正在运行一个Java应用程序,用于呈现显示大量图像的ans。为了使这一切顺利进行,我们需要分配相当数量的堆空间,并检查计算机上是否有64位版本。我们希望在许多不同的计算机上运行该应用程序,因此通过反复试验手动检查可用内存和运行时版本是相当麻烦的 是否有人知道一种方法来确定可为堆空间保留的可用内存,并确定可用JRE;所以我们可以在执行jar时以某种方式将这些参数传递给JRE 我知道这需要某种批处理文件,如本文所述: 有没有人遇到过Windows环境的运行示例?我对Windows批处理文件的了

我们正在运行一个Java应用程序,用于呈现显示大量图像的ans。为了使这一切顺利进行,我们需要分配相当数量的堆空间,并检查计算机上是否有64位版本。我们希望在许多不同的计算机上运行该应用程序,因此通过反复试验手动检查可用内存和运行时版本是相当麻烦的

是否有人知道一种方法来确定可为堆空间保留的可用内存,并确定可用JRE;所以我们可以在执行jar时以某种方式将这些参数传递给JRE

我知道这需要某种批处理文件,如本文所述:

有没有人遇到过Windows环境的运行示例?我对Windows批处理文件的了解充其量是有限的


关于,Marius检查java是否为64位:

java -version 2>&1|find /i "64-Bit" && echo YEP!||echo NOPE!
要获取可用内存,请执行以下操作:

wmic os get freephysicalmemory
或:

编辑 获得可用内存的通用快速方法:

mshta "javascript:close(new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(GetObject('winmgmts:').ExecQuery('Select * from Win32_PerfFormattedData_PerfOS_Memory').ItemIndex(0).AvailableBytes));"|more
将结果分配给变量:

for  /f "usebackq" %%a in (`mshta ^"javascript^:close^(new ActiveXObject^(^'Scripting.FileSystemObject^'^).GetStandardStream^(1^).Write^(GetObject^(^'winmgmts:^'^).ExecQuery^(^'Select * from Win32_PerfFormattedData_PerfOS_Memory^'^).ItemIndex^(0^).AvailableBytes^)^);^"^|more`) do set free_mem=%%a

而不是检查可用内存和储备堆取决于此,我会考虑是否有足够的内存堆堆空间,你需要。区别很重要,因为使用减少的堆空间启动应用程序会使应用程序容易出现OutOfMemory错误JRE已经有了一个相当好的默认值,并且会根据可用的物理内存调整堆的大小。在Java7中,它是总RAM的四分之一,或者最大1GB@MarkoTopolnik,这就是服务器VM;必须确保使用它。@Gimby我测试了这个:
java-client-XX:+PrintCommandLineFlags-version
,它说
-XX:MaxHeapSize=2147483648
。这是2GB,所以实际上我在上面的评论中是错的:它高达2GB(服务器和客户端)。@MarkoTopolnik:奇怪,因为我可以发誓你说的是真的,至少在Java6更新17/18和更高版本中是这样;可能是Java 7中发生了一些变化,我们错过了。最后一个很慢完成,因为它扫描了所有的修补程序。@MarkoTopolnik:是的,windows的Home/Basic/starter版本中没有WMIC。现在考虑使用mshta+vbscript作为通用解决方案。您好,这些方法会返回一个可以安全地分配给JVM的值吗?对于物理内存,我不介意该值(至少在RAM较少的系统上)是否包括包括交换文件在内的可用内存,而物理内存仅限于费用RAM?我添加了一个代码,允许将可用内存分配给变量。可以以类似的方式获取页面文件。检查此处的wql查询:
for  /f "usebackq" %%a in (`mshta ^"javascript^:close^(new ActiveXObject^(^'Scripting.FileSystemObject^'^).GetStandardStream^(1^).Write^(GetObject^(^'winmgmts:^'^).ExecQuery^(^'Select * from Win32_PerfFormattedData_PerfOS_Memory^'^).ItemIndex^(0^).AvailableBytes^)^);^"^|more`) do set free_mem=%%a