การเพิ่มขนาดฮีปสูงสุดของ 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.