2011-04-26 157 views
24

我試圖將-XX:OnOutOfMemoryError="kill -9 %p"命令傳遞給我的jvm參數時出現問題。-XX:OnOutOfMemoryError =「kill -9%p」問題

我正在使用Jetty7,並且在start.ini文件中有這個。在啓動它給我下面的錯誤。這是JRE /jre1.6.0_03l64

出發碼頭:已開始碼頭週二4月26日9點54分26秒EDT 2011
無法識別的選項:-9
無法創建Java虛擬機。

start.ini文件如下。

#=========================================================== 
# If the arguements in this file include JVM arguments 
# (eg -Xmx512m) or JVM System properties (eg com.sun.???), 
# then these will not take affect unless the --exec 
# parameter is included or if the output from --dry-run 
# is executed like: 
# eval $(java -jar start.jar --dry-run) 
# 
# Below are some recommended options for Sun's JRE 
#----------------------------------------------------------- 
    --exec 
# -Dcom.sun.management.jmxremote 
    -Xmx4096m 
    -Xmn512m 
    -DLABEL=PROD_APP 
    -verbose:gc 
    -Xloggc:/export/opt/prod_app/logs/gc.log 
    -XX:OnOutOfMemoryError="kill -9 %p" 
# -XX:+PrintGCDateStamps 
    -XX:+PrintGCTimeStamps 
    -XX:+PrintGCDetails 
    -XX:+PrintTenuringDistribution 
# -XX:+PrintCommandLineFlags 
# -XX:+DisableExplicitGC 
# -XX:+UseConcMarkSweepGC 
# -XX:ParallelCMSThreads=2 
# -XX:+CMSClassUnloadingEnabled 
# -XX:+UseCMSCompactAtFullCollection 
# -XX:CMSInitiatingOccupancyFraction=80 

談到線路輸出碼頭將開始罰款,沒有問題。但是,由於系統內存泄漏,我們確實需要添加此參數,以防止進程崩潰時造成進一步損害。

有沒有人有任何想法我在這裏做錯了或如何解決這個問題?

+0

我也有類似的問題,但它是在我自己的批處理/ bash文件中。可能jetty會在.ini文件中的所有內容中引用他自己的引號。你可以用單引號(')來代替? – 2011-04-27 08:43:00

+0

我不知道爲什麼它不工作......它說'-XX:OnOutOfMemoryError =「; 」\t當首次拋出OutOfMemoryError時運行用戶定義的命令。 (在1.4.2更新12,6中介紹)'http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html – eee 2011-04-27 11:00:29

+0

這個問題的任何可行解決方案? – sorin 2012-07-26 17:03:27

回答

3

我相信你需要報出完整的選項,如:

"-XX:OnOutOfMemoryError=kill -9 %p" 
+0

如果我在整個選項中加上引號,那麼id就不會出現在實際的過程參數中,我預計會在這裏看到它。雖然它確實啓動,這是積極的。 // 1526 1506 99 04:51 pts/2 00:00:05 /usr/java/jre1.6.0_03l64/bin/java -Xmx4096m -Xmn512m -verbose:gc -Xloggc:/ export/opt/atdirect_dev/logs/gc .log -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails -XX:+ PrintTenuringDistribution -Djetty.home =/export/opt/PROD_APP -Dprod_app.connection-client.cfg =/export/opt/PROD_APP/lib/PROD/prod。 connection-client.cfg -DLABEL = PROD_APP – Patrick 2011-04-28 08:55:50

0

我甚至嘗試使用嵌入20%的空間,但是這是從字面上理解。所以,當它有一個OOM時,它失敗,說沒有找到命令(嵌入%20)。瘋狂,我知道,但值得一試... :)

也許我們應該使用實際的<並>像太陽文檔? :P我會嘗試... :)

0

怎麼樣,而不是調用kill,運行調用kill與PID作爲參數(你仍然有空間通過一個shell腳本,但沒有-9標誌)。

例如-XX:OnOutOfMemoryError='/path/killdash9.sh %p'

如果您仍然無法獲得該空間,也許可以嘗試讓shell腳本找到與該Jetty實例關聯的pid?非常黑客,但它可能工作。

1

我在一個腳本中找到了這個選項,並想了解更多關於它的知識,並且谷歌把我帶到了這裏。在相關腳本中給出的選項爲

-XX:OnOutOfMemoryError='"kill -9 %p"' 

所以該命令是雙引號,並且該選項值是單引號。這不是其他答案中顯示的形式之一,所以也許它會做你想做的事情?

2

作爲hadoop選項運行我遇到了相同的問題。 這就是答案:

# 
# java.lang.OutOfMemoryError: Java heap space 
# -XX:OnOutOfMemoryError="kill -9 %p" 
# Executing /bin/sh -c "kill -9 11902"... 

我也試過:

-XX:OnOutOfMemoryError='kill -9 %p' 

這裏是OOM標準輸出

-XX:OnOutOfMemoryError='"kill -9 %p"' 

它開始,但OOM它

# java.lang.OutOfMemoryError: Java heap space 
# -XX:OnOutOfMemoryError="kill' '-9' '%p" 
# Executing /bin/sh -c "kill' '-9' '1164"... 

但STDERR有: SH:殺-9 1164:找不到命令

這些甚至會無法啓動:

'-XX:OnOutOfMemoryError=kill -9 %p' 
"-XX:OnOutOfMemoryError=kill -9 %p" 
-XX:OnOutOfMemoryError="kill -9 %p" 
+0

我在這裏打開了一個bug:https://bugs.eclipse.org/bugs/show_bug.cgi?id=408904 這應該早在幾年前就被報告爲bug了,我們可以早點解決它。 – 2013-05-23 21:37:30

+2

錯誤'sh:kill -9 1164:command not found'告訴你什麼是重要的。傳遞給sh的可執行文件是'kill -9 1164'(注意,這是它試圖運行的可執行文件的名稱)。證明:如果你現在在你的命令行中輸入類似'$ blargfish -9 1164'的東西,你會得到'blarghfish:command not found'。請注意,錯誤消息中不存在命令行參數。 – 2013-05-23 21:48:48

3

我已經通過這個問題相當最近運行。我通過將選項設置爲JAVA_TOOL_OPTIONS環境變量來解決此問題。該變量記錄在by Oracle中,並且您必須在此shell變量上使用export這個變量,JVM將把它追加到參數中。

8

在Java版本8u92 VM參數

  • -XX:+ExitOnOutOfMemoryError
  • -XX:+CrashOnOutOfMemoryError

加入,看到release notes

ExitOnOutOfMemoryError
當你啓用這個選項,退出JVM內存外的一個錯誤的 第一次出現。如果 更喜歡重新啓動JVM的實例,而不是處理內存錯誤,則可以使用它。

CrashOnOutOfMemoryError
如果啓用該選項,當 了內存不足的錯誤時,JVM崩潰併產生文本和二進制 崩潰文件。

改進請求:JDK-8138745(參數命名是錯誤的,雖然JDK-8154713ExitOnOutOfMemoryError代替ExitOnOutOfMemory

0

以下工作

java -classpath $CLASSPATH "-XX:OnOutOfMemoryError=touch 'worker.oome'" $JVM_ARGS $MAIN 

大多數提供的答案不工作。

但是,如果你想把它放在例如$ JVM_ARGS變量是爲了一個痛苦的世界。