ปริมาณการใช้หน่วยความจำ JVM


9

ฉันพยายามเรียกใช้ tomcat บนระบบหน่วยความจำเหลือน้อย (150-256Mb) แม้ว่าฉันจะเริ่มต้น JVM ด้วย -Xmx64m (ซึ่งควรเป็นค่าเริ่มต้น) กระบวนการจะใช้เวลาทันที 200Mb +

ฉันสงสัยว่าทำไม JVM ต้องการหน่วยความจำจำนวนมากหรือถ้ามีวิธีการปรับจูนนี้? JVM อื่น ๆ นั้นดีกว่าดวงอาทิตย์สำหรับการใช้หน่วยความจำต่ำหรือไม่

คำตอบ:


5

นอกเหนือจากฮีป (ที่ระบุโดย-Xmsและ-Xmx) คุณต้องรวมพื้นที่ที่ไม่ใช่ฮีพด้วย เหล่านี้ ได้แก่

  • Perm Gen ซึ่งเป็น 64mb สำหรับระบบ 32 บิตและ 96mb สำหรับระบบ 64 บิตในตอนแรก
  • Code Cache ซึ่งอยู่ระหว่าง 20 และ 40mb ขึ้นอยู่กับ JVM
  • พื้นที่บัฟเฟอร์ NIO (ซึ่งDirectByteBufferดึงมาจาก) นี่คือ 64mb เริ่มแรก

นอกจากนี้ยังมีพื้นที่ทำงานของ JVM ซึ่งจะมีไม่กี่ MB mb

นอกจากนี้คุณควรจะตระหนักถึงดวงอาทิตย์ JVM ของการปรับขนาดอัตโนมัติเมื่อใช้เครื่องระดับเซิร์ฟเวอร์ เมื่อเวลาผ่านไปคำจำกัดความของคลาสเซิร์ฟเวอร์ (หน่วยความจำ 2Gb มากกว่าหนึ่งคอร์) ได้รับความเดือดร้อนจากค่าเสื่อมราคาและตอนนี้เครื่องส่วนใหญ่สามารถเรียกการปรับให้-serverเหมาะสม คำแนะนำของฉันอยู่เสมอเพื่อระบุ-Xmsและ-Xmxการตั้งค่าและผ่าน-serverจนกว่าคุณจะคิดว่าเหตุผลที่ดีไม่เกินไป


ระวังหน่วยความจำเสมือนที่ JVM สำรองไว้เท่านั้นและยังไม่ได้ใช้
Steve Schnepp

จริงกลุ่มส่วนใหญ่เหล่านี้เช่น PermGen และ Code Cache จะได้รับการจัดสรรเมื่อเริ่มต้น แต่เมล็ดส่วนใหญ่จะหลีกเลี่ยงการจัดสรรหน้าไปยังกลุ่มเหล่านั้นจนกว่าจะมีความจำเป็น
Dave Cheney

1
ขอบคุณสำหรับข้อมูล - ฉันคิดว่านี่จะอธิบายว่าหน่วยความจำจะไปที่ใด มีวิธีใดที่จะเปลี่ยนค่าเหล่านี้หรือไม่ ยิ่งไปกว่านั้นจะเป็นวิธีการดูว่าแต่ละส่วนมีการใช้งานมากน้อยเพียงใด - ฉันไม่รู้ว่ามีเครื่องมือการดีบัก / ตรวจสอบ Java ใด ๆ ที่อนุญาตให้คุณทำสิ่งนี้หรือไม่?
Draemon

1
คุณสามารถใช้ pmap หรือ jmap เพื่อรับแนวคิดเกี่ยวกับกลุ่มต่างๆที่ใช้งานอยู่ ส่วนใหญ่ของตัวเลือกที่พบบ่อย (และค่าเริ่มต้นของพวกเขา) จะอยู่ที่นี่java.sun.com/javase/technologies/hotspot/vmoptions.jsp พวกเขาเปลี่ยนแปลงบ่อยและอาจมีความแตกต่างในระบบปฏิบัติการ (สแต็คขนาดปกติ) และโค้ง (64bit OS โดยทั่วไปบ่งบอกถึงพื้นที่ขนาดใหญ่ JVM)
เดฟเชนีย์

3

ด้วยอ็อพชัน -Xmx คุณจะ จำกัด ขนาดของฮีพที่ JVM สำรอง ... มีรีซอร์สเพิ่มเติมที่ JVM ต้องการ ...

"ขอบคุณสำหรับหน่วยความจำ" * เป็นบทความที่ดีที่อธิบายว่า JVM ใช้หน่วยความจำอย่างไร ...

นอกเหนือจากนั้นคุณสามารถลองใช้ JVM ของ IBM ซึ่งควรทำงานกับ Tomcat ไม่ทราบว่าการใช้ JVM ฟรีบางอย่างทำงานได้หรือไม่

อย่างไรก็ตามฉันไม่คิดว่าเครื่องที่มีหน่วยความจำต่ำจะทำอะไรได้ดี Java ต้องการหน่วยความจำ

* เนื่องจากผู้ใช้ใหม่ไม่สามารถส่งไฮเปอร์ลิงก์ได้คุณต้องค้นหาบทความด้วยตัวคุณเอง ... มันเป็นที่นิยมใน google เป็นครั้งแรกสำหรับ "ขอบคุณสำหรับหน่วยความจำ IBM"


3
ibm.com/developerworks/java/library/j-nativememory-linux - ลิงก์ไปยังบทความ "ขอบคุณสำหรับหน่วยความจำ"
StackKrish

2

ลองใช้ JRockit JVM ซึ่งมีหน่วยความจำน้อยกว่า คุณยังสามารถดาวน์โหลด JRockit รุ่นที่ได้รับอนุญาตของ BEA ได้ฟรี เช่นเวอร์ชันก่อนที่ Oracle เข้าควบคุม BEA

ดูhttp://forums.oracle.com/forums/thread.jspa?threadID=816133&tstart=0สำหรับลิงค์ดาวน์โหลด


0

เทคนิคที่มีประโยชน์อย่างหนึ่งที่ฉันค้นพบคือใช้การตรวจสอบ JMX เพื่อดูจำนวนหน่วยความจำที่ใช้โดยพื้นที่ heap vs permgen

ตั้งค่า JMX ใน Tomcat ตามที่อธิบายไว้ที่นี่ http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

จากนั้นใช้ JConsole (มาพร้อมกับ JDK 5 หรือ JDK 6) - แท็กหน่วยความจำจะติดตามการใช้หน่วยความจำเมื่อเวลาผ่านไป

นอกจากนี้ - ระวังการรีสตาร์ท webapps อย่างนุ่มนวล หากคุณโหลด webapp ใหม่พื้นที่ Permgen จะไม่ถูกเก็บขยะและจะสร้างขึ้นตามกาลเวลา คุณต้องทำการหยุด / เริ่มต้นของ Tomcat อย่างเต็มรูปแบบเพื่อเรียกคืนพื้นที่ Permgen


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