作为一种常用的开发语言,Java常常运用可执行的JAR(Java Archive)文件来打包和分发应用程序。运用java -jar指令运转JAR文件是一种方便快捷的方式。本文将详细介绍java -jar指令的各种参数,帮助您充分利用这个功用。

一、简介

java -jar指令用于运转可执行的JAR文件。它会主动查找JAR文件中的清单文件(MANIFEST.MF),并依据清单文件中的Main-Class特点指定的主类来发动应用程序。

二、常用参数详解

以下是一些常用的java -jar指令的参数,让咱们逐一了解它们的功用和用法。

  1. -Xmx:指定Java堆的最大内存巨细。例如,-Xmx512m表明将最大堆内存设置为512MB。经过调整堆内存巨细,能够优化应用程序的功用和内存运用情况。

  2. -Xms:指定Java堆的初始内存巨细。例如,-Xms256m表明将初始堆内存设置为256MB。这个参数能够帮助您在发动应用程序时操控初始内存分配的巨细。

  3. -Xss:指定线程栈的巨细。例如,-Xss1m表明将线程栈巨细设置为1MB。线程栈用于存储线程的局部变量和办法调用信息。经过调整线程栈的巨细,能够操控应用程序的并发功用和内存运用情况。

  4. -XX:MetaspaceSize=256m参数,您能够指定元空间的初始巨细为256MB。这意味着在应用程序发动时,虚拟机会预分配256MB的内存用于存储类的元数据

  5. -XX:MaxMetaspaceSize=:指定元空间的最大巨细。元空间用于存储类的元数据信息。例如,-XX:MaxMetaspaceSize=256m表明将元空间的最大巨细设置为256MB。适当设置元空间的巨细能够避免类加载和元数据溢出的问题。

  6. -D=:设置体系特点。例如,-Djava.library.path=/path/to/libs设置java.library.path体系特点为/path/to/libs。您能够运用这个参数来装备应用程序的一些特点,例如文件途径、日志级别等。

  7. -verbose:class:打印类加载信息。运用这个参数能够了解应用程序在运转过程中加载的类的详细信息,包括类的名称、来历等。

  8. -verbose:gc:打印垃圾收回信息。经过运用这个参数,您能够了解应用程序的垃圾收回情况,包括垃圾收回器的运用情况、收回的对象数量等。

  9. -Dfile.encoding=:设置默认的文件编码。例如,-Dfile.encoding=UTF-8表明运用UTF-8编码来读取和写入文件。正确设置文件编码能够保证应用程序能够正确处理不同字符集的文本数据。

以上是一些常用的java -jar指令的参数,经过灵活运用这些参数,您能够对应用程序的功用、内存运用和体系特点进行优化和装备。

三、示例运用

示例1: 前台发动

java -jar -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m /opt/myapp/myapp.jar

在上述示例中,咱们同时运用了多个参数。-Xms4096m设置最大堆内存为4096MB,-Xmx4096m设置初始堆内存为4096MB,-XX:MetaspaceSize=256m 将元空间的初始巨细设置为256MB,-XX:MaxMetaspaceSize=256m 将元空间的最大巨细设置为256MB,最终,经过-jar选项指定要运转的JAR文件为myapp.jar。

示例2: 后台发动,并输出日志到nohub.out

nohup /usr/local/java/jdk1.8.0_333/bin/java -jar -Xms8192m -Xmx8192m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseConcMarkSweepGC /home/myapp/myapp.jar > nohup.out 2>&1 &

四、发动脚本

一般情况了,咱们会在jar包的同级目录下创建一个start.sh的发动脚本来发动咱们的服务
**示例1:**发动脚本

#!/bin/sh
nohup /usr/local/java/jdk1.8.0_102/bin/java -jar -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m   /home/myapp/myapp.jar  > nohup.out 2>&1 &

**示例2:**通用脚本

#!/bin/bash
# ##################################################################
# ### Service start script
# ##################################################################

# 方便检查日志,参数为 -f
PRG="$0"
P1=$1
#PRGDIR=`dirname "$PRG"`
PRGDIR=`pwd`

# ### 发动成功提示!
function success () {
    echo "#####"
    echo "####################### Start Service End! #######################"
    echo ""
    echo -e "                    \033[32;1;5m [ START SUCCESSFULLY! ]\033[0m"
    echo ""
}

