การเพิ่มขนาดฮีปสูงสุดของ JVM สำหรับแอ็พพลิเคชันที่ใช้หน่วยความจำมาก


88

ฉันต้องการเรียกใช้แอปพลิเคชัน Java memory เร่งรัดที่ใช้มากกว่า 2GB แต่ฉันมีปัญหาในการเพิ่มขนาดสูงสุดของฮีป จนถึงตอนนี้ฉันได้ลองใช้วิธีการต่อไปนี้แล้ว:

  • การตั้งค่าพารามิเตอร์ -Xmx เช่น -Xmx3000m วิธีนี้ล้มเหลวในการสร้าง JVM จากที่ฉันใช้ googled ดูเหมือนว่า -Xmx จะต้องน้อยกว่า 2GB

  • ใช้-XX: + AggressiveHeap ตัวเลือก เมื่อฉันลองใช้วิธีนี้ฉันได้รับข้อผิดพลาด 'หน่วยความจำไม่เพียงพอ' ซึ่งบอกว่าขนาดฮีปคือ 1273.4 MB แม้ว่าคอมพิวเตอร์ของฉันจะมีหน่วยความจำ 8GB ก็ตาม

มีแนวทางอื่นที่ฉันสามารถลองเพิ่มขนาดฮีพสูงสุดของ JVM ได้หรือไม่? นี่คือสรุปข้อมูลจำเพาะของคอมพิวเตอร์:

  • ระบบปฏิบัติการ: Windows 7 (64 บิต)
  • หน่วยประมวลผล: Intel Core i7 (2.66 GHz)
  • หน่วยความจำ: 8 GB
  • java - รุ่น:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

7
BTW: ขณะนี้ขนาดหน่วยความจำต่ำสุดและสูงสุดเป็นตัวเลือกมาตรฐาน คุณสามารถใช้ -ms และ -mx แทน -Xms และ -Xmx -X ?? สงวนไว้สำหรับตัวเลือกที่ไม่ได้มาตรฐาน
— Peter Lawrey

2
มาตรฐานสำหรับ JVM ใด? ยังไม่เป็นมาตรฐานสำหรับ HotSpot JVM (ณ 1.8) ดูdocs.oracle.com/javase/8/docs/technotes/tools/unix/…
— Huckle

-mx และ -ms มีอยู่และใช้งานได้ แต่ฉันไม่พบในเอกสาร java อย่างเป็นทางการ @PeterLawrey> คุณสามารถเพิ่มลิงก์ไปยังเอกสารได้หรือไม่ ขอบคุณ
— Michal Bernhard

2
@MichalBernhard มันเข้ากันได้ย้อนหลังกับ Java 1.1 ฉันเห็นมันเป็นเอกสารสำหรับเวอร์ชันนั้น แต่ตอนนี้อาจจะหายากแล้ว ;)
— Peter Lawrey

1
ขอบคุณ @PeterLawrey สำหรับคำอธิบาย แต่เมื่อคุณบอกว่ามันเป็นมาตรฐานแล้วคุณหมายความว่ามันเป็นมาตรฐานจาก Java 1.1 (แต่ไม่ใช่เอกสารในเวอร์ชันที่ใหม่กว่า)? ดูเหมือนจะแปลก :) btw ฉันพบลิงก์ในเอกสาร Java 1.1 และคุณพูดถูก: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
— Michal Bernhard

คำตอบ:



96

เมื่อคุณใช้ JVM ในโหมด 32 บิตขนาดฮีพสูงสุดที่สามารถจัดสรรได้คือ 1280 MB ดังนั้นหากคุณต้องการก้าวไปไกลกว่านั้นคุณต้องเรียกใช้ JVM ในโหมด 64

คุณสามารถใช้สิ่งต่อไปนี้:

$ java -d64 -Xms512m -Xmx4g HelloWorld

ที่ไหน

  • -d64: จะเปิดใช้งาน JVM 64 บิต
  • -Xms512m: จะกำหนดขนาดฮีปเริ่มต้นเป็น 512 MB
  • -Xmx4g: จะกำหนดขนาดฮีปสูงสุดเป็น 4 GB

คุณสามารถปรับ -Xms และ -Xmx ตามที่คุณต้องการ (YMMV)

แหล่งข้อมูลที่ดีมากเกี่ยวกับการปรับแต่งประสิทธิภาพของ JVM ซึ่งอาจต้องการดู: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


JVM ของฉันคือ 32 บิตและอนุญาตให้ใช้งานได้สูงสุด -Xmx1024M ยังจะลองรุ่น 64 บิต
— kiltek

