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

时间:2016-09-28 21:02:34

标签: java bash

我正在开发一个bash脚本,它在Web服务器关闭以重启/重启之前在我们的Java应用程序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,{{1} },ps等...)。

2 个答案:

答案 0 :(得分:0)

怎么样......

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

JRE中提供了java命令。

答案 1 :(得分:0)

经过多次反复试验后,我找到了以下解决方案。它确实使用了具有最大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选项上的单位后缀。