SpringBoot2.x基础篇:Linux后台运行Jar以及Jvm参数调优

简介: 我们将编写的应用程序打包为`Jar`可执行文件后,如果在`Linux`服务器环境下,可直接使用`java -jar xxx.jar`命令运行应用程序,不过当我们关闭命令窗口后`启动中`的应用程序也会停止,那我们需要通过什么方式才可以成为后台服务方式运行呢?

我们将编写的应用程序打包为Jar可执行文件后,如果在Linux服务器环境下,可直接使用java -jar xxx.jar命令运行应用程序,不过当我们关闭命令窗口后启动中的应用程序也会停止,那我们需要通过什么方式才可以成为后台服务方式运行呢?

推荐阅读

Nohup命令

Linux系统或者OS X都提供了一个解决应用程序后台运行的命令,那就是nohup,我们使用该命令可以直接将要执行的任务放置在后台运行,想要停止运行时需要通过结束pid的方式,使用方式如下所示:

➜  developing-first-application git:(2.x) ✗ nohup java -jar target/service-application-0.0.1-SNAPSHOT.jar &
[1] 2349
appending output to nohup.out

我们通过以上的命令执行后可以看到控制台输出了本次运行程序的PID2349,我们可以使用kill命令杀死这个PID,从而达到了结束进程的效果。

注意事项: appending output to nohup.out这句话很有必要了解下,要知道我们之前通过 java -jar xxx.jar直接运行应用程序时会有运行日志输出到控制台的,我们通过 nohup方式运行时我们貌似并没有发现日志的输出,日志去了哪里呢?

运行日志

当你看到appending output to nohup.out这句话在控制台打印时,应该可以猜测到了,日志的内容已经输出到了名为nohup.out的文件内,该文件所处的位置就是我们运行nohup命令的同级目录注意:不是jar文件的目录),我们可以通过tail -1000f nohup.out命令查看运行日志内容,如下所示:

➜  developing-first-application git:(2.x) ✗ tail -1000f nohup.out 

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.4.RELEASE)
 ...
 2020-02-21 14:31:42.614  INFO 2349 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-02-21 14:31:42.617  INFO 2349 --- [           main] o.m.c.d.f.a.DevelopingFirstApplication   : Started DevelopingFirstApplication in 1.437 seconds (JVM running for 1.75)
通过 nohup执行的命令所产生的日志都会输出到默认 nohup.out文件内。

指定日志文件

在同一台服务器上、同一个目录下可能会存在多个需要运行的Jar文件,为了区分每个应用程序的日志输出,这时我们就需要指定日志输出的文件名,如下所示:

➜  developing-first-application git:(2.x) ✗ nohup java -jar target/service-application-0.0.1-SNAPSHOT.jar &> service-application-0.0.1.log & 
[1] 2579

这时我们在nohup命令执行的同级目录下就可以看到创建了一个名为service-application-0.0.1.log的日志文件。

建议:日志文件的名称格式: Service ID + Service Version,相同 ServiceID的服务可能存在部署不同版本的情况。

JVM Server模式

JVM内有一个模式的概念,开发环境中一般使用的是client模式,不过生产服务器上一般都是使用server模式,我们要怎么选择呢?

推荐开发环境使用client模式,因为它启动快,可以提高一部分开发效率,节省每一次项目启动的时间,而生产环境则是推荐使用server模式,内部使用了代号为C2重量级编译器,这样虽然导致应用程序启动时间有所提高,不过编译的比较彻底,服务在运行期间相对于client性能高一些。

设置使用server模式也比较简单,我们只需要执行java -server命令即可,如下所示:

➜  developing-first-application git:(2.x) ✗ nohup java -server -jar target/service-application-0.0.1-SNAPSHOT.jar &> service-application-0.0.1.log &
[1] 2707

初始内存(-Xms)

JVMclient模式下运行,默认Xms大小为1M,而在server模式下默认Xms大小为128M,可以根据实际情况进行修改分配,如下所示:

