[英]Get Max Heap Size of Running JVM from Command Line: No JDK Tools
我正在研究一个bash脚本,该脚本在Java应用程序Web服务器上执行操作,然后Web服务器停机以重新启动/重新引导。 作为其中的一部分,我需要找出提供给JVM的最大堆分配量(Xmx选项)。 此选项的此值将有所不同,具体取决于部署Web应用程序的硬件。 我正在寻找可以在脚本中使用的东西来填充变量,例如:
XMX_JVM_VALUE=$(command[s] here)
然后,我将使用此值来确定日志记录分区上是否有足够的空间在此处创建堆转储。 该值将通过以下方式收集:
LOG_DISK_SPACE=$(df -P /var/log | awk 'NR==2{print $4}')
我的两个限制是我不能使用JDK工具,因为服务器上只有JRE,而且我只能使用系统随附的常规Linux命令(诸如grep
, ps
, awk
等)。
怎么样...
java -XX:+PrintFlagsFinal 2> /dev/null | grep MaxHeapSize
JRE中提供了java
命令。
经过反复尝试,我想到了以下解决方案。 它确实使用了一个假设,即具有最大Xmx
值的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
选项上的单位后缀。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.