Không thể dành đủ không gian cho đống đối tượng


277

Tôi liên tục nhận được ngoại lệ sau mỗi lần tôi cố chạy chương trình.

Lỗi xảy ra trong quá trình khởi tạo máy ảo

Không thể dành đủ không gian cho đống đối tượng

Không thể tạo máy ảo Java.

Tôi đã cố gắng tăng bộ nhớ ảo (kích thước trang) và kích thước RAM, nhưng không có kết quả.

Làm thế nào tôi có thể loại bỏ lỗi này?



2
Tôi cũng gặp lỗi này khi sử dụng jdk / jre 1.6 trên máy ảo của mình, đã cố gắng thay đổi giá trị cấu hình được đưa ra trong các nhận xét nhưng điều này không có ích, sau khi cập nhật lên jdk 1.7, lỗi đã biến mất và áp dụng các tham số Xmx lớn hơn. Có vẻ có nhiều thay đổi với việc sử dụng heap kể từ java 1.6.
Alexander.Iljushkin

Câu trả lời:


214

Chạy JVM với -XX:MaxHeapSize=512m(hoặc bất kỳ số lượng lớn nào bạn cần) (hoặc -Xmx512mviết tắt)


42
Hoặc ngắn hơn, -mx256m hoặc -mx512m;)
Peter Lawrey

8
-Mx có giống như -Xmx và -XX: MaxHeapSize không?
Erty Seidohl

19
Cảm ơn .. hóa ra con số quá lớn cũng có thể là một vấn đề và có thể gây ra lỗi tương tự!
Dinesh Rajan

