อะไรคือพารามิเตอร์ -Xms และ -Xmx เมื่อเริ่มต้น JVM?


1006

โปรดอธิบายการใช้XmsและXmxพารามิเตอร์ใน JVM ค่าเริ่มต้นสำหรับพวกเขาคืออะไร?


2
เมื่อใช้-Xmx128m -Xms64mมันสามารถมีจุดสูงสุดรอบ ๆ275mRES mem แต่เมื่อใช้-Xmx128m -Xms128mมันสามารถไปรอบ ๆ550mRES mem ได้โดยใช้ Java 8 สิ่งที่ดีที่สุดคือการเน้น GC และดูว่าเกิดอะไรขึ้น ...
Christophe Roussy

คำตอบ:


1358

แฟล็กXmxระบุพูลการจัดสรรหน่วยความจำสูงสุดสำหรับ Java virtual machine (JVM) ในขณะที่Xmsระบุพูลการจัดสรรหน่วยความจำเริ่มต้น

ซึ่งหมายความว่า JVM ของคุณจะเริ่มต้นด้วยXmsจำนวนหน่วยความจำและจะสามารถใช้Xmxหน่วยความจำได้สูงสุด ตัวอย่างเช่นการเริ่มต้น JVM เช่นด้านล่างจะเริ่มด้วยหน่วยความจำ 256 MB และจะทำให้กระบวนการใช้หน่วยความจำสูงสุด 2048 MB:

java -Xms256m -Xmx2048m

แฟล็กหน่วยความจำยังสามารถระบุได้ในขนาดต่าง ๆ เช่นกิโลไบต์เมกะไบต์และอื่น ๆ

-Xmx1024k
-Xmx512m
-Xmx8g

การXmsตั้งค่าสถานะไม่มีค่าเริ่มต้นและXmxโดยทั่วไปมีค่าเริ่มต้นของ 256 MB java.lang.OutOfMemoryErrorใช้งานทั่วไปสำหรับธงเหล่านี้คือเมื่อคุณพบ

เมื่อใช้การตั้งค่าเหล่านี้โปรดจำไว้ว่าการตั้งค่าเหล่านี้ใช้สำหรับฮีปของ JVM และ JVM สามารถ / จะใช้หน่วยความจำมากกว่าขนาดที่จัดสรรให้กับฮีป จากเอกสารของ Oracle :

โปรดทราบว่า JVM ใช้หน่วยความจำมากกว่าฮีป ตัวอย่างเช่นวิธี Java, สแต็กของเธรดและตัวจัดการเนทิฟถูกจัดสรรในหน่วยความจำแยกจากฮีปรวมถึงโครงสร้างข้อมูลภายใน JVM


12
เป็นเช่นนั้นเมื่อการใช้หน่วยความจำเกินกว่า Xmx เราได้รับ jvm จากข้อยกเว้นหน่วยความจำ
Pankaj

59
ใช่ที่ถูกต้อง. เมื่อพยายามเกินนั้นถึงแม้ว่ามันอาจจะเก็บขยะเพื่อพยายามเพิ่มหน่วยความจำให้เพียงพอ หากยังมีหน่วยความจำไม่เพียงพอที่จะตอบสนองคำขอและฮีปมีขนาดสูงสุดแล้วOutOfMemoryErrorจะเกิดขึ้น
David Conrad

2
เมื่อฉันใช้เฟรมเวิร์ก ForkJoin คอมพิวเตอร์ของฉันขัดข้องเพราะใช้หน่วยความจำมากเกินไป เป็นไปได้หรือไม่ว่าใน OpenJDK ไม่มีการ จำกัด หน่วยความจำอย่างหนักตามค่าเริ่มต้น?
Christophe De Troyer

