linux服务器后台运行jar包详解

本文详细介绍了如何在后台运行Java应用程序,包括使用'&'、'nohup'命令进行后台运行,设置日志输出,以及如何通过进程号结束后台运行的程序。适合于需要长期运行Java应用的场景。

1.前台运行jar包指令:

java -jar xxx.jar

这个命令会占用指令窗口,直到退出执行。也就是说只能看到当前运行的输出信息。而无法发送其他指令或者执行其他操作。

退出命令窗口的指令

Ctrl+C

2.让jar包后台运行

"&"结尾:让程序在后台运行。指令窗口不会被锁定,而可以发送其他指令,但是当xshell关闭时,后台运行的程序依然会被停止。

"nohup"前缀:让xshell关闭之后仍然执行jar包。也就是即使退出Xshell,jar仍然保持执行状态。

nohup java -jar xxx.jar &

3.输出日志文件

" > logs.txt" 表示输出日志文件目录。如果不写情况下,就会默认在jar包所在目录,创建nohup.out文件。
如果项目中已经指定了日志输出,就会重复输出,生成两个文件,这时候就不写,然后不会重复创建。

nohup java -jar xxx.jar >logs.txt &

4.关闭后台运行的jar包

查询进程号

ps -ef|grep xxx.jar  //jar包名字查询

或者

netstat -lnp|grep xxx  //端口号查询

通过进程号杀死进程

kill -9 xxx

kee

