เพิ่มขนาดฮีพใน Java


276

ฉันกำลังทำงานบนเซิร์ฟเวอร์ Windows 2003 (64 บิต) พร้อม RAM 8 GB ฉันจะเพิ่มหน่วยความจำฮีปสูงสุดได้อย่างไร ฉันใช้-Xmx1500mแฟล็กเพื่อเพิ่มขนาดฮีพเป็น 1500 Mb ฉันสามารถเพิ่มหน่วยความจำฮีปเป็น 75% ของหน่วยความจำกายภาพ (6 GB ฮีป) ได้หรือไม่?


2
คุณเคยลอง-Xmx6gไหม สิ่งนี้ใช้งานไม่ได้หรือ คุณสังเกตอะไร
oxbow_lakes

2
ฉันคิดว่าคุณพยายามเพิ่มกอง แต่ล้มเหลว? คุณใช้ JVM 64 บิตหรือไม่
Bart Kiers

ขอบคุณสำหรับความคิดเห็น แต่ตอนนี้ไม่ได้ทำงาน
นิล

ดี - คุณจะรู้ได้อย่างไรว่ามันไม่ทำงาน? JVM ไม่เริ่มทำงานหรือไม่
oxbow_lakes

คำตอบ:


327

คุณสามารถเพิ่มได้ถึง 4GB บนระบบ 32 บิต หากคุณใช้ระบบ 64 บิตคุณสามารถสูงขึ้นได้ ไม่ต้องกังวลหากคุณเลือกไม่ถูกต้องหากคุณขอ 5g จากระบบจาวา 32 บิตจะบ่นเกี่ยวกับค่าที่ไม่ถูกต้องและออกจาก

ในขณะที่คนอื่นโพสต์ให้ใช้ธง cmd-line - เช่น

java -Xmx6g myprogram

คุณสามารถรับรายการทั้งหมด (หรือรายการเกือบทั้งหมด) โดยพิมพ์ java -X


16
เป็นประสบการณ์ของฉันที่ Java ขนาดฮีพที่แท้จริงจะยอมรับโดยใช้ 32b VM (บนระบบ 32b หรือ 64b - VM เป็นส่วนสำคัญที่นี่) ประมาณ 2G นอกจากนี้ผู้ถามที่ประหลาดใจไม่ได้ค้นหาและค้นพบครั้งแรก: stackoverflow.com/questions/1596009/ … และ: stackoverflow.com/questions/37335/…
wsorenson

2
แน่นอนคุณใช้ระบบ 32 บิตคุณสามารถจัดการหน่วยความจำ 2 Gb ได้
สตีฟบี

จำเป็นหรือไม่ที่ฮีปสูงสุดและขนาดฮีพขั้นต่ำต้องเท่ากัน?
user1747935

1
ไม่ได้ แต่คนทั่วไปมักทำเช่นนี้เพราะ JVM ไม่เคยต้องเสียเวลาปรับขนาด สงสัยว่ามันสำคัญมาก TBH
Steve B.

1
@PhilipRego คุณตั้งค่าตามที่คุณต้องการจนถึงขีด จำกัด ที่ JVM สามารถระบุได้ -Xmx2G ตั้งค่าหน่วยความจำของคุณเป็น 2G (ดูที่ -Xms) นี่ไม่ได้พูดอะไรเลยเกี่ยวกับความทรงจำที่คุณต้องการ
Steve B.

155

เป็นไปได้ที่จะเพิ่มขนาดฮีพที่จัดสรรโดย JVM โดยใช้ตัวเลือกบรรทัดคำสั่งที่นี่เรามี 3 ตัวเลือก

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

java -Xms16m -Xmx64m ClassName

ในบรรทัดด้านบนเราสามารถตั้งฮีปขั้นต่ำเป็น 16mb และสูงสุดฮีป 64mb


28

สำหรับ JVM ขนาด 32 บิตขนาดฮีปที่ใหญ่ที่สุดที่คุณสามารถตั้งค่าได้คือ 4gb ในการใช้ขนาดฮีพที่ใหญ่ขึ้นคุณต้องใช้ JVM 64 บิต ลองทำสิ่งต่อไปนี้:

java -Xmx6144M -d64

แฟล็ก -d64 มีความสำคัญเนื่องจากจะบอกให้ JVM รันในโหมด 64 บิต


ขอบคุณเจ้านาย แต่มันก็ไม่ได้ทำงานในระบบของฉันมีบางสิ่งบางอย่างอื่นฉันหายไป
นิล