# ### 发动失利提示正告!
function failed () {
    echo "#####"
    echo "####################### Start Service End! #######################"
    echo ""
    echo -e "                   \033[37;41;1;5m [ FAILED! FAILED! FAILED! ]\033[0m"
    echo -e "       \033[37;41;1;5m [ $1 ]\033[0m"
    echo ""
}
echo "####################### Start Service ############################"
echo "#####"
echo "##### Current Working Path: $PWD"

# ### Script running flag!
STATUS="OK!"
JAVA_VERSION=`java -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }'`
echo "##### Java Version : $JAVA_VERSION"

# ### 判断jdk版别是否是1.8
JAVA_VERSION_P="1.8"
JAVA_PATH=""
if [[ $JAVA_VERSION =~ $JAVA_VERSION_P ]]
then
    echo "##### The JDK is OK!"
    JAVA_PATH=`which java`
else
    echo "##### The JDK is not supported!"
fi

# ### 扫描/opt和/usr目录获取JAVA_PATH
reg='jdk1.8.0_[0-9]{1,3}/bin/java'
if [ "$JAVA_PATH" = "" ]; then
    echo "##### Find JDK directory!"
    echo "##### '/opt' And '/usr' directory will be scanned."
    echo "##### Start scan '/opt' directory ... ..."
    JAVA_PATH_DIR=$(find /opt -name java 2>&1)
    for i in $JAVA_PATH_DIR
    do
        if [[ $i =~ $reg ]]; then
            echo "##### JDK_PATH : $i"
            echo "##### The JDK_PATH is OK!"
            JAVA_PATH=$i
        fi
    done
fi
if [ "$JAVA_PATH" = "" ]; then
    echo "##### '/opt' directory Not found the JDK!"
    echo "##### Start scan '/usr' directory ... ..."
    JAVA_PATH_DIR=$(find /usr -name java 2>&1)
    for i in $JAVA_PATH_DIR
    do
        if [[ $i =~ $reg ]]; then
            echo "##### JDK_PATH : $i"
            echo "##### The JDK_PATH is OK!"
            JAVA_PATH=$i
        fi
    done
fi
if [ "$JAVA_PATH" = "" ]; then
    echo "##### '/usr' directory Not found the JDK!"
    msg="The JDK Not found, Please configure the JDK!"
    echo "##### $msg"
    failed "$msg"
    exit
fi

# ### 获取jar文件,若多个jar文件,默认选择运用最新文件
echo "##### Get running jar file, if more than jar file, the default option is to use the latest file."
JarFileName=$(ls -lt $PRGDIR/*.jar 2>&1|awk '/^-/ {print $NF}'|sed -n '1p')
if [ -z "$JarFileName" ]; then
    msg="The jar file is not exist! Please confirm before implementation."
    echo "##### $msg"
    failed "$msg"
    exit
fi
echo "##### Currently Running JarFileName: $JarFileName"

# ### 设置JVM参数
CATALINA_OPTS="-Xms8192m -Xmx8192m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseConcMarkSweepGC"
RUN_COM="nohup $JAVA_PATH -jar $CATALINA_OPTS $JarFileName 2>&1"
echo "##### Run the command : $RUN_COM"
#nohup $JAVA_PATH -jar $CATALINA_OPTS $JarFileName > nohup.out 2>&1 &
setsid $JAVA_PATH -jar $CATALINA_OPTS $JarFileName > nohup.out 2>&1 &
# ### 将jar包发动对应的pid写入文件中,为中止时供给pidi
# echo $! > run.pid
if [ $? -eq 0 ]; then
    success
    if [  "$P1" == "-f" ]; then
        echo "#################### tail -f nohup.out #########################"
        tail -f nohup.out
    fi
else
    failed "$msg"
fi

五、总结

本文介绍了java -jar指令的常用参数、运用办法及其发动脚本,帮助您更好地掌握Java可执行JAR文件的运转技巧。经过合理装备这些参数,您能够优化应用程序的功用、内存运用和体系特点,提升应用程序的稳定性和效率。

在实际应用中,您能够依据详细的需求和环境进行参数的调整和装备。了解这些参数的功用和用法,对于开发和部署Java应用程序对错常有帮助的。

希望本文对您有所启示,并能够帮助您更好地了解和运用java -jar指令。如有任何疑问或建议,请在下方留言,咱们将尽快回复。感谢阅读!