簡體   English   中英

java.lang.OutOfMemoryError:Java堆空間

[英]java.lang.OutOfMemoryError: Java heap space

在使用Jruby的時候,我收到了這條消息。

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

怎么解決?

TLDR: jruby -J-Xmx1024m script_you_want_to_run.rb

正如其他人所提到的,您的程序正在嘗試分配比允許JVM分配的最大大小更多的內存。

正如其他人所提到的,您可以通過命令行使用參數-Xmx1024m(作為示例)來配置Java以允許更多內存分配。

-Xmx是max memory的參數,1024m是內存大小(最后m為兆字節)。 我認為JRuby已經啟動了JVM,最大內存已經設置為512m,所以你可能想要比這更高。

要使用jruby從命令行將參數發送到JVM,您需要在參數前添加-J,因此您的命令行將如下所示:

jruby -J-Xmx1024m script_you_want_to_run.rb

我也同意內存泄漏情緒:如果你沒有真正處理大量的對象而期望你可能會看到這個錯誤,那么你可能想要研究一下你的程序是否有意外的副作用。

設置JRUBY_OPTS是最適合我的解決方案。 在Koray的回答中提到了這一點。

set JRUBY_OPTS=-J-Xmx2g

您可以使用-Xmx-Xms JVM選項調整JVM堆大小: -Xmx表示最大堆大小, -Xms表示初始堆大小。 例如:

java -Xms128m -Xmx256m BigApp

我通常對初始和最大堆大小使用相同的設置。

在你的情況下,很難說如何在沒有更多關於你正在做什么的信息的情況下調整JVM的大小,當問題發生時......或者你可能只是在某處發生了內存泄漏並且增加堆大小也無濟於事,它會讓問題在以后發生。 在這種情況下,唯一的解決方案是修復泄漏。

最后並非最不重要的是,始終牢記堆越大,主要GC越長

使用此命令檢查jruby的JVM版本

jruby -v

如果它返回此字符串,則表示您使用的是32位JVM,因此無法將最大堆大小設置為> = 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]

您需要將JAVA_HOME設置為64位版本的Java。 例如

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

如果再次擦除jruby -v命令,您將看到以下輸出

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]

您可以看到您現在使用64位版本的JVM。 之后,您可以設置jruby opts環境參數,如下所示

set JRUBY_OPTS=-J-Xmx2g

或者您可以按如下方式運行程序

jruby -J-Xmx2g <your ruby program>

增加堆轉儲大小可能只是一個創可貼。 您需要通過添加適當的適當參數來生成堆轉儲:

java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512

這將生成類似於java _ * .hprof的文件。 然后,您可以使用一組開源工具來分析堆轉儲。 Java 1.6附帶了JHat,這是一種有缺陷的並且不能很好地分析大堆。 我使用這個很棒的Eclipse插件: Eclipse Memory Analyzer

從堆轉儲生成報告后,您可以看到哪些類占用的內存最多,您可以將其用作調試代碼以找到任何內存泄漏的起點。

您可以在命令行上將最大堆設置為更大的大小:

java -Xmx512m MyClass

你要么泄漏內存而需要找到原因,或者你需要為Java提供更多的堆空間:

java -Xmx512m ...

消息“Java堆空間”表示無法在Java堆中分配新對象。 該錯誤不一定意味着應用程序內存泄漏。 問題可能就像配置問題一樣簡單,其中指定的堆大小(或默認大小,如果未指定)對於應用程序來說是不夠的。

此錯誤和解決方案的潛在來源: http//www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-Java-heap-space.jsp

我遇到了類似的問題,谷歌搜索幾個小時后我找不到滿意的解決方案。 如果您只需要設置Xms和Xmx參數,這對我有用:

ps aux | grep java

找出jruby實際運行的內容。 殺死它(kill -9 process_id)。 使用命令行上的本機Java選項重新運行該命令。

希望能幫助到你。

順便說一句,我在Rails 4.0上使用Puma服務器和Jruby,如果有人知道更優雅的解決方案,請告訴我。 我已經嘗試過所有東西(after_use_hook,.rvmrc,.bashrc等等)

謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM