2009-10-06 40 views
16

khi sử dụng Jruby, tôi nhận được thông báo này.java.lang.OutOfMemoryError: Vùng heap Java

Complete Java stackTrace 
java.lang.OutOfMemoryError: Java heap space 

cách giải quyết?

+0

Bạn có thể muốn phân bổ ít đối tượng hơn trên heap. Bạn có thể đăng đoạn mã để chúng tôi có thể hiểu mã bạn đang cố thực thi không? –

+0

có thể trùng lặp của [Làm thế nào để đối phó với "java.lang.OutOfMemoryError: Java heap không gian" lỗi (kích thước heap 64MB)] (http://stackoverflow.com/questions/37335/how-to-deal-with-java- lang-outofmemoryerror-java-heap-không gian-lỗi-64mb-heap) – Mark

Trả lời

2

bạn có thể đặt đống tối đa của bạn đến một kích thước lớn hơn trên dòng lệnh:

java -Xmx512m MyClass 
1

Hoặc bạn đang bị rò rỉ bộ nhớ và bạn cần phải tìm lý do tại sao hoặc bạn cần phải cung cấp cho Java không gian đống hơn:

java -Xmx512m ... 
9

Bạn có thể điều chỉnh kích thước heap JVM sử dụng các tùy chọn -Xmx-Xms JVM: -Xmx cho kích thước heap tối đa, và -Xms cho kích thước heap ban đầu. Ví dụ:

java -Xms128m -Xmx256m BigApp 

Tôi thường sử dụng cùng cài đặt cho kích thước ban đầu và kích thước tối đa.

Trong trường hợp của bạn, thật khó để nói cách kích thước JVM mà không cần thêm thông tin về những gì bạn đang làm, khi sự cố xảy ra ... Hoặc có thể bạn đã bị rò rỉ bộ nhớ ở đâu đó và tăng kích thước heap Không, nó sẽ chỉ làm cho vấn đề xảy ra sau đó. Trong trường hợp này, giải pháp duy nhất là sửa lỗi rò rỉ.

Cuối cùng không kém phần quan trọng, hãy nhớ rằng lớn hơn đống, còn GC chính càng dài.

3

Tăng kích thước kết xuất đống có thể chỉ là một băng hỗ trợ. Bạn cần phải tạo một bãi chứa đống bằng cách thêm đối số thích hợp thích hợp:

java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512 

Điều này sẽ tạo một tệp tương tự như java _ *. Hprof. Sau đó, bạn có thể sử dụng một loạt các công cụ mã nguồn mở để phân tích kết xuất đống. Java 1.6 tàu với JHat, đó là loại lỗi và không phân tích heaps lớn tốt. Tôi sử dụng plugin Eclipse tuyệt vời này: Eclipse Memory Analyzer.

Khi báo cáo được tạo từ vùng lưu trữ, bạn có thể xem lớp nào đang chiếm nhiều bộ nhớ nhất và bạn có thể sử dụng đó làm điểm bắt đầu để gỡ lỗi mã để tìm bất kỳ rò rỉ bộ nhớ nào.

17

TLDR: jruby -J-Xmx1024m script_you_want_to_run.rb

Như những người khác đã đề cập, chương trình của bạn đang cố gắng để cấp phát bộ nhớ hơn so với kích thước tối đa JVM được phép phân bổ.

Cũng như những người khác đã đề cập, bạn có thể định cấu hình Java để cho phép phân bổ bộ nhớ nhiều hơn bằng cách cho nó thông qua dòng lệnh với đối số -Xmx1024m (ví dụ).

-Xmx là đối số cho bộ nhớ tối đa và 1024m sẽ là kích thước bộ nhớ (m cuối cùng cho megabyte). Tôi nghĩ rằng JRuby bắt đầu JVM với bộ nhớ tối đa thiết lập để 512m đã có, vì vậy bạn có thể sẽ muốn được đi cao hơn thế.

Để gửi các đối số JVM từ dòng lệnh sử dụng JRuby, bạn sẽ cần phải thêm -J ở phía trước của tranh luận, vì vậy dòng lệnh của bạn sẽ trông như thế này:

jruby -J-Xmx1024m script_you_want_to_run.rb 

Tôi cũng đồng ý với tình cảm rò rỉ bộ nhớ: Nếu bạn không thực sự đối phó với một tấn đối tượng với kỳ vọng rằng bạn có thể gặp phải lỗi này, thì bạn có thể muốn xem xét khả năng chương trình của bạn đang có các tác dụng phụ không mong muốn.

1

Thông báo "Vùng lưu trữ Java" cho biết các đối tượng mới không thể được cấp phát trong Heap Java. Lỗi này không nhất thiết ngụ ý rò rỉ bộ nhớ ứng dụng. Vấn đề có thể đơn giản như một vấn đề cấu hình, trong đó kích thước heap được chỉ định (hoặc kích thước mặc định, nếu không được chỉ định) là không đủ cho ứng dụng.

nguồn tiềm năng của Lỗi này và giải pháp: http://www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-Java-heap-space.jsp

4

kiểm tra phiên bản JVM của JRuby với lệnh này

jruby -v 

Nếu nó trả về chuỗi này có nghĩa là bạn đang sử dụng một JVM 32bit do đó bạn không thể đặt kích thước heap tối đa thành> = 2gb

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) Client VM 1.6.0_37-b06 [Windows 7-x86] 

Bạn cần đặt JAVA_HOME thành phiên bản 64 bit của Java. ví dụ.

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_09 

Bạn sẽ thấy đầu ra sau đây nếu bạn chà lệnh JRuby -v lại

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) 64-Bit Server VM 1.7.0_09-b05 [Windows 7-amd64] 

Bạn có thể thấy rằng bạn đang sử dụng phiên bản 64bit của JVM. Sau đó bạn có thể đặt một trong hai JRuby opts thông số môi trường như sau

set JRUBY_OPTS=-J-Xmx2g 

hoặc bạn có thể chạy chương trình của bạn như sau

jruby -J-Xmx2g <your ruby program> 
+0

Tôi cũng cần cờ '-S', ví dụ:' jruby -J-Xmx2g -S đường ray s puma' – Kris

9

Thiết JRUBY_OPTS được giải pháp mà làm việc tốt nhất cho tôi. Nó được đề cập trong câu trả lời của Koray.

set JRUBY_OPTS=-J-Xmx2g 
0

Tôi gặp phải sự cố tương tự và tôi không thể tìm thấy giải pháp thỏa đáng sau khi googling trong vài giờ. Nếu tất cả những gì bạn cần là đặt thông số Xms và Xmx, dưới đây là những gì phù hợp với tôi:

ps aux | grep java

Tìm hiểu những gì thực sự đang chạy bởi jruby. Giết nó (kill -9 process_id). Chạy lại lệnh với các tùy chọn Java nguyên gốc trên dòng lệnh.

Hy vọng điều đó sẽ hữu ích.

Nhân tiện, tôi đang sử dụng máy chủ puma với JRuby trên Rails 4.0 và nếu có ai biết giải pháp thanh lịch hơn, vui lòng cho tôi biết. Tôi đã thử mọi thứ (after_use_hook, .rvmrc, .bashrc, v.v.)

Cảm ơn.

+0

ý của bạn là gì? Tùy chọn'? – Richardsondx

Các vấn đề liên quan