4
กำหนด "ไม่ทำงาน" มันไม่ได้เริ่มต้นและให้ข้อผิดพลาดหรือไม่? มันเริ่มต้น แต่ใช้ขนาดฮีปที่แตกต่างกันหรือไม่?
Kevin

11

เป็นไปได้ที่จะเพิ่มขนาดฮีพที่จัดสรรโดย JVM ใน eclipse โดยตรงใน eclipse IDE goto

Run ----> Run Configurations ----> อาร์กิวเมนต์

ป้อน -Xmx1g (ใช้เพื่อตั้งค่าขนาดสูงสุดเช่น Xmx256m หรือ Xmx1g ...... m -> mb g ---> gb)


3
เพียงเพิ่มนี้ควรเป็นอาร์กิวเมนต์ VM (eclipse ให้สองตัวเลือก)
Matt Boyle

11

java -d64 -Xms512m -Xmx4g HelloWorld

โดยที่ -d64: จะเปิดใช้ JVM 64 บิต -Xms512m: จะตั้งค่าขนาดฮีพเริ่มต้นเป็น 512 MB -Xmx4g: จะตั้งค่าขนาดฮีพสูงสุดเป็น 4 GB (ที่นี่ชื่อไฟล์ java คือ: HelloWorld.java)


9

คุณสามารถเพิ่มขนาดฮีปได้โดยส่งพารามิเตอร์ JVM -Xmsและ-Xmxดังนี้:

สำหรับไฟล์ Jar:

java -jar -Xms4096M -Xmx6144M jarFilePath.jar

สำหรับไฟล์ Java:

 java -Xms4096M -Xmx6144M ClassName

พารามิเตอร์ข้างต้นเพิ่มขนาด InitialHeapSize (-Xms)เป็น 4GB (4096 MB) และMaxHeapSize (-Xmx)เป็น 6GB (6144 MB)

แต่ขนาดฮีปของคนรุ่นใหม่จะยังคงเหมือนเดิมและฮีปขนาดเพิ่มเติมจะถูกเพิ่มเข้าไปในขนาดฮีปรุ่นเก่า ในการทำให้ขนาดของ Young Gen Heap และ Gen Gen Heap เท่ากันให้ใช้-XX: NewRatio = 1 -XX: -UseAdaptiveSizePolicy params

java -jar -Xms4096M -Xmx6144M -XX:NewRatio=1 -XX:-UseAdaptiveSizePolicy pathToJarFile.jar

-XX: NewRatio = ขนาดฮีปเก่า: Young Gen HeapSize (คุณสามารถเล่นกับอัตราส่วนนี้เพื่อรับอัตราส่วนที่คุณต้องการ)


7

ฉันสามารถเพิ่มหน่วยความจำฮีปเป็น 75% ของหน่วยความจำกายภาพ (6GB Heap) ได้หรือไม่

ใช่คุณสามารถ. ในความเป็นจริงคุณสามารถเพิ่มจำนวนหน่วยความจำกายภาพได้มากกว่าที่คุณต้องการ

ไม่ว่าจะเป็นการดีหรือไม่ที่จะทำสิ่งนี้ขึ้นอยู่กับว่าระบบของคุณกำลังทำงานอยู่มากน้อยแค่ไหน โดยเฉพาะอย่างยิ่งหาก "ชุดการทำงาน" ของแอปพลิเคชันและบริการที่กำลังทำงานอยู่เกินกว่าหน่วยความจำทางกายภาพที่มีอยู่ในปัจจุบันอย่างมีนัยสำคัญระบบของคุณจะต้อง "thrash" ใช้เวลามากในการย้ายหน้าหน่วยความจำเสมือน ผลสุทธิคือระบบช้าลงอย่างน่ากลัว


ขอบคุณสำหรับความคิดเห็นของคุณ แต่ฉันจะเพิ่มได้อย่างไรคุณสามารถให้คำสั่งได้
Sunil

ลอง -Xmx6000m มันควรจะทำงานถ้าคุณใช้ Java เวอร์ชัน 64 บิต
สตีเฟ่น C

3
คุณแน่ใจหรือว่ากำลังใช้งาน Java เวอร์ชัน 64 บิตอยู่ บนระบบปฏิบัติการ 64 บิต
สตีเฟ่น C

4

โปรดใช้คำสั่งด้านล่างเพื่อเปลี่ยนขนาดฮีพเป็น 6GB

export JAVA_OPTS="-Xms6144m -Xmx6144m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m"

หากฉันมีหน่วยความจำ 8G ในระบบของฉันและฉันสามารถเห็นได้จากตัวจัดการงานที่ใช้งาน 70% ของหน่วยความจำนั้น เป็นไปได้ที่จะจัดสรรหน่วยความจำ 6G ให้เป็นขนาด heap java หรือไม่
Reihan_amn

