จะตั้งค่าการใช้งานหน่วยความจำสูงสุดสำหรับ JVM ได้อย่างไร?


133

ฉันต้องการ จำกัด หน่วยความจำสูงสุดที่ใช้โดย JVM หมายเหตุนี่ไม่ใช่แค่ฮีปฉันต้องการ จำกัด หน่วยความจำทั้งหมดที่ใช้โดยกระบวนการนี้

คำตอบ:


95

-Xms<memory> -Xmx<memory>ใช้ข้อโต้แย้ง ใช้MหรือGหลังตัวเลขเพื่อระบุ Megs และ Gigs of bytes ตามลำดับ -Xmsแสดงค่าต่ำสุดและ-Xmxสูงสุด


1
คุณอาจต้องการดู MaxPermSize ด้วย
urmalp

89
เขากำลังถามเกี่ยวกับหน่วยความจำ JVM สิ่งที่คุณบอกคือขนาดฮีป ทั้งคู่ต่างกัน
vsingh

8
ในการทบทวนความคิดเห็นอื่น ๆ อีกครั้ง Xms และ Xmx จะกำหนดค่าฮีปเท่านั้น แม้ว่าการกำหนดค่าตัวแปรเหล่านี้จะมีผลทางอ้อมต่อพื้นที่ที่ไม่ใช่ฮีป แต่ผู้ถามคำถามก็พยายามที่จะกำหนดว่ามีวิธีกำหนดค่าการใช้หน่วยความจำทั้งหมดหรือไม่ (ฮีป + ไม่ใช่ฮีป)
murungu

2
อู้ฮู ดังนั้นฉันจึงตั้งค่า-Xmx524Mและกระบวนการนี้ใช้ RAM 1.2 GB (?)
phil294

7
นี่ไม่ใช่คำตอบที่ถูกต้องตัวเลือก -Xms และ -Xmx ควบคุมเฉพาะขนาดฮีป jvm ไม่ใช่การจัดสรรหน่วยความจำทั้งหมด
Peter De Winter

31

คุณไม่ต้องกังวลว่าหน่วยความจำสแต็กจะรั่วไหล (ถือเป็นเรื่องผิดปกติอย่างมาก) ครั้งเดียวที่คุณสามารถทำให้สแต็กหลุดจากการควบคุมได้คือการวนซ้ำแบบไม่มีที่สิ้นสุด (หรือลึกมาก)

นี่เป็นเพียงกอง ขออภัยไม่ได้อ่านคำถามของคุณอย่างละเอียดในตอนแรก

คุณต้องรัน JVM ด้วยอาร์กิวเมนต์บรรทัดคำสั่งต่อไปนี้

-Xmx<ammount of memory>

ตัวอย่าง:

-Xmx1024m

ซึ่งจะทำให้หน่วยความจำสูงสุด 1GB สำหรับ JVM


1
ที่ไม่เป็นความจริงตามหัวข้อนี้มีหลายวิธีที่คุณสามารถรั่วไหลออกจากฮีปstackoverflow.com/questions/1475290/…
erotsppa

คุณถูกต้องมีหลายวิธีในการแก้ไขปัญหาหน่วยความจำที่ไม่เกี่ยวข้องกับสแตก อย่างไรก็ตามพวกเขาไม่ธรรมดามาก
jjnguy

9
ค่อนข้างแน่ใจว่าคุณไม่สามารถควบคุมขนาดหน่วยความจำที่ไม่ใช่ฮีปได้ใช่ไหม?
แมตต์ข

-XX:MaxDirectMemorySizeค่อนข้างแน่ใจว่าคุณสามารถควบคุมผ่านทาง. ไม่ใช่ว่าฉันทำโปรไฟล์อย่างหนักเพื่อให้แน่ใจ แต่ก็ยัง;)
alexandergunnarson

2
@alexandergunnarson MaxDirectMemorySizeมีผลต่อบัฟเฟอร์ NIO เท่านั้น JVM ใช้หน่วยความจำเนทีฟอื่น ๆ ทุกชนิด
Christopher Schultz

16

หากคุณต้องการ จำกัด หน่วยความจำสำหรับ jvm (ไม่ใช่ขนาดฮีป) ulimit -v

หากต้องการทราบความแตกต่างระหว่างหน่วยความจำ jvm และ heap โปรดดูบทความที่ยอดเยี่ยมนี้ http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- Java-process.html


8
คือulimitคำสั่งลินุกซ์? ฉันทำการค้นหาโดย Google อย่างรวดเร็วและไม่เห็นความสัมพันธ์ใด ๆ ระหว่างulimitกับ JVM Y
Sam

ใช่มันเป็นคำสั่ง linux tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/…
vsingh

11

คำตอบข้างต้นนั้นถูกต้องคุณไม่สามารถควบคุมได้อย่างชัดเจนว่ากระบวนการ java จะจัดสรรหน่วยความจำเนทีฟเท่าใด ขึ้นอยู่กับว่าแอปพลิเคชันของคุณกำลังทำอะไรอยู่

ที่กล่าวว่าขึ้นอยู่กับแพลตฟอร์มคุณอาจสามารถใช้กลไกบางอย่างได้เช่น ulimit เพื่อ จำกัด ขนาดของ java หรือกระบวนการอื่น ๆ

อย่าคาดหวังว่ามันจะล้มเหลวอย่างสง่างามหากถึงขีด จำกัด นั้น ความล้มเหลวในการจัดสรรหน่วยความจำเนทีฟนั้นจัดการได้ยากกว่าความล้มเหลวในการจัดสรรบน java heap มีโอกาสที่ดีพอสมควรที่แอปพลิเคชันจะขัดข้อง แต่ขึ้นอยู่กับว่าระบบมีความสำคัญเพียงใดในการลดขนาดกระบวนการที่ยังคงเหมาะกับคุณ


1

NativeHeap สามารถเพิ่มได้โดย -XX: MaxDirectMemorySize = 256M (ค่าเริ่มต้นคือ 128)

ฉันไม่เคยใช้มัน บางทีคุณอาจพบว่ามีประโยชน์


1
ฉันสงสัยว่า op ต้องการสิ่งนี้: หน่วยความจำเนทีฟถูกใช้เมื่อคุณโทรไปยังรหัส C / C ++ จาก java
om-nom-nom

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