考虑以下命令行
java -Xms128m -Xms256m myapp.jar
哪些设置适用于JVM最小内存(Xms
选项):128米或256米?
答案 0 :(得分:49)
与往常一样,检查本地JVM的具体实现,但这是一种快速的方法,可以从命令行进行检查而无需编写代码。
> java -version; java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
uintx MaxHeapSize := 2147483648 {product}
因此,在这种情况下,您会看到参数的第二个实例(2G)优先(至少在1.8中),这也是我对大多数其他现代版本的体验。
答案 1 :(得分:36)
IBM JVM将最右边的参数实例视为获胜者。我不能和HotSpot等说话。
我们这样做是因为批处理文件中经常存在深层嵌套的命令行,人们只能添加到结尾,并希望将其作为胜利者。
答案 2 :(得分:32)
FTR,OpenJDK 1.7似乎也取得了最合适的价值,至少对于-Xms来说。
答案 3 :(得分:26)
取决于JVM,也许是版本......甚至可能是你当时桌面上有多少个纸夹。它可能甚至不起作用。不要那样做。
如果由于某种原因它不在您的控制范围内,请按照运行jar的方式编译并运行它。但要注意,依靠选项的顺序是一个非常糟糕的主意。
public class TotalMemory
{
public static void main(String[] args)
{
System.out.println("Total Memory: "+Runtime.getRuntime().totalMemory());
System.out.println("Free Memory: "+Runtime.getRuntime().freeMemory());
}
}
答案 4 :(得分:9)
我打赌这是第二个。参数通常按以下顺序处理:
for( int i=0; i<argc; i++ ) {
process_argument(argv[i]);
}
但如果我正在编写java参数解析器,我会抱怨冲突的论点。
答案 5 :(得分:4)
哪些设置将适用于JVM最小内存?
在下面列出的各种Java版本中,“优胜者”是参数列表中最右边的值。正如其他人指出的那样,依靠它并不是一个好主意,但是也许这仍然是共享有用的信息。
Java 1.8.0_172
~ $ java8
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
uintx MaxHeapSize := 4219469824 {product}
Java 11.0.3
~ $ java11
java version "11.0.3" 2019-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
size_t MaxHeapSize = 4219469824 {product} {command line}
OpenJDK 12.0.1
~ $ java12
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment (build 12.0.1+12)
OpenJDK 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
size_t MaxHeapSize = 4219469824 {product} {command line}
采用OpenJDK 12.0.1
~ $ java12a
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 12.0.1+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 12.0.1+12, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
size_t MaxHeapSize = 4219469824 {product} {command line}
OpenJDK 13-ea
~ $ java13
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+22)
OpenJDK 64-Bit Server VM (build 13-ea+22, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
size_t MaxHeapSize = 4219469824 {product} {command line}
答案 6 :(得分:0)
我的实验表明它取xmx
的最大值。
因此,如果您传入 -xmx4g -xmx1g
,则需要 4t
,并且
如果你传入 -xmx1g -xmx4g
,它仍然需要 4g
。