17
Bất cứ ai cũng tìm thấy một giải pháp thực sự hoạt động 100% thời gian? Giải pháp này tạm thời giải quyết vấn đề nhưng rồi đột nhiên nó quay trở lại. Tôi đã có 16GB ram và tôi cảm thấy mệt mỏi với điều này. Mọi thứ đã tốt hơn trong những ngày xưa: [
Nilzor

6
Không hoạt động với tôi trên Windows 8 với x86 hoặc x64 Java.
AndrewSmiley

128

Điều này cũng có thể được gây ra bằng cách đặt một cái gì đó quá lớn trên HotSpot 32 bit, ví dụ:

-Xms1536m -Xmx1536m

nơi này có thể / sẽ hoạt động:

-Xms1336m -Xmx1336m

5
Tôi quên đề cập rằng vấn đề này sẽ phải xảy ra trong khi khởi chạy trong shell lệnh 32 bit. Một shell lệnh 64 bit có thể không có vấn đề này.
djangofan

Đối với tôi, nó không thành công với giá trị mặc định và với giá trị quá lớn, vì vậy hãy đảm bảo bạn thử nhiều giá trị. Cảm ơn câu trả lời!
Trax

47

Đây là cách khắc phục:

  • Đi đến Bắt đầu-> Bảng điều khiển-> Hệ thống-> Nâng cao (tab) -> Biến môi trường-> Hệ thống

    Biến-> Mới: Tên _JAVA_OPTIONS biến: Giá trị -Xmx512M biến: Tên Path
    biến: Giá trị biến:%PATH%;C:\Program Files\Java\jre6\bin;F:\JDK\bin;

Thay đổi điều này để con đường thích hợp của bạn.


1
Khá giống với câu trả lời này , tôi muốn nói ...
That1Guy

Tốt một. Cùng với những điều trên tham khảo cái này quá. stackoverflow.com/a/9350506/967638
Amarnath

46

Tôi đã gặp phải điều này khi sử dụng javac và dường như nó không nhận được các tùy chọn dòng lệnh,

-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.

Vì vậy, giải pháp ở đây nên đặt _JAVA_OPTIONS

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

Và điều này biên dịch tốt.

Điều này xảy ra với tôi trên các máy có nhiều RAM, nhưng với các bộ nhớ thấp hơn. Java quyết định phân bổ một đống lớn vì nó phát hiện ram trong máy, nhưng nó không được phép phân bổ nó vì những vết loét.


1
+1 để chỉ ra _JAVA_OPTIONS - trong trường hợp của tôi, java được gọi từ một nơi nào đó sâu trong tập lệnh shell mà tôi không có quyền truy cập ghi, vì vậy tùy chọn này là thích hợp hơn.
gerrit

Tương tự ở đây. Tôi đang sử dụng máy tính của trường đại học nên tôi không phải là quản trị viên (không thể thay đổi các biến môi trường) và tùy chọn dòng lệnh hoàn toàn không hoạt động. Cám ơn rất nhiều!
Kimbluey

38

Java 32 bit yêu cầu không gian trống liền kề trong bộ nhớ để chạy. Nếu bạn chỉ định kích thước heap lớn, có thể không có quá nhiều không gian trống liền kề trong bộ nhớ ngay cả khi bạn có nhiều không gian trống có sẵn hơn mức cần thiết.

Việc cài đặt phiên bản Java 64 bit giúp trong những trường hợp này, các yêu cầu bộ nhớ liền kề chỉ áp dụng cho Java 32 bit.


1
Tôi nghĩ rằng đây là câu trả lời tốt nhất trong trường hợp bạn tiếp tục gặp lỗi sau khi sử dụng tùy chọn -Xmx [bignumber] m. Đã giúp tôi chạy Apache jMeter đúng cách.
RuudvK

Tôi đã tạo một dự án hoàn toàn mới, không có mã nào ngoài hoạt động chính được tạo tự động và nó đã tạo ra lỗi này
xử vào

1
Tôi thứ hai @RuudvK. Cài đặt 64-bit cho phép tôi tăng bộ nhớ tối đa trong khi xóa lỗi cấp phát bộ nhớ. Đây phải là câu trả lời được chấp nhận.
J Weeklyzy

28

Kết hợp với -Xmx512M sử dụng -d64 để đảm bảo bạn đang chạy VM 64 bit. Trên máy 64 bit tôi nghĩ chắc chắn mình đang chạy máy ảo 64 bit, nhưng không. Sau khi cài đặt Java 64 bit, tùy chọn -d64 hoạt động và -Xmx cho phép kích thước bộ nhớ lớn hơn nhiều.

java -d64 -Xmx512M mypackage.Test

4
Câu trả lời này nên được đặt lên hàng đầu. Đã hai tháng chiến đấu với vấn đề này, để nhận ra rằng việc cài đặt Java 64 bit đã giải quyết được vấn đề (tùy chọn -d64 không cần thiết trong trường hợp của tôi)
Nilzor

Đã chọn _JAVA_OPTIONS: -d64 -Xmx1024M Tùy chọn không được nhận dạng: -d64 Không thể khởi động JVM. Kích thước heap tối đa (-Xmx) có thể quá lớn hoặc công cụ chống vi-rút hoặc tường lửa có thể chặn thực thi.
Alexander

14

Tôi đã gặp lỗi tương tự và giải quyết vấn đề này bằng cách định cấu hình nó trong run.conf.bat

Chạy JVM với cấu hình run.conf.bat trong Jboss5x

Nếu bộ nhớ trống không có sẵn NHƯ bạn đang chuyển qua câu lệnh thì vui lòng thực hiện thay đổi trong run.conf.bat

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

7

Tôi biết đã có rất nhiều câu trả lời ở đây, nhưng không ai trong số họ giúp tôi. Cuối cùng, tôi mở tập tin /etc/elasticsearch/jvm.optionsvà thay đổi:

-Xms2G
-Xmx2G

đến

-Xms256M
-Xmx256M

Điều đó đã giải quyết nó cho tôi. Hy vọng điều này sẽ giúp người khác ở đây.


7

Tôi đã có vấn đề tương tự. Tôi đã cài đặt phiên bản Java 32 bit trên máy 64 bit.

Bằng cách gỡ cài đặt phiên bản đó và cài đặt phiên bản Java 64 bit. Tôi đã có thể giải quyết vấn đề.


6

Giả sử lớp của bạn được gọi Testtrong gói mypackage. Chạy mã của bạn như thế này:

java -Xmx1024m mypackage.Test

Điều này sẽ dành 1024 MB dung lượng heap cho mã của bạn. Nếu bạn muốn 512 MB, bạn có thể sử dụng:

java -Xmx512m mypackage.Test

Sử dụng ít m 1024m, 512m, vv


6

Đôi khi, lỗi này chỉ ra rằng bộ nhớ vật lý và trao đổi trên máy chủ thực sự được sử dụng đầy đủ!

Gần đây tôi đã gặp vấn đề này trên một máy chủ chạy RedHat Enterprise Linux 5.7 với 48 GB RAM. Tôi thấy rằng thậm chí chỉ chạy

java -version

gây ra lỗi tương tự, mà xác định rằng vấn đề không cụ thể đối với ứng dụng của tôi.

Đang chạy

cat /proc/meminfo

đã báo cáo rằng MemFree và SwapFree đều tương ứng dưới 1% giá trị MemTotal và SwapTotal:

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

Việc dừng một vài ứng dụng đang chạy khác trên máy đã mang lại con số bộ nhớ miễn phí:

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

Tại thời điểm này, một phiên bản Java mới sẽ khởi động ổn và tôi đã có thể chạy ứng dụng của mình.

(Rõ ràng, đối với tôi, đây chỉ là một giải pháp tạm thời; tôi vẫn có một nhiệm vụ nổi bật là kiểm tra kỹ hơn các quy trình đang chạy trên máy đó để xem liệu có thể làm gì để giảm mức sử dụng bộ nhớ danh nghĩa mà không phải dùng đến việc dừng các ứng dụng.)


Tương tự ở đây, java -versionthất bại, mặc dù top hiển thị một số vẫn miễn phí: | (cũng cho biết Lỗi xảy ra trong quá trình khởi tạo VM Không thể dành đủ dung lượng cho mảng đánh dấu thẻ đôi khi). Khắc phục có vẻ là để chạy hàng đầu, tìm kiếm các quá trình đang sử dụng nhiều RAM nhất (cột VIRT), tiêu diệt chúng [postgres, appdynamics cho tôi]: |
rogerdpack

Điều này có thể là do sự phân mảnh bộ nhớ? Một câu trả lời ở trên đề cập đến không gian trống liền kề.
Rick Moritz

6

Lỗi :

Đối với lỗi, "lỗi xảy ra trong quá trình khởi tạo vm không thể dành đủ dung lượng cho đối tượng heap jboss"

Nguyên nhân gốc rễ:

  • Cấp phát bộ nhớ không đủ / không đủ cho JVM của chúng tôi như được đề cập dưới đây.

  • ví dụ JAVA_OPTS = "- Xms1303m -Xmx1303m -XX: MaxPermSize = 256M" trong JBoss-EAP-6.2 \ bin \ standalone.conf hoặc "JAVA_OPTS = -Xms1G -Xmx1G -XX: MaxPermSize = 256M" trong JBoss-EAP-6.2 \ bin \ standalone.conf.bat không có gì ngoài các tham số nhóm cấp phát bộ nhớ JVM.

Nghị quyết:

  • Tăng kích thước đống. Để tăng kích thước heap,
  • goto -> jboss-eap-6.2 \ bin \ standalone.conf.bat hoặc jboss-eap-6.2 \ bin \ standalone.conf
  • thay đổi -> JAVA_OPTS = "- Xms256m -Xmx512m -XX: MaxPermSize = 256m" trong đó -Xms là kích thước heap tối thiểu và -Xmx là kích thước heap tối đa.
  • Thông thường nó không được khuyến nghị để có cùng kích thước cho min và max.

  • Nếu bạn đang chạy ứng dụng của mình từ nhật thực,

  • Nhấp đúp chuột vào máy chủ
  • chọn 'mở cấu hình khởi chạy', bạn sẽ được chuyển hướng đến cửa sổ 'Chỉnh sửa thuộc tính cấu hình khởi chạy'.
  • Trong Windown này, goto tab '(x) = Đối số'.
  • Trong đối số VM, xác định kích thước heap của bạn như được đề cập dưới đây
  • "-Dprogram.name = JBossTools: JBoss EAP 6.1+ Runtime Server" -server -Xms256m -Xmx512m -XX: MaxPermSize = 256m -Dorg.jboss.resolver.warning = true

Một trích dẫn từ Tài liệu tham khảo dòng lệnh của Oracle : " Để có hiệu suất tốt nhất, hãy đặt -Xms thành cùng kích thước với kích thước heap tối đa, ví dụ:java -Xgcprio:throughput -Xmx:64m -Xms:64m myApp "
user1438038

3

Gần đây tôi đã phải đối mặt với vấn đề này. Tôi có 3 ứng dụng java bắt đầu với kích thước heap 1024m hoặc 1280m. Java đang xem xét không gian có sẵn trong trao đổi và nếu không có đủ bộ nhớ, jvm sẽ thoát.

Để giải quyết vấn đề, tôi đã phải kết thúc một số chương trình có số lượng lớn bộ nhớ ảo được phân bổ.

Tôi đã chạy trên linux x86-64 với jvm 64 bit.


3

Tôi đã có đủ số lượng cài đặt bộ nhớ nhưng đối với tôi đó là sử dụng intellij 64 bit với 32 bit jvm. Khi tôi chuyển sang VM 64 bit, lỗi đã biến mất.



2

Nếu bạn đang chạy JVM 32 bit, thay đổi kích thước heap thành nhỏ hơn sẽ giúp ích rất nhiều. Bạn có thể làm điều này bằng cách chuyển trực tiếp args sang java hoặc thông qua các biến môi trường như sau,

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

Đối với JVM 64 bit, kích thước heap lớn hơn -Xms512M -Xmx1536Msẽ hoạt động.

Chạy java -versionhoặc java -d32, java--d64cho Java7 để kiểm tra phiên bản bạn đang chạy.


1

Dù sao, đây là cách khắc phục: Đi đến Bắt đầu-> Bảng điều khiển-> Hệ thống-> Nâng cao (tab) -> Biến môi trường-> Biến hệ thống-> Mới: Tên biến: _JAVA_OPTIONS Giá trị biến: -Xmx512M

HOẶC LÀ

Thay đổi cuộc gọi kiến ​​như hình dưới đây.

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

Nó làm việc cho tôi.


1

Xảy ra lỗi trong quá trình khởi tạo VM Không thể dành đủ dung lượng cho heap đối tượng 1572864KB

Tôi đã thay đổi giá trị của bộ nhớ trong cài đặt. Tập tin nâng cấp 1536 thành 512 và nó đã giúp


1

Đi đến Bắt đầu-> Bảng điều khiển-> Hệ thống-> Nâng cao (tab) -> Biến môi trường-> Biến hệ thống-> Mới:

Variable name: _JAVA_OPTIONS
Variable value: -Xmx512M

Đặt cài đặt này trên toàn cầu sẽ giới hạn kích thước heap mà bạn có thể cung cấp cho IntelliJ.
dùng3056052

0

Trong trường hợp bạn đang chạy chương trình java: - chạy chương trình của bạn trong thiết bị đầu cuối bằng cách sử dụng lệnh chính xác cho linux, đó sẽ là 'java -jar myprogram.jar' và thêm -Xms256m -Xmx512m, ví dụ: 'java -jar myprogram.jar Xms256m -Xmx512m '

Trong trường hợp bạn đang chạy tập lệnh .sh (linux, mac?) Hoặc tập lệnh .bat (windows) hãy mở tập lệnh và tìm các tùy chọn java nếu chúng có mặt và tăng bộ nhớ.

Nếu tất cả các cách trên không hoạt động, hãy kiểm tra các quy trình của bạn (ctrl + alt + xóa trên windows) (ps aux trên linux / mac) và tiêu diệt các quy trình sử dụng phân bổ bộ nhớ và không cần thiết cho hệ điều hành của bạn! => Cố gắng chạy lại chương trình của bạn.


0

Trong CASSANDRA_HOME / bin / cassandra.bat bạn sẽ tìm thấy cấu hình sau

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**^

Bạn có thể giảm 2G xuống một số số nhỏ hơn, ví dụ 1G hoặc thậm chí ít hơn và nó sẽ hoạt động.

Tương tự nếu bạn đang chạy trên hộp unix, hãy thay đổi tệp .sh một cách thích hợp.


0

Tôi đã gặp lỗi tương tự và nó đã được giải quyết khi tôi xóa các tệp tạm thời bằng% temp% và khởi động lại nhật thực.


0

Đôi khi nó liên quan như

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

Nếu bạn đặt nó thành:

$ sysctl vm.overcommit_memory=0

Nó nên hoạt động.


0

Thay thế -Xmx2Gbằng -Xms512Mhoặc bất kỳ kích thước bộ nhớ lớn hơn trong tệp cassandra.bat trong thư mục cassandra bin.


0

Mở tập tin gradle.properIES trong thư mục Android.

Thay thế dòng này:

org.gradle.jvmargs=-Xmx1536M

với:

org.gradle.jvmargs=-Xmx512m

Giải thích: Giới hạn tối đa từ tài liệu Gradle:

Nếu môi trường xây dựng được yêu cầu không chỉ định kích thước heap tối đa, Daemon sẽ sử dụng tối đa 512MB heap.


-2

Không cần phải làm bất cứ điều gì chỉ cần chnage trong tệp POM như dưới đây

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

2
Ai nói bất cứ điều gì về một tập tin POM?
Henley Chiu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.