Xmxsize เริ่มต้นใน Java 8 (ขนาดฮีปสูงสุด)

ในเอกสารประกอบของ oracle ฉันพบ:

-Xmxsize ระบุขนาดสูงสุด (เป็นไบต์) ของพูลการจัดสรรหน่วยความจำเป็นไบต์ ... ค่าเริ่มต้นจะถูกเลือกขณะรันไทม์ตามการกำหนดค่าระบบ

การกำหนดค่าระบบหมายความว่าอย่างไร


person Vitaly    schedule 02.02.2015    source แหล่งที่มา
comment
หมายความว่าหากระบบของคุณมี RAM 16 GB ขนาดจะใหญ่กว่าหากมี 512 MB   -  person JB Nizet    schedule 02.02.2015
comment
ขอบคุณครับ ใหญ่กว่านี้เท่าไรครับ?   -  person Vitaly    schedule 02.02.2015
comment
มองหาขนาดฮีปสูงสุดที่นี่   -  person Nir Alfasi    schedule 02.02.2015
comment
››เล็กกว่า 1/4 ของหน่วยความจำกายภาพหรือ 1GB ขอบคุณ @alfasin   -  person Vitaly    schedule 02.02.2015
comment
oracle.com/technetwork/java/ergo5-140223.html   -  person jmj    schedule 02.02.2015
comment
@Vitaly ดูเหมือนว่าขีด จำกัด 1Gb จะไม่คงไว้สำหรับ -Xmx อย่างน้อยใน Java 8 เพราะในระบบ linux 64 บิตของฉันซึ่งมีหน่วยความจำทั้งหมดเป็น 6Gb ฉันมี jvm มี -Xmx = 1.5Gb โดยค่าเริ่มต้น   -  person user218867    schedule 18.01.2017
comment
@Vitaly โปรดทราบว่าคำตอบของคุณสำหรับ Java SE5 จาก SE8 ขนาดฮีปสูงสุดคือ 256mb โดยค่าเริ่มต้นสำหรับไคลเอ็นต์ jvm   -  person Vyshnav Ramesh Thrissur    schedule 08.05.2019
comment
@Eric Wang คุณอาจใช้เซิร์ฟเวอร์ jvm แทนที่จะเป็นไคลเอนต์ jvm เซิร์ฟเวอร์ jvm สามารถมีขนาดฮีปสูงสุด 1gb หรือ 32 gb ตามค่าเริ่มต้น ขึ้นอยู่กับ RAM   -  person Vyshnav Ramesh Thrissur    schedule 08.05.2019
comment
สิ่งนี้ตอบคำถามของคุณหรือไม่? ขนาดฮีป Java สูงสุดเริ่มต้นกำหนดอย่างไร   -  person rogerdpack    schedule 06.04.2020


คำตอบ (5)


ขึ้นอยู่กับการใช้งานและเวอร์ชัน แต่โดยทั่วไปจะขึ้นอยู่กับ VM ที่ใช้ (เช่น ไคลเอนต์หรือเซิร์ฟเวอร์ ดูพารามิเตอร์ -client และ -server) และในหน่วยความจำระบบของคุณ

บ่อยครั้งสำหรับ client ค่าเริ่มต้นคือ 1/4 ของหน่วยความจำกายภาพของคุณหรือ 1GB (แล้วแต่จำนวนใดจะน้อยกว่า)

นอกจากนี้ ตัวเลือกการกำหนดค่า Java (พารามิเตอร์บรรทัดคำสั่ง) ยังสามารถ "จ้างภายนอก" ให้กับตัวแปรสภาพแวดล้อม รวมถึง -Xmx ซึ่งสามารถเปลี่ยนค่าเริ่มต้นได้ (หมายถึงระบุค่าเริ่มต้นใหม่) โดยเฉพาะตัวแปรสภาพแวดล้อม JAVA_TOOL_OPTIONS ได้รับการตรวจสอบโดยเครื่องมือ Java ทั้งหมด และใช้หากมีอยู่ (รายละเอียดเพิ่มเติม ที่นี่ และ ที่นี่)

คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อดูค่าเริ่มต้น:

java -XX:+PrintFlagsFinal -version

มันให้รายการ loooong แก่คุณ -Xmx อยู่ใน MaxHeapSize, -Xms อยู่ใน InitialHeapSize กรองเอาต์พุตของคุณ (เช่น |grep บน linux) หรือบันทึกเป็นไฟล์เพื่อให้คุณสามารถค้นหาในนั้นได้

person icza    schedule 02.02.2015
comment
นอกจากนี้ คุณสามารถรัน java -XX:+PrintCommandLineFlags เพื่อพิมพ์ขนาดฮีป (และข้อมูลอื่นๆ) ที่เลือกโดย JVM ตามข้อมูลระบบปัจจุบัน - person Cristian Vat; 02.02.2015
comment
@CristianVat ใช่ แต่พารามิเตอร์คือ -XX:+PrintFlagsFinal พารามิเตอร์ที่คุณแนะนำใช้ไม่ได้สำหรับฉัน เพิ่มเข้าไปในคำตอบ - person icza; 02.02.2015
comment
ใช่ ขออภัย -XX:+PrintFlagsFinal เป็นตัวเลือกที่ดีที่สุดเนื่องจากควรแสดงข้อมูลทั้งหมดหลังจากพิจารณาทุกอย่างแล้ว (รวมถึงตัวเลือกแบบแมนนวลและการยศาสตร์) แม้ว่า -XX:+PrintCommandLineFlags ดูเหมือนว่าจะทำงานบน JVM ของฉัน (อาจขึ้นอยู่กับเวอร์ชันที่แน่นอน) - person Cristian Vat; 02.02.2015
comment
สำหรับกล่องขนาดใหญ่ กฎข้อที่ 1/4 ของ RAM นี้ใช้ไม่ได้ผลอย่างแน่นอน บนเซิร์ฟเวอร์แบบ 4 ซ็อกเก็ต 64GB ต่อซ็อกเก็ต (เช่น RAM 256GB) Xmx จะมีค่าเริ่มต้นอยู่ที่ ~32GB 32gb อาจเกี่ยวข้องกับข้อ จำกัด ของ CompressedOops ณ จุดนี้เช่นกัน - person FauxFaux; 12.11.2015
comment
พิมพ์บรรทัดที่เกี่ยวข้องกับขนาดฮีปเท่านั้น: java -XX:+PrintFlagsFinal -version | grep HeapSize - person user218867; 18.01.2017
comment
มีวิธีเปลี่ยนค่าอัตราส่วน 1/4 แทนค่า Xmx หรือไม่ มันจะช่วยในสถานการณ์ที่มีคอนเทนเนอร์โดยเปิดแฟล็ก -XX:+UseCGroupMemoryLimitForHeap - person xmar; 20.03.2019
comment
@icza ฉันเชื่อว่า 1/4th สอดคล้องกับไคลเอนต์ jvm และ 1gb สอดคล้องกับเซิร์ฟเวอร์ jvm ที่มีหน่วยความจำกายภาพ 4gb / มากกว่า และ 32GB สำหรับเซิร์ฟเวอร์ jvm ที่มีหน่วยความจำกายภาพ 128GB/มากกว่า กรุณาแก้ไขฉันหากฉันผิด - person Vyshnav Ramesh Thrissur; 08.05.2019
comment
@VyshnavRameshThrissur มันอาจจะเป็นเช่นนั้น คุณมีแหล่งที่มา (ลิงก์) ที่จะยืนยันหรือไม่? - person icza; 09.05.2019
comment
@icza ฉันได้โพสต์มันเป็นคำตอบด้านล่าง กรุณาดูที่มัน stackoverflow.com/a/56036202/5649620 - person Vyshnav Ramesh Thrissur; 09.05.2019

เช่นเดียวกับที่คุณได้กล่าวไว้ ค่าเริ่มต้น -Xmxsize (ขนาดฮีปสูงสุด) ขึ้นอยู่กับการกำหนดค่าระบบของคุณ

Java8 client ใช้เวลามากกว่า 1/64 ของหน่วยความจำกายภาพของคุณสำหรับ Xmssize (ขนาดฮีปขั้นต่ำ) และเล็กกว่า 1/4 ของหน่วยความจำกายภาพของคุณสำหรับ -Xmxsize (ขนาดฮีปสูงสุด) ของคุณ

ซึ่งหมายความว่าหากคุณมีหน่วยความจำกายภาพขนาด 8GB RAM คุณจะมี Xmssize ใหญ่กว่า 8*(1/64) และเล็กกว่า -Xmxsizeas 8*(1/4)

คุณสามารถตรวจสอบ HeapSize เริ่มต้นของคุณด้วย

ใน Windows:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

ใน ลินุกซ์:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

ค่าเริ่มต้นเหล่านี้สามารถแทนที่เป็นจำนวนเงินที่คุณต้องการได้

person Sarat Chandra    schedule 12.04.2017
comment
การอ้างอิง: docs.oracle.com/ javase/8/docs/technotes/guides/vm/gctuning/ - person kisna; 20.01.2018
comment
docs.oracle.com/javase/8/ docs/technotes/guides/vm/ ตามลิงก์นี้ ค่าเริ่มต้นสำหรับขั้นต่ำ/เริ่มต้นคือ 1/64 ไม่ใช่ 1/6 ใหญ่กว่า 1/64 ของหน่วยความจำกายภาพของเครื่องบนเครื่องหรือจำนวนขั้นต่ำที่สมเหตุสมผล - person Vyshnav Ramesh Thrissur; 08.05.2019

น่าแปลกที่คำถามนี้ไม่มีคำตอบที่สรุปเป็นเอกสาร บางทีจุดข้อมูลอื่นอาจให้คุณค่าแก่ผู้อื่นที่กำลังมองหาคำตอบ บนระบบของฉันที่ใช้ 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}
person brianNotBob    schedule 27.01.2017
comment
ในระบบของฉันที่มี RAM ขนาด 16 Gb: 2069889024 = 2 Gb - person david.perez; 07.02.2017
comment
Windows 7 64 บิตพร้อม RAM 8 GB: JVM 32 บิต: 256 MB, JVM 64 บิต: 2 GB - person golimar; 22.02.2017
comment
ในที่สุดก็พบเอกสารของมัน: stackoverflow.com/a/56036202/32453 - person rogerdpack; 06.04.2020

บน Ubuntu VM ของฉันซึ่งมี RAM ทั้งหมด 1,048 MB java -XX:+PrintFlagsFinal -version | grep HeapSize พิมพ์ : uintx MaxHeapSize := 266338304 ซึ่งมีขนาดประมาณ 266MB และคิดเป็น 1/4 ของ RAM ทั้งหมดของฉัน

person Binita Bharati    schedule 27.04.2018
comment
สำหรับฉันแล้วดูเหมือนว่า OpenJDK และ Oracle มีลักษณะที่แตกต่างกัน - ฉันเห็นว่า OpenJDK ใช้ 1/4 ของ RAM เป็น -Xmx ตลอดเวลา (ไม่เคยเล็กกว่า 1/4 และ 1GB) - person pogul; 20.08.2018

ณ วันที่ 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 ด้านบน

person Vyshnav Ramesh Thrissur    schedule 08.05.2019
comment
ในที่สุดก็เชื่อมโยงไปยัง docu จริงที่อธิบายสิ่งที่เกิดขึ้น - person rogerdpack; 06.04.2020