ไม่สามารถจองพื้นที่เพียงพอสำหรับกองวัตถุ


277

ฉันได้รับข้อยกเว้นต่อไปนี้ซ้ำ ๆ ทุกครั้งที่ฉันพยายามเรียกใช้โปรแกรม

เกิดข้อผิดพลาดระหว่างการเริ่มต้นของ VM

ไม่สามารถจองพื้นที่เพียงพอสำหรับกองวัตถุ

ไม่สามารถสร้างเครื่องเสมือน Java

ฉันพยายามเพิ่มหน่วยความจำเสมือน (ขนาดหน้า) และขนาด RAM แต่ก็ไม่มีประโยชน์

ฉันจะกำจัดข้อผิดพลาดนี้ได้อย่างไร



2
ฉันยังได้รับข้อผิดพลาดนี้เมื่อใช้ jdk / jre 1.6 บนเครื่องเสมือนของฉันพยายามเปลี่ยนค่ากำหนดที่ระบุไว้ในความคิดเห็น แต่ไม่ได้ช่วยหลังจากอัปเดตเป็น jdk 1.7 ข้อผิดพลาดจะหายไปและใช้พารามิเตอร์ Xmx ที่ใหญ่กว่า ดูเหมือนว่ามีการเปลี่ยนแปลงมากมายกับการใช้ heap ตั้งแต่ java 1.6
Alexander.Iljushkin

คำตอบ:


214

รัน JVM ด้วย-XX:MaxHeapSize=512m(หรือจำนวนมากตามที่คุณต้องการ) (หรือเรียก-Xmx512mสั้น ๆ )


42
หรือสั้นกว่า, -mx256m หรือ -mx512m;)
Peter Lawrey

8
-mx เหมือนกับ -Xmx และ -XX: MaxHeapSize หรือไม่
Erty Seidohl

19
ขอบคุณ .. มีจำนวนมากเกินไปอาจเป็นปัญหาและสามารถให้ข้อผิดพลาดเดียวกันได้!
Dinesh Rajan