6
ชี้แจงอย่างชัดเจนที่java -Xmx 1G หมายถึง 1 GB หรือ 2 ^ 30 B หรือไม่ วิธีที่ชัดเจนในการแสดงให้เห็นว่าหน่วยความจำที่คุณเริ่มต้นด้วย-Xms256mคือ "256 MiB" ไม่ใช่ "256 MB" เนื่องจากมันไปด้วยพลังไบนารีมากกว่าพลังสิบ ดูen.wikipedia.org/wiki/Binary_prefix นอกจากนี้เนื่องจากพื้นที่ที่ไม่สามารถใช้งานได้ถูกตั้งค่าไว้สำหรับสระว่ายน้ำพิเศษของพื้นที่ผู้รอดชีวิตจำนวนหน่วยความจำที่ใช้งานได้จริงจะRuntime.getRuntime().maxMemory()น้อยกว่าค่าที่ระบุผ่าน -Xmx
nealmcb

1
คู่มือที่มีประโยชน์เกี่ยวกับข้อผิดพลาดทั่วไปที่เกี่ยวข้องกับขนาดฮีป: blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size
ctrlplusb

313

เรียกใช้คำสั่งjava -Xและคุณจะได้รับรายการ-Xตัวเลือกทั้งหมด:

C:\Users\Admin>java -X
-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                      set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                      append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                      prepend in front of bootstrap class path
-Xdiag            show additional diagnostic messages
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size.........................
-Xmx<size>        set maximum Java heap size.........................
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.
-XshowSettings    show all settings and continue
-XshowSettings:all         show all settings and continue
-XshowSettings:vm          show all vm related settings and continue
-XshowSettings:properties  show all property settings and continue
-XshowSettings:locale      show all locale related settings and continue

ตัวเลือก -X ไม่ได้มาตรฐานและอาจมีการเปลี่ยนแปลงโดยไม่ต้องแจ้งให้ทราบล่วงหน้า

ฉันหวังว่านี้จะช่วยให้คุณเข้าใจXms, Xmxเช่นเดียวกับสิ่งอื่น ๆ ที่มีความสำคัญมากที่สุด :)


1
เรียนรู้คำสั่งใหม่วันนี้ขอบคุณ @RupeshYadav
jumping_monkey

18

คุณสามารถระบุไว้ใน IDE ของคุณ ตัวอย่างเช่นสำหรับ Eclipse ในการเรียกใช้การตั้งค่า → การขัดแย้ง VM คุณสามารถป้อน-Xmx800m -Xms500mเป็น

ป้อนคำอธิบายภาพที่นี่


ใน RubyMine บน OSX มันอยู่ในเมนูช่วยเหลือ> แก้ไขตัวเลือก VM ที่กำหนดเอง
Jon Schneider

8
สิ่งนี้ไม่ตอบคำถาม คำถามเกี่ยวกับสิ่งที่พวกเขามีไว้ไม่ใช่วิธีการตั้งค่า
Captain Man

@Hearen วิธีการ sep ใน intellij ??

13

คำถามดังกล่าวได้รับการแก้ไขแล้วด้านบน เพียงเพิ่มส่วนหนึ่งของค่าเริ่มต้น

ตามhttp://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

ค่าเริ่มต้นของ Xmx จะขึ้นอยู่กับแพลตฟอร์มและจำนวนหน่วยความจำที่มีอยู่ในระบบ


8
สำหรับ JVM อื่น ๆ (นอกเหนือจาก JRockit) ดูโพสต์นี้เพื่อกำหนดค่า Xmx / Xms เริ่มต้นของ JVM ของคุณ: stackoverflow.com/questions/4667483/ …
Ogre Psalm33

3

-Xmsขนาดฮีพเริ่มต้นสำหรับการเริ่มต้นอย่างไรก็ตามในระหว่างกระบวนการทำงานขนาดฮีปอาจน้อยกว่า-Xms เนื่องจากการไม่ทำงานของผู้ใช้หรือการทำซ้ำ GC นี่ไม่ใช่ขนาดฮีปที่ต้องการน้อยที่สุด

ขนาดxxสูงสุดสูงสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.