1
@Reihan_amn ใช่และไม่ใช่ถ้าคุณเกินกว่าที่หน่วยความจำของคุณมันจะไปที่เพจซึ่งอยู่บนดิสก์และช้าอย่างไม่น่าเชื่อ หากคุณมีไฟล์เกินกว่าหน้าเว็บแสดงว่าคุณเข้ามาในช่วงเวลาที่เลวร้าย
CodeMonkey

2

หลายคนชี้ให้เห็นคำตอบที่เฉพาะเจาะจงสำหรับขนาดกองกับตัวเลือก JVM ของและ-Xms -Xmsฉันต้องการชี้ให้เห็นว่านี่ไม่ใช่ตัวเลือกหน่วยความจำประเภทเดียวสำหรับ jvm -Xss8mโดยเฉพาะถ้าคุณได้รับสแต็คของกระแสแล้วคุณจะต้องการที่จะเพิ่มขนาดของสแต็คโดยการเพิ่มตัวเลือกเพิ่มเติมเช่น

สำหรับปัญหานี้ตัวเลือก jvm ของสิ่งที่ชอบ-Xms2g -Xmx6g -Xss8mจะเป็นทางออก

ฉันกำลังแบ่งปันข้อมูลนี้เมื่อ google ค้นหาวิธีเพิ่มหน่วยความจำ jvm ให้ฉันมาที่โซลูชันนี้และโซลูชันไม่ทำงานกับการจัดสรรหน่วยความจำจำนวนมาก เมื่อฉันรู้ว่าการตั้งค่าเฉพาะสำหรับฉันฉันสามารถ google วิธีเพิ่มขนาดสแต็คและพบว่าพารามิเตอร์ที่ขาดหายไป :) หวังว่านี่จะช่วยประหยัดเวลาของผู้อื่นได้เช่นกัน :)


2

ใช้งานได้กับ Java เวอร์ชัน 64 บิตเท่านั้น ไปที่แผงควบคุมและคลิกที่ไอคอน Java บนหน้าต่างเล็ก ๆ ของ Java Control Panel คลิกที่แถบเมนู Java จากนั้นคลิกที่viewปุ่ม

หากคุณมีสองแพลตฟอร์ม Java ให้ปิดการใช้งาน Java เวอร์ชันก่อนหน้าจากนั้นคลิกที่ฟิลด์ข้อความพารามิเตอร์ Runtimeและเขียน-Xmx1024mหรือน้อยกว่าขนาด RAM อย่าเพิ่มขนาดฮีพเท่ากับ RAM มิฉะนั้นระบบของคุณจะผิดพลาด


หากคุณทำให้ฮีปมีขนาดเท่ากับ RAM ระบบจะไม่ผิดพลาด ระบบจะเริ่มต้นการเพจและเริ่มช้าและดีขึ้น
DaveTheMinion

0

ใช่. คุณสามารถ.

คุณสามารถเพิ่มหน่วยความจำฮีปของคุณเป็น 75% ของหน่วยความจำกายภาพ (6 GB ฮีป) หรือสูงกว่า

เนื่องจากคุณใช้ 64 บิตคุณสามารถเพิ่มขนาดฮีพของคุณเป็นจำนวนที่คุณต้องการ ในกรณีที่คุณใช้ 32 บิตจะ จำกัด ที่ 4GB

$ java -Xms512m -Xmx6144m JavaApplication

ตั้งค่าฮีปเริ่มต้นของคุณเป็น 512mb และฮีปขนาดสูงสุดเป็น 6GB

หวังว่าจะช่วย .. :)


ดูเหมือนว่าจะคล้ายกับคำตอบที่ได้รับการโหวตสองอันดับแรกซึ่งโพสต์เมื่อไม่กี่ปีก่อน
Bernhard Barker

0

ฉันมีปัญหาในการใช้งานไฟล์ py ในโค้ดจาวาของฉันโดยใช้ eclipse / STS รับ PyException เนื่องจากหน่วยความจำฮีป jvm ไม่เพียงพอ ฉันได้ทำการเปลี่ยนแปลงตามที่ระบุไว้ด้านล่างและฉันสามารถแก้ไขปัญหานี้ได้ ด้านล่างคือการกำหนดค่าระบบของฉัน

ป้อนคำอธิบายรูปภาพที่นี่

และนี่คือการเปลี่ยนแปลงที่ฉันทำในเวิร์กสเปซของฉันและ voila มันทำงานได้สมบูรณ์แบบในขณะนี้

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

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