➜  developing-first-application git:(2.x) ✗ nohup java -server -Xms256M -jar target/service-application-0.0.1-SNAPSHOT.jar &> service-application-0.0.1.log &
[1] 2846

通过-Xms256M,修改初始化分配的内存为256M

最大内存(-Xmx)

JVMclient模式下运行,默认Xmx大小为64M,而在server模式下默认Xmx大小为1024M,可以根据实际情况进行修改分配,如下所示:

➜  developing-first-application git:(2.x) ✗ nohup java -server -Xms256M -Xmx2048M -jar target/service-application-0.0.1-SNAPSHOT.jar &> service-application-0.0.1.log &
[1] 2340

通过-Xmx2048M,修改最大分配内存为2048M

JVM调优脚本

JVM的调优尤为最重,服务器的配置有限,可使用的资源我们则是要珍惜,做出最大的贡献!!!

为了每次部署服务的便利性,我把启动服务的命令进行了封装,并命名为boot-jar.sh,内容如下所示:

#!/bin/bash
# author 恒宇少年 - 于起宇
# http://blog.minbox.org
nohup java -server -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms256m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar "$1" > "$1.log" 2>&1 &
tail -1000f "$1.log"
使用 touch boot-jar.sh创建启动脚本,创建完成后将上面内容复制到脚本内,并通过 chmod u+x boot-jar.sh命令修改权限为可执行文件。

boot-jar.sh脚本使用如下:

➜  developing-first-application git:(2.x) ✗ ./boot-jar.sh target/service-application-0.0.1-SNAPSHOT.jar

由于脚本内添加了tail命令,应用程序启动后会自动输出运行日志。

建议: boot-jar.sh应用程序启动脚本位置尽量放在与 Jar同级目录下。
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
安全 Java 持续交付
如何实现上传jar直接部署成功,这篇文章直接带你上手springboot实现jar包热更新!
本文详细讲解了在Spring Boot应用中实现Jar包热更新的实践方法。通过自定义类加载器(`HotClassLoader`),动态加载和卸载指定目录下的Jar包,结合Spring Bean动态注册机制,使新加载的类能够被Spring容器管理。同时,提供了文件上传接口,方便用户手动触发Jar包更新。文章还强调了安全性、依赖管理和线程安全等注意事项,并给出了测试步骤和总结,帮助开发者高效实现热更新功能,减少服务中断和提升开发效率。
|
消息中间件 运维 监控
加一个JVM参数,让系统可用率从95%提高到99.995%
本文针对一个高并发(10W+ QPS)、低延迟(毫秒级返回)的系统因内存索引切换导致的不稳定问题,深入分析并优化了JVM参数配置。通过定位问题根源为GC压力大,尝试了多种优化手段:调整MaxTenuringThreshold、InitialTenuringThreshold、AlwaysTenure等参数让索引尽早晋升到老年代;探索PretenureSizeThreshold和G1HeapRegionSize实现索引直接分配到老年代;加速索引复制过程以及升级至JDK11使用ZGC。
850 82
加一个JVM参数,让系统可用率从95%提高到99.995%
|
Linux 网络安全 Python
linux后台运行命令screen的使用
linux后台运行命令screen的使用
1415 2
linux后台运行命令screen的使用
|
Java 应用服务中间件 Spring
为什么SpringBoot的 jar 可以直接运行?
SpringBoot的 jar 可以直接运行的原因
1152 2
|
安全 Linux
Slax Linux如何获取增强的会话管理与启动参数选项
以上就是关于在Slax Linux中获取增强的会话管理与启动参数选项的全过程。虽然在这个过程中可能会遇到暗礁和风浪,但只要我们用心驾驶,总能找到前行的道路。在旅程中,记得享受这中间的点点滴滴,因为这些都是你成长的痕迹。祝你在这片“数码海洋”中一帆风顺!
241 26
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
356 18
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
1130 37
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
1864 3