繁体   English   中英

从命令行获取运行JVM的最大堆大小:没有JDK工具

[英]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命令(诸如greppsawk等)。

怎么样...

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM