ในเอกสารประกอบของ oracle ฉันพบ:
-Xmxsize ระบุขนาดสูงสุด (เป็นไบต์) ของพูลการจัดสรรหน่วยความจำเป็นไบต์ ... ค่าเริ่มต้นจะถูกเลือกขณะรันไทม์ตามการกำหนดค่าระบบ
การกำหนดค่าระบบหมายความว่าอย่างไร
ในเอกสารประกอบของ oracle ฉันพบ:
-Xmxsize ระบุขนาดสูงสุด (เป็นไบต์) ของพูลการจัดสรรหน่วยความจำเป็นไบต์ ... ค่าเริ่มต้นจะถูกเลือกขณะรันไทม์ตามการกำหนดค่าระบบ
การกำหนดค่าระบบหมายความว่าอย่างไร
ขึ้นอยู่กับการใช้งานและเวอร์ชัน แต่โดยทั่วไปจะขึ้นอยู่กับ VM ที่ใช้ (เช่น ไคลเอนต์หรือเซิร์ฟเวอร์ ดูพารามิเตอร์ -client
และ -server
) และในหน่วยความจำระบบของคุณ
บ่อยครั้งสำหรับ client
ค่าเริ่มต้นคือ 1/4 ของหน่วยความจำกายภาพของคุณหรือ 1GB (แล้วแต่จำนวนใดจะน้อยกว่า)
นอกจากนี้ ตัวเลือกการกำหนดค่า Java (พารามิเตอร์บรรทัดคำสั่ง) ยังสามารถ "จ้างภายนอก" ให้กับตัวแปรสภาพแวดล้อม รวมถึง -Xmx
ซึ่งสามารถเปลี่ยนค่าเริ่มต้นได้ (หมายถึงระบุค่าเริ่มต้นใหม่) โดยเฉพาะตัวแปรสภาพแวดล้อม JAVA_TOOL_OPTIONS
ได้รับการตรวจสอบโดยเครื่องมือ Java ทั้งหมด และใช้หากมีอยู่ (รายละเอียดเพิ่มเติม ที่นี่ และ ที่นี่)
คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อดูค่าเริ่มต้น:
java -XX:+PrintFlagsFinal -version
มันให้รายการ loooong แก่คุณ -Xmx
อยู่ใน MaxHeapSize
, -Xms
อยู่ใน InitialHeapSize
กรองเอาต์พุตของคุณ (เช่น |grep
บน linux) หรือบันทึกเป็นไฟล์เพื่อให้คุณสามารถค้นหาในนั้นได้
java -XX:+PrintCommandLineFlags
เพื่อพิมพ์ขนาดฮีป (และข้อมูลอื่นๆ) ที่เลือกโดย JVM ตามข้อมูลระบบปัจจุบัน
- person Cristian Vat; 02.02.2015
-XX:+PrintFlagsFinal
พารามิเตอร์ที่คุณแนะนำใช้ไม่ได้สำหรับฉัน เพิ่มเข้าไปในคำตอบ
- person icza; 02.02.2015
-XX:+PrintFlagsFinal
เป็นตัวเลือกที่ดีที่สุดเนื่องจากควรแสดงข้อมูลทั้งหมดหลังจากพิจารณาทุกอย่างแล้ว (รวมถึงตัวเลือกแบบแมนนวลและการยศาสตร์) แม้ว่า -XX:+PrintCommandLineFlags
ดูเหมือนว่าจะทำงานบน JVM ของฉัน (อาจขึ้นอยู่กับเวอร์ชันที่แน่นอน)
- person Cristian Vat; 02.02.2015
java -XX:+PrintFlagsFinal -version | grep HeapSize
- person user218867; 18.01.2017
-XX:+UseCGroupMemoryLimitForHeap
- person xmar; 20.03.2019
เช่นเดียวกับที่คุณได้กล่าวไว้ ค่าเริ่มต้น -Xmxsize
(ขนาดฮีปสูงสุด) ขึ้นอยู่กับการกำหนดค่าระบบของคุณ
Java8 client
ใช้เวลามากกว่า 1/64 ของหน่วยความจำกายภาพของคุณสำหรับ Xmssize
(ขนาดฮีปขั้นต่ำ) และเล็กกว่า 1/4 ของหน่วยความจำกายภาพของคุณสำหรับ -Xmxsize
(ขนาดฮีปสูงสุด) ของคุณ
ซึ่งหมายความว่าหากคุณมีหน่วยความจำกายภาพขนาด 8GB RAM คุณจะมี Xmssize
ใหญ่กว่า 8*(1/64) และเล็กกว่า -Xmxsize
as 8*(1/4)
คุณสามารถตรวจสอบ HeapSize เริ่มต้นของคุณด้วย
ใน Windows:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
ใน ลินุกซ์:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
ค่าเริ่มต้นเหล่านี้สามารถแทนที่เป็นจำนวนเงินที่คุณต้องการได้
น่าแปลกที่คำถามนี้ไม่มีคำตอบที่สรุปเป็นเอกสาร บางทีจุดข้อมูลอื่นอาจให้คุณค่าแก่ผู้อื่นที่กำลังมองหาคำตอบ บนระบบของฉันที่ใช้ CentOS (6.8,7.3) และ Java 8 (build 1.8.0_60-b27, เซิร์ฟเวอร์ 64 บิต):
หน่วยความจำเริ่มต้นคือ 1/4 ของหน่วยความจำกายภาพ ไม่จำกัดเพียง 1GB
นอกจากนี้ -XX:+PrintFlagsFinal
จะพิมพ์ไปที่ STDERR ดังนั้นคำสั่งเพื่อกำหนดหน่วยความจำเริ่มต้นปัจจุบันที่นำเสนอโดยผู้อื่นข้างต้นควรได้รับการปรับแต่งดังต่อไปนี้:
java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize
ข้อมูลต่อไปนี้จะถูกส่งคืนบนระบบที่มี RAM จริงขนาด 64GB:
uintx MaxHeapSize := 16873684992 {product}
บน Ubuntu VM ของฉันซึ่งมี RAM ทั้งหมด 1,048 MB java -XX:+PrintFlagsFinal -version | grep HeapSize
พิมพ์ : uintx MaxHeapSize := 266338304
ซึ่งมีขนาดประมาณ 266MB และคิดเป็น 1/4 ของ RAM ทั้งหมดของฉัน
ณ วันที่ 8 พฤษภาคม 2019:
ขนาดฮีป JVM ขึ้นอยู่กับการกำหนดค่าระบบ ซึ่งหมายความว่า:
ก) ไคลเอ็นต์ jvm กับ เซิร์ฟเวอร์ jvm
ข) 32 บิต กับ 64 บิต
ลิงก์:
1) การอัปเดตจาก J2SE5.0: https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) คำตอบสั้นๆ: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html
3) คำตอบโดยละเอียด: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size
4) ไคลเอนต์เทียบกับเซิร์ฟเวอร์: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html
สรุป: (ลิงก์ด้านบนนี้เข้าใจยาก ดังนั้นสรุปไว้ที่นี่)
1) ขนาดฮีปสูงสุดเริ่มต้นสำหรับ Client jvm คือ 256mb (มีข้อยกเว้น อ่านจากลิงก์ด้านบน)
2) ขนาดฮีปสูงสุดเริ่มต้นสำหรับ Server jvm 32 บิตคือ 1gb และ 64 บิตคือ 32gb (อีกครั้งก็มีข้อยกเว้นที่นี่เช่นกัน โปรดอ่านจากลิงก์)
ดังนั้นขนาดฮีป jvm สูงสุดเริ่มต้นคือ: 256mb หรือ 1gb หรือ 32gb ขึ้นอยู่กับ VM ด้านบน
-Xmx
อย่างน้อยใน Java 8 เพราะในระบบ linux 64 บิตของฉันซึ่งมีหน่วยความจำทั้งหมดเป็น 6Gb ฉันมี jvm มี -Xmx = 1.5Gb โดยค่าเริ่มต้น - person user218867   schedule 18.01.2017