2016-09-28 68 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

相关问题