作为一种常用的开发语言,Java经常使用可执行的JAR(Java Archive)文件来打包和分发应用程序。使用java -jar命令运行JAR文件是一种方便快捷的方式。本文将详细介绍java -jar命令的各种参数,帮助您充分利用这个功能。
一、简介
java -jar命令用于运行可执行的JAR文件。它会自动查找JAR文件中的清单文件(MANIFEST.MF),并根据清单文件中的Main-Class属性指定的主类来启动应用程序。
二、常用参数详解
以下是一些常用的java -jar命令的参数,让我们逐一了解它们的功能和用法。
containers:
- env:
- name: PARAMS
value: -jar /opt/app.jar --spring.profiles.active=test12 --spring.cloud.consul.host=192.168.12.121 --spring.cloud.consul.port=32000 --spring.cloud.consul.discovery.acl-token=8dc1eb67-1f5f-4e10-ad9d-5e58b047647c
- name: JAVA_OPTS
value: '-Xmx1024m -Xms1024m'
image: reg.hrfax.cn/zjboc-eshare/5201-datafusion:6bf93625
-Xmn
是 JVM(Java 虚拟机)的一个启动参数,用于设置年轻代(Young Generation)
的大小。
年轻代
是 JVM 堆内存
中的一部分,主要存放新创建的对象
。
具体来说,-Xmn 参数允许你指定年轻代的大小。例如,如果你运行 JVM 时使用 -Xmn256m,那么年轻代的大小将被设置为 256 兆字节。JVM 会尝试在启动时根据这个值来分配年轻代的空间。
调整年轻代的大小可以影响应用程序的性能,因为年轻代的大小会直接影响垃圾回收的频率和持续时间。如果年轻代设置得太小,可能会导致频繁的 Minor GC(年轻代垃圾回收),这会影响应用程序的响应时间。如果年轻代设置得太大,可能会减少 Minor GC 的频率,但会增加每次 GC 的持续时间,这同样可能对性能产生负面影响。
因此,调整 -Xmn 参数需要根据具体的应用程序和性能需求来进行。通常,你需要通过性能监控和分析工具来观察垃圾回收的行为,并根据实际情况来调整年轻代的大小。
需要注意的是,-Xmn 参数的具体行为可能因不同的 JVM 实现和版本而有所差异。
总结
-Xmn设置太小,垃圾桶太小了,频繁垃圾回收,要倒垃圾。
频繁垃圾回收,影响你的程序响应时间。
-Xmn设置太大,MD,垃圾桶太大了,回收一次垃圾,倒这个垃圾桶,老费劲了,倒一次时间可长了。垃圾回收持续时间太长,也是有负面影响。总之,这是一个权衡,MD。
- -Xmx:指定Java堆的最大内存大小。例如-Xmx512m表示将最大堆内存设置为512MB。通过调整堆内存大小,可以优化应用程序的性能和内存使用情况。
- -Xms:指定Java堆的初始内存大小。例如,-Xms256m表示将初始堆内存设置为256MB。这个参数可以帮助您在启动应用程序时控制初始内存分配的大小。
- -Xss:指定线程栈的大小。例如,-Xss1m表示将线程栈大小设置为1MB。线程栈用于存储线程的局部变量和方法调用信息。通过调整线程栈的大小,可以控制应用程序的并发性能和内存使用情况。
- -XX:MetaspaceSize=256m参数,您可以指定元空间的初始大小为256MB。这意味着在应用程序启动时,虚拟机会预分配256MB的内存用于存储类的元数据。
- -XX:MaxMetaspaceSize=:指定元空间的最大大小。元空间用于存储类的元数据信息。例如,-XX:MaxMetaspaceSize=256m表示将元空间的最大大小设置为256MB。适当设置元空间的大小可以避免类加载和元数据溢出的问题。
- -D=:设置系统属性。例如,-Djava.library.path=/path/to/libs设置java.library.path系统属性为/path/to/libs。您可以使用这个参数来配置应用程序的一些属性,例如文件路径、日志级别等。
- -verbose:class:打印类加载信息。使用这个参数可以了解应用程序在运行过程中加载的类的详细信息,包括类的名称、来源等。
- -verbose:gc:打印垃圾回收信息。通过使用这个参数,您可以了解应用程序的垃圾回收情况,包括垃圾回收器的使用情况、回收的对象数量等。
- -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 --server.port=8000 > 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