[英]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.