หากฉันไม่ใช้-Xmxn
ตัวเลือกจากบรรทัดคำสั่ง Java จะมีการใช้ค่าเริ่มต้น ตามเอกสาร Java
"ค่าเริ่มต้นถูกเลือกที่รันไทม์ตามการกำหนดค่าระบบ"
การตั้งค่าการกำหนดค่าระบบใดที่ส่งผลต่อค่าเริ่มต้น
หากฉันไม่ใช้-Xmxn
ตัวเลือกจากบรรทัดคำสั่ง Java จะมีการใช้ค่าเริ่มต้น ตามเอกสาร Java
"ค่าเริ่มต้นถูกเลือกที่รันไทม์ตามการกำหนดค่าระบบ"
การตั้งค่าการกำหนดค่าระบบใดที่ส่งผลต่อค่าเริ่มต้น
คำตอบ:
บน Windows คุณสามารถใช้คำสั่งต่อไปนี้เพื่อค้นหาค่าเริ่มต้นในระบบที่แอปพลิเคชันของคุณทำงาน
java -XX: + PrintFlagsFinal -version | findstr HeapSize
มองหาตัวเลือกMaxHeapSize
(ต่อ-Xmx
) และสำหรับInitialHeapSize
-Xms
บนระบบ Unix / Linux คุณสามารถทำได้
java -XX: + PrintFlagsFinal -version | grep HeapSize
ฉันเชื่อว่าผลลัพธ์ที่ได้จะเป็นไบต์
InitialHeapSize = 262803264
และMaxHeapSize = 4206886912
ที่เกี่ยวกับ256 MBและ4 GBถ้าฉันไม่ผิด นี่หมายความว่าทุก JVM เริ่มต้นราวกับเปิดตัวพร้อม-Xms256m -Xmx4g
ตัวเลือกหรือไม่
java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
ไม่แสดงข้อความ "การใช้งาน" ที่stderr
ยาว
สำหรับ Java SE 5: ตามหลักสรีรศาสตร์ Garbage Collector [Oracle] :
ขนาดฮีปเริ่มต้น:
ใหญ่กว่า 1/64 ของหน่วยความจำทางกายภาพของเครื่องบนเครื่องหรือขั้นต่ำที่เหมาะสม ก่อน J2SE 5.0 ขนาดฮีปเริ่มต้นเริ่มต้นคือขั้นต่ำที่เหมาะสมซึ่งแตกต่างกันไปตามแพลตฟอร์ม คุณสามารถแทนที่ค่าเริ่มต้นนี้ได้โดยใช้ตัวเลือกบรรทัดคำสั่ง -Xms
ขนาดฮีปสูงสุด:
1 / 4th ของหน่วยความจำกายภาพน้อยกว่า 1GB ก่อน J2SE 5.0 ขนาดฮีปสูงสุดเริ่มต้นคือ 64MB คุณสามารถแทนที่ค่าเริ่มต้นนี้ได้โดยใช้ตัวเลือกบรรทัดคำสั่ง -Xmx
UPDATE:
ดังที่ทอมแอนเดอร์สันชี้ให้เห็นในความคิดเห็นของเขาข้างต้นสำหรับเครื่องเซิร์ฟเวอร์ จากErgonomics ใน 5.0 JavaTM Virtual Machine :
ในแพลตฟอร์ม J2SE เวอร์ชัน 5.0 คลาสของเครื่องที่เรียกว่าเครื่องระดับเซิร์ฟเวอร์นั้นถูกกำหนดให้เป็นเครื่องที่มี
- ตัวประมวลผลทางกายภาพตั้งแต่ 2 ตัวขึ้นไป
- หน่วยความจำกายภาพ 2 Gbytes ขึ้นไป
ยกเว้นแพลตฟอร์ม 32 บิตที่ใช้ระบบปฏิบัติการ Windows เวอร์ชันหนึ่ง บนแพลตฟอร์มอื่น ๆ ทั้งหมดค่าเริ่มต้นจะเหมือนกับค่าเริ่มต้นสำหรับรุ่น 1.4.2
ในแพลตฟอร์ม J2SE เวอร์ชัน 1.4.2 โดยค่าเริ่มต้นมีการเลือกต่อไปนี้
- ขนาดฮีพเริ่มต้นของ 4 Mbyte
- ขนาดฮีปสูงสุดคือ 64 Mbyte
Java 8 ใช้เวลามากกว่า1 / 64thของหน่วยความจำกายภาพของคุณสำหรับXmssizeของคุณ(Minimum HeapSize) และน้อยกว่า1 ใน 4ของหน่วยความจำกายภาพของคุณสำหรับ-Xmxsize (สูงสุด HeapSize)
คุณสามารถตรวจสอบขนาด Java heap ที่เป็นค่าเริ่มต้นโดย:
ในWindows :
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
ในLinux :
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
การตั้งค่าการกำหนดค่าระบบใดที่ส่งผลต่อค่าเริ่มต้น
หน่วยความจำกายภาพของเครื่อง& รุ่น Java
นี้มีการเปลี่ยนแปลงในJava 6 ปรับปรุง 18
สมมติว่าเรามีหน่วยความจำกายภาพมากกว่า1 GB (ค่อนข้างบ่อยในทุกวันนี้) มันเป็น 1 ใน 4 ของหน่วยความจำกายภาพของคุณสำหรับเซิร์ฟเวอร์ vm
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
เออร์เนสโตพูดถูก ตามลิงค์เขาโพสต์ [1]:
อัพเดตการกำหนดค่าฮีปไคลเอ็นต์ JVM
ในไคลเอนต์ JVM ...
ขนาดฮีปสูงสุดเริ่มต้นคือครึ่งหนึ่งของหน่วยความจำกายภาพถึงขนาดหน่วยความจำกายภาพ 192 เมกะไบต์และอีกหนึ่งในสี่ของหน่วยความจำกายภาพถึงขนาดหน่วยความจำกายภาพ 1 กิกะไบต์
ตัวอย่างเช่นหากเครื่องของคุณมีหน่วยความจำกายภาพ 128 เมกะไบต์ขนาดฮีปสูงสุดคือ 64 เมกะไบต์และมากกว่าหรือเท่ากับ 1 กิกะไบต์ของหน่วยความจำฟิสิคัลผลลัพธ์จะมีขนาดฮีปสูงสุด 256 เมกะไบต์
ขนาดสูงสุดของฮีปนั้นไม่ได้ใช้จริงโดย JVM เว้นแต่ว่าโปรแกรมของคุณจะสร้างออบเจ็กต์ให้เพียงพอที่จะต้องการ จำนวนที่น้อยกว่ามากเรียกว่าขนาดฮีพเริ่มต้นถูกจัดสรรระหว่างการกำหนดค่าเริ่มต้น JVM ...
- ...
- การยศาสตร์การกำหนดค่าฮีปเซิร์ฟเวอร์ JVM ตอนนี้เหมือนกับไคลเอ็นต์ยกเว้นว่าขนาดฮีพสูงสุดดีฟอลต์สำหรับ JVM แบบ 32 บิตคือ 1 กิกะไบต์ซึ่งสอดคล้องกับขนาดหน่วยความจำฟิสิคัลที่มีขนาด 4 กิกะไบต์และสำหรับ JVMs ขนาด 32 กิกะไบต์ที่สอดคล้องกัน เป็นขนาดหน่วยความจำกายภาพ 128 กิกะไบต์
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
สำหรับ IBM JVM คำสั่งมีดังต่อไปนี้:
java -verbose:sizes -version
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ IBM SDK สำหรับ Java 8: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html ? lang = th
ที่สุด!
ในฐานะของ Java 8u191 ตอนนี้คุณมีตัวเลือก:
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
ที่สามารถใช้เพื่อปรับขนาดฮีปเป็นเปอร์เซ็นต์ของ RAM ที่ใช้งานได้จริง (ซึ่งเหมือนกับ RAM ที่ติดตั้งน้อยกว่าที่เคอร์เนลใช้)
ดูหมายเหตุการเผยแพร่สำหรับ Java8 u191สำหรับข้อมูลเพิ่มเติม โปรดทราบว่าตัวเลือกจะถูกกล่าวถึงภายใต้หัวข้อนักเทียบท่า แต่ที่จริงแล้วตัวเลือกเหล่านี้จะใช้ไม่ว่าคุณจะอยู่ในสภาพแวดล้อมของนักเทียบท่าหรือในสภาพแวดล้อมแบบดั้งเดิม
ค่าเริ่มต้นสำหรับMaxRAMPercentage
คือ 25% นี่เป็นแบบอนุรักษ์นิยมอย่างยิ่ง
กฎของฉันเอง: หากโฮสต์ของคุณทุ่มเทให้มากขึ้นหรือน้อยลงในการใช้งานจาวาแอปพลิเคชันที่ระบุคุณสามารถทำได้โดยไม่มีปัญหาเพิ่มขึ้นอย่างมาก หากคุณอยู่บน Linux เพียงใช้ daemons มาตรฐานและติดตั้ง RAM จากที่อื่นประมาณ 1 Gb ขึ้นไปฉันไม่ลังเลเลยที่จะใช้ 75% สำหรับกองของ JVM อีกครั้งจำไว้ว่านี่คือ 75% ของ RAM ที่มีอยู่ไม่แรมที่ติดตั้ง สิ่งที่เหลืออยู่คือกระบวนการเชื่อมโยงผู้ใช้อื่น ๆ ที่อาจทำงานอยู่บนโฮสต์และหน่วยความจำประเภทอื่นที่ JVM ต้องการ (เช่นสำหรับสแต็ก) ทั้งหมดนี้เข้าด้วยกันซึ่งโดยทั่วไปจะพอดีใน 25% ที่เหลืออยู่ เห็นได้ชัดว่าเมื่อติดตั้ง RAM มากขึ้น 75% จึงปลอดภัยและปลอดภัยกว่า (ฉันหวังว่าคน JDK ได้ใช้ตัวเลือกที่คุณสามารถระบุบันได)
การตั้งค่าMaxRAMPercentage
ตัวเลือกมีลักษณะดังนี้:
java -XX:MaxRAMPercentage=75.0 ....
โปรดทราบว่าค่าเปอร์เซ็นต์เหล่านี้เป็นประเภท 'double' ดังนั้นคุณต้องระบุด้วยจุดทศนิยม คุณได้รับข้อผิดพลาดค่อนข้างแปลกถ้าคุณใช้ "75" แทน "75.0"
เลือกค่าเริ่มต้นที่รันไทม์ตามการกำหนดค่าระบบ
ดูที่หน้าเอกสาร
ขนาดฮีปเริ่มต้น
เว้นเสียแต่ว่าจะระบุขนาดฮีพเริ่มต้นและสูงสุดในบรรทัดคำสั่งจะคำนวณจากจำนวนหน่วยความจำบนเครื่อง
ขนาดเริ่มต้นและสูงสุดสูงสุดของไคลเอ็นต์ JVM สำหรับไคลเอ็นต์:
ขนาดกองสูงสุดเริ่มต้นเป็นครึ่งหนึ่งของหน่วยความจำกายภาพขึ้นไปขนาดหน่วยความจำทางกายภาพของ 192 เมกะไบต์ (MB)และอื่น ๆหนึ่งในสี่ของหน่วยความจำกายภาพขึ้นไปขนาดหน่วยความจำทางกายภาพของ 1 กิกะไบต์ (GB)
ขนาดเริ่มต้นและสูงสุดสูงสุดของเซิร์ฟเวอร์ JVM:
เมื่อวันที่ JVMs 32 บิตขนาดสูงสุดกองเริ่มต้นสามารถเป็นได้ถึง 1 GB ถ้ามี 4 GB หรือมากกว่าหน่วยความจำกายภาพ บน JVM แบบ 64 บิตขนาดฮีปสูงสุดเริ่มต้นสามารถสูงสุด 32 GB หากมีหน่วยความจำฟิสิคัล 128 GB หรือมากกว่า
การตั้งค่าการกำหนดค่าระบบใดที่ส่งผลต่อค่าเริ่มต้น
คุณสามารถระบุขนาดฮีพเริ่มต้นและสูงสุดโดยใช้แฟล็ก-Xms (ขนาดฮีพเริ่มต้น) และ-Xmx (ขนาดฮีปสูงสุด) ถ้าคุณรู้ว่าฮีปของคุณต้องทำงานได้ดีเท่าไรคุณสามารถตั้งค่า-Xmsและ-Xmxให้เป็นค่าเดียวกันได้
Xms
และXmx
มีธงของเครื่องเสมือน Java (JVM):
Xms
: initial and minimum
JVMheap size
Format
: -Xmx<size>[g|G|m|M|k|K]
Default Size
:
-server
โหมด: 25% ของหน่วยความจำกายภาพฟรี> = 8MB และ <= 64MB-client mode
: 25% ของหน่วยความจำกายภาพฟรี> = 8MB และ <= 16MBTypical Size
:
-Xms128M
-Xms256M
-Xms512M
Function
/ Effect
:
Xms
หน่วยความจำขนาดXmx
: maximum
JVMheap size
Format
: -Xmx<size>[g|G|m|M|k|K]
Default Size
:
<= R27.2
Windows
: 75%
ของหน่วยความจำกายภาพทั้งหมดจนถึง1GB
Linux/Solaris
: 50%
ของหน่วยความจำกายภาพที่มีอยู่สูงสุด1GB
>= R27.3
Windows X64
: 75%
ของหน่วยความจำกายภาพทั้งหมดจนถึง2GB
Linux/Solaris X64
: 50%
ของหน่วยความจำกายภาพที่มีอยู่สูงสุด2GB
Windows x86
: 75%
ของหน่วยความจำกายภาพทั้งหมดจนถึง1GB
Linux/Solaris X86
: 50%
ของหน่วยความจำกายภาพที่มีอยู่สูงสุด1GB
Typical Size
:
-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
Function
/ Effect
:
Xmx
หน่วยความจำขนาดสูงสุดได้
Xmx
จะjava.lang.OutOfMemoryError
OutOfMemoryError
อย่างไร
Xmx
ค่า
-Xmx4g
ถึง-Xmx8g
ดู doc อย่างเป็นทางการ: -X ตัวเลือกบรรทัดคำสั่ง
จำนวนพารามิเตอร์มีผลต่อขนาดการสร้าง แผนภาพต่อไปนี้แสดงให้เห็นถึงความแตกต่างระหว่างพื้นที่ที่กำหนดและพื้นที่เสมือนในฮีป ในการเริ่มต้นของเครื่องเสมือนพื้นที่ทั้งหมดสำหรับฮีปจะถูกสงวนไว้ ขนาดของพื้นที่ที่สงวนไว้สามารถระบุได้ด้วย-Xmx
ตัวเลือก หากค่าของ-Xms
พารามิเตอร์มีขนาดเล็กกว่าค่าของ-Xmx
พารามิเตอร์พื้นที่ทั้งหมดที่สงวนไว้จะถูกกำหนดให้กับเครื่องเสมือนในทันที พื้นที่ปราศจากข้อผูกมัดมีป้ายกำกับว่า "เสมือน" ในรูปนี้ ส่วนต่าง ๆ ของฮีป (รุ่นถาวรรุ่นที่ใช้งานและรุ่นเยาว์) สามารถขยายไปถึงขีด จำกัด ของพื้นที่เสมือนได้ตามต้องการ
ตามค่าเริ่มต้นเครื่องเสมือนจะเพิ่มหรือลดขนาดฮีปในแต่ละคอลเล็กชันเพื่อพยายามรักษาสัดส่วนของพื้นที่ว่างต่อวัตถุที่มีชีวิตในแต่ละคอลเล็กชันภายในช่วงที่กำหนด ช่วงเป้าหมายแห่งนี้ตั้งอยู่เป็นร้อยละของพารามิเตอร์ที่ - XX:MinHeapFreeRatio=<minimum>
และ-XX:MaxHeapFreeRatio=<maximum>
และขนาดรวมอยู่ทางทิศด้านล่างโดยและข้างต้นโดย-Xms<min>
-Xmx<max>
พารามิเตอร์ค่าเริ่มต้น
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64m
ค่าเริ่มต้นของพารามิเตอร์ขนาดฮีพบนระบบ 64 บิตมีขนาดเพิ่มขึ้นประมาณ 30% การเพิ่มขึ้นนี้มีวัตถุประสงค์เพื่อชดเชยขนาดวัตถุที่ใหญ่กว่าในระบบ 64 บิต
ด้วยพารามิเตอร์เหล่านี้หากเปอร์เซ็นต์ของพื้นที่ว่างในรุ่นต่ำกว่า 40% การสร้างจะถูกขยายเพื่อรักษาพื้นที่ว่าง 40% จนถึงขนาดสูงสุดของรุ่นที่อนุญาต ในทำนองเดียวกันหากพื้นที่ว่างมากกว่า 70% การสร้างจะถูกทำสัญญาเพื่อให้มีพื้นที่ว่างเพียง 70% ขึ้นอยู่กับขนาดขั้นต่ำของการสร้าง
แอปพลิเคชันเซิร์ฟเวอร์ขนาดใหญ่มักประสบปัญหาสองประการเกี่ยวกับค่าเริ่มต้นเหล่านี้ หนึ่งคือการเริ่มต้นช้าเนื่องจากฮีปเริ่มต้นมีขนาดเล็กและต้องถูกปรับขนาดผ่านคอลเลกชันหลัก ๆ ปัญหาเร่งด่วนยิ่งขึ้นคือขนาดฮีปสูงสุดเริ่มต้นนั้นเล็กเกินไปสำหรับแอปพลิเคชันเซิร์ฟเวอร์ส่วนใหญ่อย่างไม่มีเหตุผล กฎง่ายๆสำหรับแอปพลิเคชันเซิร์ฟเวอร์คือ:
โดยทั่วไปเพิ่มหน่วยความจำเมื่อคุณเพิ่มจำนวนตัวประมวลผลเนื่องจากการจัดสรรสามารถขนานกันได้