ฉันได้ลองใช้ JVM 64 บิตและทำงานได้อย่างสมบูรณ์ ตอนนี้ฉันสามารถตั้งค่าขนาดฮีพสูงสุด 4096 MB ได้แล้ว เมื่อคุณติดตั้งทั้ง 32 และ 64 บิตอย่างน้อยบน Windows คุณต้องชี้เส้นทาง Java สำหรับแอปพลิเคชันของคุณไปยังเวอร์ชัน 64 บิตใหม่ที่ติดตั้ง มิฉะนั้นข้อผิดพลาดจะยังคงมีอยู่ ใน Windows สามารถทำได้โดยการเปลี่ยนเส้นทาง Java บนตัวแปรสภาพแวดล้อมของระบบ
— Fabiano

ฉันเดาว่าขีด จำกัด สำหรับฮีปสูงสุดไม่ใช่ 1280 แต่มีค่าใกล้ถึง 1700MB ฉันใช้ฮีปสูงสุด 1600MB ในการติดตั้ง JVM 32 บิตและทำงานได้ดี
— Fabiano

อาร์กิวเมนต์ HelloWorld ในคำสั่งของคุณคืออะไร? ฉันจะใช้คำสั่งนี้ได้อย่างไรหากต้องการตั้งค่าสูงสุดของกระบวนการ Java ที่เริ่มต้นด้วยคำสั่ง java -jar myApp.jar บน linux
— LordScone

สวัสดีฉันขอถามขนาด java heap สูงสุดที่ฉันสามารถตั้งค่าได้เท่าไร? เมื่อฉันเรียกใช้แอปพลิเคชันค่า defaul -Xmx บนเครื่องของฉันคือ 4GB แต่ฉันสามารถตั้งค่ามากกว่า 4GB ได้หรือไม่?
— Ock

14

ฉันเชื่อว่าขีด จำกัด 2GB สำหรับ Java 32 บิต ฉันคิดว่า v1.6 เป็น 64 บิตเสมอ แต่ลองบังคับใช้โหมด 64 บิตเพื่อดู: เพิ่มตัวเลือก -d64


ตัวเลือก -D64 ไม่ทำงานฉันจะลองใช้ JVM 64 บิตตามที่ GregS แนะนำและรายงานผลลัพธ์
— Alceu Costa

1
-d64 และสวิทช์ -d32 ทำงานอย่างถูกต้องเพียงบน Solaris (อย่างน้อยตามเอกสารเหล่านี้): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering
— Lukasz Stelmach

ฉันได้ลองใช้ทั้งสองตัวเลือกแล้ว ด้วย -d64 JVM ไม่สามารถเปิดใช้งานได้แม้ว่าฉันจะไม่ได้ระบุตัวเลือก Xmx ก็ตาม -D64 ใช้งานได้เฉพาะเมื่อฉันไม่ได้ระบุ Xmx
— Alceu Costa

@Lukasz -d64 และ -d32 ดูเหมือนจะใช้งานได้กับ JVM ของ Apple แต่ดูเหมือนว่าเอกสารดังกล่าวจะบ่งบอกเป็นนัยว่าไม่สามารถใช้งานได้กับ Windows และ Linux JVM ของ Sun
— G__

8

Java 32 บิตถูก จำกัด ไว้ที่ประมาณ 1.4 ถึง 1.6 GB

คำถามที่พบบ่อยเกี่ยวกับฮีป Oracle 32 บิต

ใบเสนอราคา

ขีด จำกัด ฮีปทางทฤษฎีสูงสุดสำหรับ JVM 32 บิตคือ 4G เนื่องจากข้อ จำกัด เพิ่มเติมต่างๆเช่นการแลกเปลี่ยนที่พร้อมใช้งานการใช้พื้นที่แอดเดรสเคอร์เนลการกระจายตัวของหน่วยความจำและค่าใช้จ่ายของ VM ในทางปฏิบัติขีด จำกัด อาจต่ำกว่านี้มาก ในระบบ Windows 32 บิตที่ทันสมัยส่วนใหญ่ขนาดฮีปสูงสุดจะอยู่ในช่วง 1.4G ถึง 1.6G บนเมล็ด Solaris 32 บิตพื้นที่แอดเดรสถูก จำกัด ไว้ที่ 2G บนระบบปฏิบัติการ 64 บิตที่รัน VM 32 บิตขนาดฮีปสูงสุดอาจสูงกว่าโดยเข้าใกล้ 4G ในระบบ Solaris จำนวนมาก


4

ด้านล่าง conf ทำงานให้ฉัน:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.