<think>我们讨论的是在Linux系统中后台启动jar并设置其占用内存大小的方法。用户之前的问题是关于CentOS7.9部署Java8,现在转向如何运行jar并控制内存。 通常,我们使用java命令启动jar,并通过JVM参数来设置内存。后台运行则可以通过nohup或者使用systemd服务来实现。 这里提供两种常见方法: 方法1:使用nohup命令并结合JVM内存参数 方法2:使用systemd服务单元文件配置(适合长期运行的服务) 下面分别说明: 方法1:使用nohup命令 在启动jar时,通过java命令的-Xms和-Xmx参数设置内存。例如: nohup java -Xms512m -Xmx1024m -jar your-application.jar > app.log 2>&1 & 其中: -Xms512m 表示初始堆大小为512MB -Xmx1024m 表示最大堆大小为1024MB nohup命令使进程在用户退出登录后仍继续运行 > app.log 将标准输出重定向到app.log文件 2>&1 将标准错误重定向到标准输出(即也写入app.log) & 表示在后台运行 方法2:使用systemd服务 可以创建一个systemd服务单元文件,这样可以对服务进行更完善的管理(启动、停止、开机自启等)。 步骤: 1. 创建服务文件,比如:/etc/systemd/system/myapp.service 2. 编辑该文件,配置服务。在ExecStart中指定java命令并设置内存参数。 示例服务文件内容: ``` [Unit] Description=My Java Application After=syslog.target network.target [Service] User=appuser Group=appgroup ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar /path/to/your-application.jar SuccessExitStatus=143 Restart=always RestartSec=30 [Install] WantedBy=multi-user.target ``` 注意:需要根据实际情况修改User、Group、jar路径以及内存参数。 保存后执行: systemctl daemon-reload systemctl start myapp systemctl enable myapp # 设置开机自启 方法比较: nohup方式简单快捷,适合临时测试或简单应用。 systemd方式更适合生产环境,可以管理服务状态,并且有完善的日志管理(通过journalctl查看)。 另外,关于JVM内存参数,除了堆内存(-Xms和-Xmx),还可以设置其他内存区域,例如: -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 用于设置元空间(Java8中取代永久代)。 -Xss 设置每个线程的栈大小。 但一般情况下,设置堆内存即可满足基本需求。 注意事项: 1. 设置的内存大小不要超过物理内存,否则可能导致系统使用交换分区(SWAP)而降低性能,甚至被系统OOM Killer杀死。 2. 建议将初始堆(-Xms)和最大堆(-Xmx)设置为相同值,避免堆动态调整带来的性能波动。 3. 如果需要更详细的内存监控,可以开启JMX等管理功能。 下面提供一个完整的使用nohup的示例: 假设jar名为demo.jar,我们要设置初始堆512MB,最大堆1024MB,并后台运行,输出日志到demo.log: nohup java -Xms512m -Xmx1024m -jar demo.jar > demo.log 2>&1 & 检查运行状态: ps -ef | grep java # 查看java进程 tail -f demo.log # 查看日志输出 使用systemd服务的日志查看: journalctl -u myapp -f 现在,我们根据要求生成相关问题。 注意:引用标识需要自然添加,但我们的回答中并没有引用外部资料,因此可以不添加引用标识(或者根据之前用户给的参考资料的习惯,如果有提到过参考资料,可以添加,但这里没有)。另外,我们之前回答过CentOS7.9部署Java8,现在这个问题是独立的,所以不需要强行关联之前的引用。 生成相关问题: </think>### 📚 Linux 系统后台启动 JAR 并设置内存大小的方法 以下是两种常用方法,核心是通过 JVM 参数 `-Xms`(初始内存)和 `-Xmx`(最大内存)控制内存占用: --- ### 方法一:使用 `nohup` 命令(简单快捷) ```bash nohup java -Xms512m -Xmx2048m -jar your-application.jar > app.log 2>&1 & ``` - **参数说明**: - `-Xms512m`:初始堆内存为 512 MB - `-Xmx2048m`:最大堆内存为 2048 MB - `> app.log`:输出重定向到日志文件 - `2>&1`:错误输出合并到标准输出 - `&`:后台运行 - `nohup`:忽略挂断信号,确保 SSH 断开后进程不终止 **验证运行**: ```bash ps -ef | grep java # 查看进程 tail -f app.log # 查看实时日志 ``` --- ### 方法二:使用 Systemd 服务(生产环境推荐) 1. 创建服务文件: ```bash sudo vi /etc/systemd/system/myapp.service ``` 2. 写入配置(关键内存参数): ```ini [Unit] Description=My Java Application After=network.target [Service] User=appuser WorkingDirectory=/opt/myapp ExecStart=/usr/bin/java -Xms1g -Xmx4g -jar application.jar SuccessExitStatus=143 Restart=always RestartSec=30 # 内存限制(可选) MemoryLimit=4G # 系统级内存硬限制 MemorySwapMax=0 # 禁止使用 Swap [Install] WantedBy=multi-user.target ``` 3. 启动服务: ```bash sudo systemctl daemon-reload sudo systemctl start myapp sudo systemctl enable myapp # 开机自启 ``` **关键参数**: - `-Xms1g`:初始堆内存 1 GB - `-Xmx4g`:最大堆内存 4 GB - `MemoryLimit=4G`:cgroups 内存硬限制(防止 OOM 影响系统)[^1] --- ### ️ JVM 内存参数详解 | 参数 | 作用 | 示例值 | 推荐比例 | |------|------|--------|----------| | `-Xms` | 初始堆内存 | `-Xms512m` | 设 `-Xmx` 的 25%~50% | | `-Xmx` | 最大堆内存 | `-Xmx4g` | 不超过物理内存的 80% | | `-XX:MaxMetaspaceSize` | 元空间上限 | `-XX:MaxMetaspaceSize=512m` | 通常 256m~1g | | `-Xss` | 线程栈大小 | `-Xss256k` | 默认 1m,可适当降低 | 内存分配示例: $$ \text{总内存} = \text{堆内存} + \text{元空间} + \text{栈内存} \times \text{线程数} + \text{Direct Buffer} $$ --- ### 💡 最佳实践建议 1. **内存设置原则**: ```bash # 推荐示例(8GB 内存服务器) -Xms2g -Xmx6g -XX:MaxMetaspaceSize=512m ``` 2. **监控工具**: ```bash jstat -gc <pid> 1000 # 每 1 秒监控 GC 状态 jcmd <pid> VM.native_memory # 查看原生内存分布 ``` 3. **OOM 防护**: - 添加 `-XX:+ExitOnOutOfMemoryError` 参数使 JVM 在 OOM 时自动退出 - 配合 `Restart=always` 实现自动恢复[^2] --- ### ❌ 常见问题排查 **问题:内存持续增长超出 `-Xmx` 限制** 原因:堆外内存泄漏(如 Netty Direct Buffer) 解决:添加 JVM 参数 ```bash -XX:MaxDirectMemorySize=1g # 限制 Direct Buffer ``` **问题:频繁 Full GC** 优化方向: ```bash -XX:+UseG1GC -XX:MaxGCPauseMillis=200 # 启用 G1 垃圾回收器 ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值