ดูเหมือนทุกคนจะตอบเกี่ยวกับความจำที่ต่อเนื่องกัน แต่กลับละเลยที่จะรับทราบปัญหาเร่งด่วนมากกว่า
แม้จะมีการจัดสรรหน่วยความจำที่ต่อเนื่องกัน 100% คุณก็ไม่สามารถมีขนาดฮีป 2 GiB บนระบบปฏิบัติการ Windows 32 บิตได้ (* โดยค่าเริ่มต้น) เนื่องจากกระบวนการ Windows แบบ 32 บิตไม่สามารถระบุพื้นที่มากกว่า 2 GiB ได้
กระบวนการ Java จะประกอบด้วยดัด Gen (pre Java 8) ขนาดสแต็คต่อด้าย JVM / ค่าใช้จ่ายในห้องสมุด (ซึ่งเพิ่มขึ้นสวยมากกับการสร้างแต่ละ) ทั้งหมดนอกเหนือจากกอง
นอกจากนี้แฟล็ก JVM และค่าดีฟอลต์จะเปลี่ยนระหว่างเวอร์ชัน เพียงเรียกใช้สิ่งต่อไปนี้และคุณจะได้รับแนวคิด:
java -XX:+PrintFlagsFinal
ตัวเลือกมากมายมีผลต่อการแบ่งหน่วยความจำเข้าและออกจากฮีป ปล่อยให้คุณมี 2 GiB ที่จะเล่นด้วยไม่มากก็น้อย ...
หากต้องการใช้ซ้ำบางส่วนของคำตอบนี้ของฉัน (เกี่ยวกับ Tomcat แต่ใช้กับกระบวนการ Java ใด ๆ ):
ระบบปฏิบัติการ Windows จำกัด การจัดสรรหน่วยความจำของกระบวนการ 32 บิตไว้ที่ 2 GiB ทั้งหมด (โดยค่าเริ่มต้น)
[คุณจะสามารถ] จัดสรรพื้นที่ฮีปประมาณ 1.5 GiB ได้เนื่องจากยังมีหน่วยความจำอื่น ๆ ที่จัดสรรให้กับกระบวนการนี้ (ค่าใช้จ่าย JVM / ไลบรารี
เหตุใด Windows 32 บิตจึงกำหนดขีด จำกัด พื้นที่แอดเดรสกระบวนการ 2 GB แต่ Windows 64 บิตกำหนดขีด จำกัด 4GB
ระบบปฏิบัติการสมัยใหม่อื่น ๆ [ไอลินุกซ์] อนุญาตให้โปรเซส 32 บิตใช้พื้นที่แอดเดรส 4 GiB ทั้งหมด (หรือเกือบทั้งหมด)
ที่กล่าวว่าระบบปฏิบัติการ Windows 64 บิตสามารถกำหนดค่าเพื่อเพิ่มขีด จำกัด ของกระบวนการ 32 บิตเป็น 4 GiB (3 GiB บน 32 บิต):
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx