ปัญหาขนาดฮีป JVM

ฉันเพิ่งเริ่มต้นการวิจัยและพัฒนาเกี่ยวกับขนาดฮีปของ JVM และสังเกตเห็นพฤติกรรมแปลกๆ บางอย่าง

  • ขนาด RAM ระบบของฉันคือ 4 GB
  • ระบบปฏิบัติการเป็น Windows 7 แบบ 64 บิต
  • เวอร์ชันจาวาคือ 1.7

นี่คือข้อสังเกต:

ฉันเขียนโปรแกรมหลักตัวอย่างซึ่งเริ่มทำงาน & เข้าสู่สถานะ รอ ทันที

เมื่อฉันรันโปรแกรมจาก eclipse ด้วยพารามิเตอร์ -Xms1024m -Xmx1024m มันสามารถรันได้ 3 ครั้ง/กระบวนการแบบขนานจาก eclipse เช่น 3 แบบขนาน ประมวลผลเท่านั้นเนื่องจาก RAM ของฉันคือ 4GB เท่านั้น นี่เป็นลักษณะการทำงานที่คาดหวัง

ดังนั้นฉันจึงรันอีกครั้งด้วยพารามิเตอร์ -Xms512m -Xmx512m และสามารถรันได้ 19 ครั้ง/กระบวนการแบบขนานจาก eclipse แม้ว่า RAM ของฉันจะเป็น 4GB ยังไง?

ฉันใช้เครื่องมือ VisualVM เพื่อตรวจสอบข้ามและเห็นรหัสกระบวนการ 19 รหัส และรหัสกระบวนการแต่ละรหัสได้รับการจัดสรร 512m แม้ว่าขนาด RAM ของฉันจะเป็น 4GB แต่ทำอย่างไร

ฉันได้อ่านและอ่านเอกสาร Oracle มากมายเกี่ยวกับการจัดการหน่วยความจำและการเพิ่มประสิทธิภาพ แต่บทความเหล่านั้นไม่ได้ตอบคำถามของฉัน

ขอบคุณล่วงหน้า.

ขอบคุณบาจิ


person Baji Shaik    schedule 23.03.2015    source แหล่งที่มา
comment
Goggle บอกฉันว่าคอมพิวเตอร์สามารถสลับ RAM เพื่อสร้างหน่วยความจำ RAM ได้มากขึ้นโดยการเพิ่มบิตที่ไม่ได้ใช้ในตอนนั้น   -  person Warkst    schedule 23.03.2015
comment
หากเป็นเช่นนั้น ก็ควรจะสอดคล้องกันในทั้งสองกรณีข้างต้น แต่พฤติกรรมจะแตกต่างกัน   -  person Baji Shaik    schedule 23.03.2015
comment
คุณแน่ใจหรือว่ากระบวนการทั้งหมดเริ่มต้นพร้อมกัน?   -  person Ivan Mamontov    schedule 23.03.2015
comment
ใช่ เมื่อฉันรันด้วยพารามิเตอร์ -Xms512m -Xmx512m มันเริ่ม 19 กระบวนการในแบบคู่ขนาน ฉันได้ตรวจสอบข้ามด้วยเครื่องมือ VisualVM ซึ่งแสดงรหัสกระบวนการทั้งหมด 19 รหัสและแต่ละรหัสที่จัดสรร 512M   -  person Baji Shaik    schedule 24.03.2015


คำตอบ (2)


ฉันสงสัยว่าทำไมคุณไม่สามารถเริ่มกระบวนการมากกว่า 3 กระบวนการด้วย -Xmx1024M -Xms1024M ฉันทดสอบมันบนระบบ Linux ขนาด 4GB ของฉัน และฉันสามารถเริ่มกระบวนการดังกล่าวได้อย่างน้อย 6 กระบวนการ ฉันไม่ได้พยายามที่จะเริ่มต้นมากขึ้น

