加速Java -Xms和-Xmx选项的权衡

nev*_*int 65 java performance jvm-arguments

鉴于这两个命令

A:

$ java -Xms10G -Xmx10G myjavacode input.txt
Run Code Online (Sandbox Code Playgroud)

B:

$ java -Xms5G -Xmx5G myjavacode input.txt
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 由于命令A用其参数保留更多内存,A运行速度会比B快吗?
  2. 如何-Xmx-Xms影响运行过程和我的程序的输出?

bru*_*nde 165

-Xmx参数定义了堆可以为JVM获取的最大内存大小.您必须很好地了解您的程序并查看它在负载下的执行情况并相应地设置此参数.如果程序的堆内存达到最大堆大小,则较低的值可能导致OutOfMemoryExceptions或性能非常差.如果您的程序在专用服务器上运行,则可以将此参数设置得更高,因为它不会影响其他程序.

-Xms参数设置JVM的初始堆内存大小.这意味着当您启动程序时,JVM将立即分配此数量的内存.如果您的程序从一开始就消耗大量堆内存,这将非常有用.这避免了JVM不断增加堆并可以在那里获得一些性能.如果您不知道此参数是否对您有所帮助,请不要使用它.

总之,这是一个折衷方案,您必须仅根据程序的内存行为来决定.


aka*_*okd 22

这取决于你的java使用的GC.并行GC可能在更大的内存设置上更好 - 但我不是那么专家.

一般来说,如果你有更大的内存,那么它需要进行GC编辑的频率就越低 - 垃圾就有很大的空间.但是,当涉及到GC时,GC必须处理更多内存 - 这反过来可能会更慢.

  • CPU没有内存. (46认同)
  • @jinguy:我站得更正,我的意思是我的电脑. (10认同)
  • 呃.CPU确实有随机存取存储器.它被称为1级和2级缓存. (8认同)
  • 在GC上花费的总时间不会随着RAM的数量而增加,除非您有一个包含大量完整GC的病态案例.大量RAM的常见问题是,它可能导致很长时间没有执行完整的GC,然后应用程序锁定,同时它最终执行已推迟了很长时间的GC. (3认同)
  • @Michael Borgwardt:我以为我描述了和你的第二句话一样的东西. (3认同)