17
ใครพบวิธีแก้ปัญหาที่ใช้งานได้จริง 100%? วิธีนี้แก้ปัญหาได้ชั่วคราว แต่ทันใดนั้นมันก็กลับมา ฉันมี RAM 16GB และฉันเบื่อกับ sh * t นี้ ทุกอย่างดีขึ้นในสมัยก่อน: [
Nilzor

6
ใช้งานไม่ได้กับฉันใน Windows 8 ที่ใช้ x86 หรือ x64 Java
AndrewSmiley

128

สิ่งนี้อาจเกิดจากการตั้งค่าบางอย่างที่ใหญ่เกินไปบน HotSpot vm 32 บิตตัวอย่างเช่น:

-Xms1536m -Xmx1536m

ที่นี้อาจ / จะทำงาน:

-Xms1336m -Xmx1336m

5
ฉันลืมที่จะพูดถึงว่าปัญหานี้จะต้องเกิดขึ้นในขณะที่เปิดตัวในเชลล์คำสั่ง 32 บิต เชลล์คำสั่ง 64 บิตอาจไม่มีปัญหานี้
djangofan

สำหรับฉันมันล้มเหลวด้วยค่าเริ่มต้นและมีค่ามากเกินไปดังนั้นโปรดลองหลายค่า ขอบคุณสำหรับคำตอบ!
Trax

47

นี่คือวิธีการแก้ไข:

  • ไปที่ Start-> Control Panel-> System-> Advanced (แท็บ) -> Environment Variables-> System

    ตัวแปร -> ใหม่: ชื่อ_JAVA_OPTIONS ตัวแปร: ค่า-Xmx512M ตัวแปร: ชื่อPath
    ตัวแปร: ค่าตัวแปร:%PATH%;C:\Program Files\Java\jre6\bin;F:\JDK\bin;

เปลี่ยนสิ่งนี้เป็นเส้นทางที่เหมาะสมของคุณ



สิ่งที่ดี. พร้อมกับข้างต้นอ้างถึงสิ่งนี้ด้วย stackoverflow.com/a/9350506/967638
Amarnath

46

ฉันพบปัญหานี้เมื่อใช้ javac และดูเหมือนจะไม่มีตัวเลือกในบรรทัดคำสั่ง

-bash-3.2$ javac -Xmx256M HelloWorldApp.java 
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

ดังนั้นทางออกที่นี่มันตั้ง _JAVA_OPTIONS

-bash-3.2$ export _JAVA_OPTIONS="-Xmx256M"
-bash-3.2$ javac HelloWorldApp.java 
Picked up _JAVA_OPTIONS: -Xmx256M

และสิ่งนี้ก็คอมไพล์ดี

สิ่งนี้เกิดขึ้นกับฉันบนเครื่องที่มี RAM จำนวนมาก แต่มีหน่วยความจำลดลง Java ตัดสินใจจัดสรรฮีปขนาดใหญ่เนื่องจากตรวจพบ ram ในเครื่อง แต่ไม่ได้รับอนุญาตให้จัดสรรเนื่องจาก ulimits


1
+1 สำหรับการชี้ให้เห็น _JAVA_OPTIONS - ในกรณีของฉันจาวาถูกเรียกจากที่ลึกลงไปในเชลล์สคริปต์ที่ฉันไม่สามารถเข้าถึงการเขียนดังนั้นตัวเลือกนี้จึงเป็นที่นิยม
gerrit

กันที่นี่ ฉันใช้คอมพิวเตอร์มหาวิทยาลัยดังนั้นฉันไม่ใช่ผู้ดูแล (ไม่สามารถเปลี่ยนตัวแปรสภาพแวดล้อม) และตัวเลือกบรรทัดคำสั่งไม่ทำงานเลย ขอบคุณมาก!
Kimbluey

38

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

การติดตั้ง Java เวอร์ชัน 64 บิตช่วยในกรณีเหล่านี้ข้อกำหนดหน่วยความจำที่ต่อเนื่องกันจะใช้กับ Java แบบ 32 บิตเท่านั้น


1
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดในกรณีที่คุณได้รับข้อผิดพลาดหลังจากใช้ตัวเลือก -Xmx [bignumber] m ช่วยฉันรัน Apache jMeter อย่างถูกต้อง
RuudvK

ฉันสร้างโครงการใหม่โดยไม่มีรหัสนอกเหนือจากกิจกรรมหลักที่สร้างขึ้นอัตโนมัติและทำให้เกิดข้อผิดพลาดนี้
behelit

1
ฉันสอง @RuudvK การติดตั้ง 64- บิตช่วยให้ฉันสามารถเพิ่มหน่วยความจำสูงสุดในขณะที่ล้างข้อผิดพลาดการจัดสรรหน่วยความจำ นี่ควรเป็นคำตอบที่ยอมรับได้
J Weezy

28

ใช้ร่วมกับ -Xmx512M ใช้ -d64 เพื่อให้แน่ใจว่าคุณใช้ VM 64- บิต บนเครื่อง 64 บิตฉันคิดว่าฉันกำลังเรียกใช้เครื่องเสมือน 64 บิต แต่ไม่ใช่ หลังจากติดตั้ง Java 64 บิตแล้วตัวเลือก -d64 จะทำงานและ -Xmx อนุญาตให้มีขนาดหน่วยความจำที่ใหญ่กว่ามาก

java -d64 -Xmx512M mypackage.Test

4
คำตอบนี้ควรจะอยู่ด้านบน ใช้เวลาสองเดือนในการต่อสู้กับปัญหานี้เพียงแค่ตระหนักว่าการติดตั้ง 64 บิต Java แก้ไขปัญหา (ตัวเลือก -d64 ไม่จำเป็นในกรณีของฉัน)
Nilzor

หยิบขึ้นมา _JAVA_OPTIONS: -d64 -Xmx1024M ตัวเลือกที่ไม่รู้จัก: -d64 JVM ไม่สามารถเริ่มต้นได้ ขนาดฮีพสูงสุด (-Xmx) อาจใหญ่เกินไปหรือเครื่องมือป้องกันไวรัสหรือไฟร์วอลล์อาจบล็อกการทำงาน
Alexander

14

ฉันได้รับข้อผิดพลาดเดียวกันและแก้ไขได้โดยกำหนดค่าใน run.conf.bat

รัน JVM ด้วยการกำหนดค่า run.conf.bat ใน Jboss5x

หากหน่วยความจำว่างไม่สามารถใช้งานได้ในขณะที่คุณกำลังผ่านคำสั่งนั้นโปรดทำการเปลี่ยนแปลงใน run.conf.bat

set "JAVA_OPTS=-Xms512m -Xmx512m -XX:MaxPermSize=256m"

7

ฉันรู้ว่ามีคำตอบมากมายที่นี่แล้ว แต่ไม่มีใครช่วยฉันได้ ในที่สุดฉันเปิดไฟล์/etc/elasticsearch/jvm.optionsและเปลี่ยน:

-Xms2G
-Xmx2G

ถึง

-Xms256M
-Xmx256M

ที่แก้ไขมันสำหรับฉัน หวังว่านี่จะช่วยคนอื่นที่นี่


7

ฉันมีปัญหาที่คล้ายกัน ฉันติดตั้ง Java เวอร์ชัน 32 บิตบนเครื่อง 64 บิตแล้ว

โดยการถอนการติดตั้งเวอร์ชันนั้นและติดตั้ง Java เวอร์ชัน 64 บิต ฉันสามารถแก้ไขปัญหาได้


6

สมมติว่าระดับของคุณเรียกว่าในแพคเกจTest mypackageเรียกใช้รหัสของคุณเช่นนี้:

java -Xmx1024m mypackage.Test

การทำเช่นนี้จะเป็นการสำรองพื้นที่ฮีปขนาด 1024 MB สำหรับรหัสของคุณ หากคุณต้องการ 512 MB คุณสามารถใช้:

java -Xmx512m mypackage.Test

ใช้มเล็ก ๆ น้อย ๆ ใน1024m, 512mฯลฯ


6

บางครั้งข้อผิดพลาดนี้บ่งชี้ว่าหน่วยความจำกายภาพและการสลับบนเซิร์ฟเวอร์ใช้งานจริงอย่างสมบูรณ์!

ฉันเห็นปัญหานี้เมื่อเร็ว ๆ นี้บนเซิร์ฟเวอร์ที่ใช้ RedHat Enterprise Linux 5.7 พร้อม RAM 48 GB ฉันพบว่าแม้กระทั่งวิ่ง

java -version

ทำให้เกิดข้อผิดพลาดเดียวกันซึ่งยืนยันว่าปัญหาไม่ได้เฉพาะเจาะจงกับแอปพลิเคชันของฉัน

วิ่ง

cat /proc/meminfo

รายงานว่า MemFree และ SwapFree ทั้งคู่มีค่าต่ำกว่า 1% ของค่า MemTotal และ SwapTotal ตามลำดับ:

MemTotal:     49300620 kB
MemFree:        146376 kB
...
SwapTotal:     4192956 kB
SwapFree:         1364 kB

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

MemTotal:     49300620 kB
MemFree:       2908664 kB
...
SwapTotal:     4192956 kB
SwapFree:      1016052 kB

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

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


เช่นเดียวกันที่นี่java -versionความล้มเหลวแม้ว่าด้านบนจะแสดงบางส่วนที่ว่าง: | (เช่นกล่าวว่าเกิดข้อผิดพลาดในระหว่างการเริ่มต้นของ VM ไม่สามารถจองพื้นที่เพียงพอสำหรับอาร์เรย์การ์ดทำเครื่องหมายบางครั้ง) Fix ดูเหมือนว่าจะทำงานด้านบนมองหากระบวนการที่ใช้ RAM มากที่สุด (คอลัมน์ VIRT) ฆ่าพวกเขา [postgres, appdynamics สำหรับฉัน]: |
rogerdpack

อาจเป็นเพราะการกระจายตัวของหน่วยความจำ? คำตอบข้างต้นกล่าวถึงพื้นที่ว่างที่ต่อเนื่องกัน
Rick Moritz

6

ข้อผิดพลาด:

สำหรับข้อผิดพลาด"ข้อผิดพลาดเกิดขึ้นในระหว่างการเริ่มต้นของ vm ไม่สามารถจองพื้นที่เพียงพอสำหรับวัตถุฮีป jboss"

สาเหตุหลัก:

  • การจัดสรรหน่วยความจำไม่เหมาะสม / ไม่เพียงพอกับ JVM ของเราดังที่กล่าวไว้ด้านล่าง

  • เช่นJAVA_OPTS = "- Xms1303m -Xmx1303m -XX: MaxPermSize = 256m"ใน jboss-eap-6.2 \ bin \ standalone.conf หรือ"JAVA_OPTS = -Xms1G -Xmx1G -XX: MaxPermSize = 256M"ใน jboss-eap-6.2 \ standalone.conf.bat ซึ่งไม่ได้เป็นอะไรนอกจากพารามิเตอร์การจัดสรรหน่วยความจำ JVM

มติ:

  • เพิ่มขนาดฮีพ เพื่อเพิ่มขนาดฮีพ
  • goto -> jboss-eap-6.2 \ bin \ standalone.conf.bat หรือ jboss-eap-6.2 \ bin \ standalone.conf
  • เปลี่ยน -> JAVA_OPTS = "- Xms256m -Xmx512m -XX: MaxPermSize = 256m" โดยที่ -Xms คือขนาดฮีปขั้นต่ำและ -Xmx คือขนาดฮีปสูงสุด
  • มักจะไม่แนะนำให้มีขนาดเดียวกันสำหรับ min และ max

  • หากคุณกำลังเรียกใช้แอปพลิเคชันของคุณจาก eclipse

  • ดับเบิลคลิกที่เซิร์ฟเวอร์
  • เลือก 'เปิดการกำหนดค่าเปิด' คุณจะถูกนำไปที่หน้าต่าง 'แก้ไขคุณสมบัติการกำหนดค่าการเปิดตัว'
  • ในวินด์ทาวน์นี้ไปที่แท็บ '(x) = อาร์กิวเมนต์'
  • ใน VM อาร์กิวเมนต์กำหนดขนาดฮีปของคุณตามที่กล่าวถึงด้านล่าง
  • "-Dprogram.name = JBossTools: JBoss EAP 6.1+ เซิร์ฟเวอร์รันไทม์" - เซิร์ฟเวอร์ -Xms256m -Xmx512m -XX: MaxPermSize = 256m -Dorg.jboss.resolver.warning = true

ข้อความอ้างอิงจากการอ้างอิงบรรทัดคำสั่งของ Oracle : " เพื่อประสิทธิภาพที่ดีที่สุดให้ตั้งค่า -Xms เป็นขนาดเดียวกับขนาดฮีพสูงสุดตัวอย่างเช่นjava -Xgcprio:throughput -Xmx:64m -Xms:64m myApp "
user1438038

3

ฉันเพิ่งประสบปัญหานี้ ฉันมี 3 แอพพลิเคชั่นจาวาที่เริ่มต้นด้วยขนาดฮีป 1024m หรือ 1280m Java กำลังดูพื้นที่ว่างในการสลับและหากมีหน่วยความจำไม่เพียงพอให้ใช้ jvm จะออก

เพื่อแก้ไขปัญหานี้ฉันต้องจบหลายโปรแกรมที่มีการจัดสรรหน่วยความจำเสมือนจำนวนมาก

ฉันทำงานบน x86-64 linux ด้วย jvm 64 บิต


3

ฉันมีการตั้งค่าหน่วยความจำในปริมาณที่เหมาะสม แต่สำหรับฉันมันใช้ Intellij 64 บิตกับ 32 บิต jvm เมื่อฉันเปลี่ยนเป็น VM 64 บิตข้อผิดพลาดก็หายไป



2

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

java -Xms128M -Xmx512M
JAVA_OPTS="-Xms128M -Xmx512M"

สำหรับ 64 บิต JVM ขนาดฮีปที่ใหญ่กว่า-Xms512M -Xmx1536Mควรทำงานได้

เรียกใช้java -versionหรือjava -d32, java--d64สำหรับ Java7 เพื่อตรวจสอบรุ่นที่คุณกำลังทำงาน


1

อย่างไรก็ตามนี่คือวิธีแก้ไข: ไปที่ Start-> แผงควบคุม -> ระบบ -> ขั้นสูง (แท็บ) -> ตัวแปรสภาพแวดล้อม -> ตัวแปรระบบ -> ใหม่: ชื่อตัวแปร: _JAVA_OPTIONS ค่าตัวแปร: -Xmx512M

หรือ

เปลี่ยนการเรียก ant ตามที่แสดงด้านล่าง

   <exec
        **<arg value="-J-Xmx512m" />**
    </exec>

มันใช้งานได้สำหรับฉัน


1

เกิดข้อผิดพลาดระหว่างการเริ่มต้นของ VM ไม่สามารถจองพื้นที่เพียงพอสำหรับฮีปวัตถุ 1572864KB

ฉันเปลี่ยนค่าหน่วยความจำในไฟล์ settings.grade 1536 เป็น 512 และช่วยได้


1

ไปที่ Start-> Control Panel-> System-> Advanced (แท็บ) -> Environment Variables-> System Variables-> New:

Variable name: _JAVA_OPTIONS
Variable value: -Xmx512M

การตั้งค่านี้ทั่วโลก จำกัด ขนาดฮีพที่คุณสามารถให้กับ IntelliJ
user3056052

0

ในกรณีที่คุณใช้โปรแกรมจาวา: - รันโปรแกรมในเทอร์มินัลโดยใช้คำสั่งที่ถูกต้องสำหรับ linux มันจะเป็น 'java -jar myprogram.jar' และเพิ่ม -Xms256m -Xmx512m ตัวอย่างเช่น: 'java -jar myprogram.jar Xms256m -Xmx512m '

ในกรณีที่คุณใช้งานสคริปต์. sh (linux, mac?) หรือ. bat script (windows) ให้เปิดสคริปต์และค้นหาตัวเลือก java หากมีอยู่และเพิ่มหน่วยความจำ

หากสิ่งทั้งหมดข้างต้นใช้งานไม่ได้ให้ตรวจสอบโปรเซสของคุณ (ctrl + alt + delete บน windows) (ps aux บน linux / mac) และฆ่ากระบวนการที่ใช้หน่วยความจำจำนวนมากและไม่จำเป็นสำหรับระบบปฏิบัติการของคุณ! => ลองเรียกใช้โปรแกรมของคุณอีกครั้ง


0

ใน CASSANDRA_HOME / bin / cassandra.bat คุณจะพบการกำหนดค่าต่อไปนี้

REM JVM Opts we'll use in legacy run or installation
set JAVA_OPTS=-ea^
 -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.0.jar"^
 -Xms**2G**^
 -Xmx**2G**^

คุณสามารถลด 2G ให้มีจำนวนน้อยลงเช่น 1G หรือน้อยกว่าและควรใช้งานได้

เหมือนกันถ้าคุณกำลังทำงานบนกล่องยูนิกซ์เปลี่ยนไฟล์. sh อย่างเหมาะสม


0

ฉันได้รับข้อผิดพลาดเดียวกันและได้รับการแก้ไขเมื่อฉันลบไฟล์ temp โดยใช้% temp% และเริ่ม eclipse ใหม่


0

บางครั้งมันเกี่ยวข้องกับ

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

หากคุณตั้งเป็น:

$ sysctl vm.overcommit_memory=0

มันควรจะทำงาน


0

แทนที่-Xmx2Gด้วย-Xms512Mหรือขนาดหน่วยความจำที่มากขึ้นในไฟล์ cassandra.bat ในไดเร็กทอรี Cassandra bin


0

เปิดไฟล์ gradle.properties ในโฟลเดอร์ android

แทนที่บรรทัดนี้:

org.gradle.jvmargs=-Xmx1536M

ด้วย:

org.gradle.jvmargs=-Xmx512m

คำอธิบาย: ขีด จำกัด สูงสุดจากเอกสาร Gradle:

หากสภาพแวดล้อมการสร้างที่ร้องขอไม่ได้ระบุขนาดฮีปสูงสุด Daemon จะใช้ฮีปมากถึง 512MB


-2

ไม่จำเป็นต้องทำอะไรเพียงแค่เปลี่ยนในไฟล์ POM เหมือนด้านล่าง

<configuration>
    <maxmemory>1024M</maxmemory>
</configuration>

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