2016-09-28 62 views
0

我正在研究一個bash腳本,該腳本在Web服務器關閉以重新啓動/重新啓動之前對我們的Java應用程序Web服務器執行操作。作爲其中的一部分,我需要找出提供給JVM的最大堆分配(Xmx選項)是多少。此選項的此值會有所不同,具體取決於部署Web應用程序的硬件。我在尋找的東西,我可以在腳本中使用填充一個變量,如:從命令行獲取運行JVM的最大堆大小:否JDK工具

XMX_JVM_VALUE=$(command[s] here) 

我就會以這個值來確定是否存在在我們的記錄分區有足夠的空間來創建一個堆轉儲那裏。該值將通過收集:

LOG_DISK_SPACE=$(df -P /var/log | awk 'NR==2{print $4}') 

兩個限制我的是,我不能使用JDK的工具,因爲在服務器上只有JRE,我僅限於系統附帶普通的Linux命令(事像grep,ps,awk等)。

+0

最糟糕的情況是解析出'/ proc/yourpid/cmdline' –

+0

我一直在尋找類似於此的東西。問題在於處理附加到Xmx選項('Xmx2048m','Xmx4g'等等)的潛在前綴,並將結果轉換爲一個以直接字節表示該值的數字。 – Andrew

回答

0

經過多次試驗和錯誤,我找到了以下解決方案。它確實使用了假設具有最大值的JVM進程是有意義的。

DATA_UNIT_MULTIPLIER=1024 
XMX_JVM_VALUE=$(ps -ef | grep -oP "Xmx\d+(m|g)" | sort -rn | cut -d'x' -f2 | head -1) 
XMX_DATA_UNIT="${XMX_JVM_VALUE:$((${#XMX_JVM_VALUE}-1)):1}" 
XMX_JVM_NUM=$(echo $XMX_JVM_VALUE | sed '$s/.$//') 

XMX_SIZE=1 
if [ "$XMX_DATA_UNIT" = "m" ]; then 
    XMX_SIZE=$(($XMX_JVM_NUM * $DATA_UNIT_MULTIPLIER)) 
elif [ "$XMX_DATA_UNIT" = "g" ]; then 
    XMX_SIZE=$(($XMX_JVM_NUM * $DATA_UNIT_MULTIPLIER * $DATA_UNIT_MULTIPLIER)) 
fi 

此實現轉換的Xmx值到同一個單位由df被報告。它還考慮到Xmx選件上的單位後綴。

0

......怎麼

java -XX:+PrintFlagsFinal 2> /dev/null | grep MaxHeapSize 

java命令是在JRE可用。

+0

意識到問題在於它可能會啓動一個新的JVM並提供其統計信息,而不是您想了解的JVM。 –

+0

看起來確實如此。 – Andrew

相關問題