Biorąc pod uwagę następujący wiersz poleceń
java -Xms128m -Xms256m myapp.jar
Jakie ustawienia będą dotyczyć maszyny JVM Minimalna pamięć ( Xms
opcja): 128 m czy 256 m?
java
jvm
jvm-arguments
java-opts
fabien7474
źródło
źródło
Odpowiedzi:
Zależy od JVM, być może wersji ... może nawet od tego, ile spinaczy masz na biurku w tym czasie. To może nawet nie zadziałać. Nie rób tego.
Jeśli z jakiegoś powodu nie masz na to wpływu, skompiluj i uruchom w ten sam sposób, w jaki uruchamiasz jar. Ale ostrzegam, poleganie na kolejności opcji to naprawdę zły pomysł.
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()); } }
źródło
Jak zawsze, sprawdź konkretną implementację lokalnej maszyny JVM, ale tutaj jest szybki sposób na sprawdzenie z wiersza poleceń bez konieczności kodowania.
> 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}
Więc zobaczysz w tym przypadku, drugie wystąpienie argumentu (2G) ma pierwszeństwo (przynajmniej w 1.8) i to było również moje doświadczenie z większością innych nowoczesnych wersji.
źródło
java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize
w ten sposób łatwiej jest wywnioskować.IBM JVM traktuje skrajną prawą instancję argumentu jako zwycięzcę. Nie mogę rozmawiać z HotSpotem itp.
Robimy to, ponieważ często istnieją głęboko zagnieżdżone wiersze poleceń z plików wsadowych, w których ludzie mogą dodawać tylko na końcu i chcą, aby wygrał.
źródło
FTR, OpenJDK 1.7 również wydaje się przyjmować skrajną prawą wartość, przynajmniej dla -Xms.
źródło
Założę się, że to drugi. Argumenty są zwykle przetwarzane w kolejności:
for( int i=0; i<argc; i++ ) { process_argument(argv[i]); }
Ale gdybym pisał parser argumentów Java, narzekałbym na sprzeczne argumenty.
źródło
W różnych wersjach języka Java wymienionych poniżej „zwycięzca” jest najbardziej po prawej stronie na liście argumentów. Jak zauważyli inni, poleganie na tym nie jest dobrym pomysłem, ale być może warto się tym podzielić.
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}
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-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}
źródło