중복 된 Java 런타임 옵션 : 선호하는 순서는 무엇입니까?


82

다음 명령 줄 고려

java -Xms128m -Xms256m myapp.jar

JVM 최소 메모리 ( Xms옵션)에 적용되는 설정은 128m 또는 256m입니까?


17
문제의 오타가 없습니다. Xms 옵션은 의도적으로 두 번 사용됩니다. 이 질문의 물질
fabien7474

답변:


28

JVM에 따라, 아마도 버전에 따라 다를 수 있습니다. 아마도 당시 책상에 얼마나 많은 종이 클립이 있는지도 모릅니다. 작동하지 않을 수도 있습니다. 그러지 마.

어떤 이유로 든 제어 할 수없는 경우 항아리를 실행하는 것과 동일한 방식으로 컴파일하고 실행하십시오. 그러나 경고를 받으십시오. 옵션의 순서에 의존하는 것은 정말 나쁜 생각입니다.

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());
    }
}

2
+1-클립을 세는 것이 좋습니다 :-). 진지하게, 모호한 주장을 통과하는 모든 것을 바꾸는 것은 로켓 과학이 아닙니다.
Stephen C

4
다른 수의 종이 클립으로 시도했습니다. 첫 번째로 전환 찾을 수 없습니다
OganM

65

항상 그렇듯이 로컬 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에서)이며 대부분의 다른 최신 버전에 대한 경험이기도합니다.


8
java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize, 이렇게하면 추론하기가 더 쉽습니다.
ryenus 2015


37

FTR, OpenJDK 1.7은 적어도 -Xms에 대해 가장 오른쪽 값을 취하는 것 같습니다.


14
옹호하는 대신 실제로 질문에 답하면 +1.
JimN 2014 년

1
CSS와 마찬가지로 나중에 승리
ryenus 2015

9

두 번째 인 것 같습니다. 인수는 일반적으로 다음 순서로 처리됩니다.

for( int i=0; i<argc; i++ ) {
  process_argument(argv[i]);
}

그러나 Java 인수 파서를 작성하는 경우 충돌하는 인수에 대해 불평 할 것입니다.


8

JVM 최소 메모리에는 어떤 설정이 적용됩니까?

아래 나열된 다양한 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}

자바 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}

AdoptOpenJDK 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 개

~ $ 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}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.