执行命令模版
nohup java -Dfile.encoding=utf-8 -jar \
--server.port=8080 \
-Xmx200M -Xms200M \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m \
-XX:+UseG1GC \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/heapdump.hprof \
xxx.jar > /data/log.txt 2>&1 &;
为什么要用 nohup
来启动命令。
首先看正常启动 java 应用的方式,是通过java -jar xxx.jar
命令,但是存在一个问题就是退出到命令行后,应用就会被关闭,最为临时调试使用可以,不能保证一直运行。
那通过java -ajr xxx.jar &
呢,这个也不行,虽然退出到命令行后,应用不会退出,但是当关闭终端连接后,应用还是被关闭。
最终版还是需要用到 nohup
命令,可以保证在关闭终端连接后,应用依然能够正常运行。
命令解析
针对 log 日志文件前的>
说明:
取值 | 含义 |
---|---|
0 | stdin 标准输入(一般是键盘) |
1 | stdout 标准输出(一般是显示屏,是用户终端控制台) |
2 | stderr 标准错误(错误信息输出) |
针对> /data/log.txt
说明:/data/log.txt
表示将标准输出输出到指定的文件中,也就相当于 /data/log.txt
。
如果在项目中有将错误日志和标准输出日志分离的需求,可以加上2> error.log
。
但是很多时候都会只用一个标准输出文件,可以将标准错误的日志信息重定向到标准输出文件,也就是将两个文件的内容合并在一个文件中输出,此时可以用2>&1
。
最终形成组合命令就是> /data/log.txt 2>&1
。
其他配置参数:
- 主要就是应用的配置信息和 JVM 的配置信息了。项目打包的时候端口可以在配置文件中指定,也可以通过命令指定;
- 堆内存大小需要进行配置,需要根据项目对内存的需求以及 GC 优化等方面来确定,但是一般
-Xms
和-Xmx
两个值都是相同; - 接下来就是指定元数据区的大小,在 JDK8 之前是永久代,在 JDK8 及以后的版本是元数据区,这个区域可以可以不用设计很大,一般达到 256m 就已经够用了;
- 然后是垃圾回收器,根据实际需求来,如果是普通应用其实使用默认就可以,既然 JVM 将 G1 作为 JDK9 及以后的默认收集器,G1 相对于其他垃圾收集器也是有一定的优势,选它就对了;
- 最后就是 dump 日志,这个可以根据实际需要来配置,方便在出现 OOM 的时候查询错误日志,进行排错。
至于其他的配置参数,比如老年代和年轻代划分的比例、担保机制、期望单次 GC 时间(只针对 G1 垃圾收集器,其他收集器不支持,默认是 200ms,可通过-XX:MaxGCPauseMillis=100ms 配置)等都可以按需来配置。