我正在开发一个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
等...)。
答案 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
选项上的单位后缀。