อย่างไรก็ตาม นี่เป็นเพราะความจริงที่ว่าโปรแกรมไม่ได้ใช้หน่วยความจำนั้นจริงๆ หากคุณเพิ่งเริ่มต้นด้วย -Xmx1024M -Xms1024M สิ่งเหล่านี้เพียงระบุขนาดสูงสุดของฮีป หากคุณไม่จัดสรรข้อมูลจำนวนดังกล่าว หน่วยความจำนี้จะไม่ถูกใช้งานจริงในตอนนั้น

"top" แสดงขนาดชุดเสมือนมากกว่า 1,024M สำหรับกระบวนการดังกล่าว แต่จริงๆ แล้วไม่ได้ใช้หน่วยความจำนั้น เพิ่งจัดสรรพื้นที่ที่อยู่แต่ไม่เคยใช้

person juhist    schedule 23.03.2015
comment
เฮ้! Juhist ขอบคุณสำหรับการอัปเดตอย่างรวดเร็ว หมายความว่าคุณสามารถเริ่มกระบวนการได้ 100 กระบวนการด้วย -Xmx1024M -Xms1024M หรือไม่ เมื่อโปรแกรมของคุณไม่ได้ใช้ข้อมูล/หน่วยความจำใดๆ เลย - person Baji Shaik; 23.03.2015
comment
ใช่ คุณควรจะสามารถเริ่มกระบวนการได้ 100 กระบวนการ หรือฉันไม่แน่ใจ ขึ้นอยู่กับจำนวนหน่วยความจำที่ JVM ใช้สำหรับกระบวนการที่ไม่ต้องใช้หน่วยความจำเพิ่มเติม แต่อย่างน้อยคุณควรจะสามารถเริ่มกระบวนการได้อย่างน้อยสิบกระบวนการแม้จะมี -Xmx1024M -Xms1024M ในสภาพแวดล้อม 4GB ของคุณ - person juhist; 24.03.2015
comment
โอเคขอบคุณมาก. แต่ฉันยังคงสามารถเริ่มกระบวนการ 3 ด้วย -Xmx1024M -Xms1024M ในสภาพแวดล้อม 4GB windows 7 ของคุณเท่านั้น - person Baji Shaik; 24.03.2015
comment
คุณได้ลองรันคำสั่งจากบรรทัดคำสั่งแทนจาก Eclipse แล้วหรือยัง? ข้อความแสดงข้อผิดพลาดจริงที่คุณได้รับคืออะไร? ฉันไม่ได้ติดตั้ง Windows และ Eclipse และ Java 1.7 มีเพียงบรรทัดคำสั่ง Linux และ JVM 1.6 มาตรฐาน แต่คุณควรหา java.exe ที่ไหนสักแห่งและเริ่มใช้ c:\path\to\java.exe -Xmx1024M -Xms1024M cl.as.s - person juhist; 24.03.2015

หน่วยความจำจริงในพีซีของคุณและหน่วยความจำที่จัดสรรจะต้องไม่ตรงกัน ที่จริงแล้วระบบปฏิบัติการของคุณกำลังย้ายข้อมูลจาก RAM ไปยัง hdd เมื่อ RAM เต็ม สิ่งนี้เรียกว่าการสลับ / Ram-paging นั่นเป็นเหตุผลว่าทำไม windows ถึงมีไฟล์สลับบน hdd และยูนิกซ์มีพาร์ติชั่นสลับ

person NeoP5    schedule 23.03.2015
comment
เฮ้! ขอบคุณสำหรับข้อมูล ถ้าเป็นเช่นนั้น เหตุใดจึงไม่ได้รับอนุญาตให้รันมากกว่า 3 ครั้ง/กระบวนการ ในกรณีของ -Xms1024m -Xmx1024m? ในขณะที่มันอนุญาตให้ 19 ประมวลผลด้วย -Xms512m -Xmx512m แม้ว่าฉันจะมี RAM 4 GB ก็ตาม - person Baji Shaik; 23.03.2015