---------------------------------------------------------------------------------------
springboot jar 启动命令 java -jar
java -jar 是启动 Spring Boot JAR 包最基础的命令,通过它可以直接运行打包好的 Spring Boot 应用。
这是最常用的方式,直接执行 JAR 文件,使用应用默认的配置。
java -jar your-project-name.jar
your-project-name.jar 需替换为实际的 JAR 文件名,例如 demo-0.0.1-SNAPSHOT.jar。
- 启动后,控制台会输出应用日志,关闭控制台会直接停止应用。
在实际场景中,常需要结合配置文件、JVM 参数或后台运行等需求,以下是常见用法。
当需要使用非默认配置文件(如 application-dev.yml、application-test.properties)时,通过 --spring.profiles.active 指定环境。
用于调整内存大小、日志输出格式等 JVM 级别的配置,参数需放在 -jar 前面。
不同操作系统的后台运行命令不同,核心是让进程脱离控制台。
- Linux/macOS:使用
nohup 和 &,日志默认输出到 nohup.out。
nohup java -jar your-project-name.jar --spring.profiles.active=prod &
- Windows:可使用
start /b 后台运行,或创建批处理脚本。
start /b java -jar your-project-name.jar --spring.profiles.active=prod
- 问题 1:端口被占用
报错信息通常为 Address already in use,可通过 --server.port 临时指定端口。
java -jar your-project-name.jar --server.port=8081
- 问题 2:找不到主类
一般是 JAR 包打包不完整,需检查 pom.xml 中是否引入 Spring Boot 打包插件,确保打包正确。
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
要不要我帮你整理一份 Spring Boot JAR 启动命令速查表?里面会包含基础、进阶用法及常见问题解决,方便你日常开发和部署时快速查阅。
在使用 java -jar 启动 Spring Boot 应用时,JVM 内存参数(如堆内存、元空间等)需要放在 -jar 前面(JVM 参数必须位于命令主体前),用于指定 JVM 的资源分配策略。以下是常见的内存参数及配置方式:
-Xms:初始堆内存大小(JVM 启动时分配的内存)
-Xmx:最大堆内存大小(JVM 运行中允许使用的最大内存)
通常建议将两者设置为相同值(避免 JVM 频繁动态调整堆大小,减少性能损耗)。
单位:k(千字节)、m(兆字节)、g(千兆字节),不写单位默认字节。
堆内存分为 新生代(Young Generation,存放新创建的对象)和 老年代(Old Generation,存放长期存活的对象),可通过以下参数调整比例:
-Xmn:新生代内存大小(建议为堆内存的 1/3 ~ 1/4)
-XX:NewRatio:新生代与老年代的比例(默认 2,表示老年代:新生代 = 2:1)
元空间用于存储类信息、方法元数据等(替代 Java 7 及之前的 “永久代”),默认大小受系统内存限制,若类过多可能导致 OOM,需手动指定:
-XX:MetaspaceSize:元空间初始大小(触发 GC 的阈值)
-XX:MaxMetaspaceSize:元空间最大大小
实际部署中常需同时设置堆内存、元空间,并结合应用环境配置(如指定 prod 环境),示例:
启动后,可通过 jinfo 命令查看当前应用的 JVM 参数(需知道进程 ID):
- 先查进程 ID(Linux 用
ps -ef | grep java,Windows 用 tasklist | findstr java)
- 执行
jinfo <进程ID>,在输出中搜索设置的参数(如 Xms、Xmx)。
例如:
- 参数顺序:JVM 参数(如
-Xms)必须放在 -jar 前面,否则不生效;应用参数(如 --spring.profiles.active)放在 -jar 后面。
- 内存上限:最大堆内存(
Xmx)不应超过服务器物理内存的 70%(避免与其他进程抢占资源)。
- 版本差异:Java 8 及以上用
Metaspace 参数,Java 7 及以下用 PermSize(永久代)参数(如 -XX:PermSize=128m -XX:MaxPermSize=256m)。
如果需要针对特定场景(如高并发、大数据处理)优化 JVM 参数,可以告诉我你的应用特点,我会提供更具体的配置建议~
在使用 java -jar 启动应用时,与 “机器内存” 相关的参数主要是 JVM 内存分配参数(用于控制 JVM 对系统内存的使用),包括堆内存、非堆内存、直接内存等。这些参数决定了 JVM 如何从机器物理内存中分配资源,直接影响应用的性能和稳定性。
堆内存是 JVM 中最大的内存区域,所有对象实例都在这里分配,也是垃圾回收的主要区域。
非堆内存独立于堆内存,主要用于存储类结构、常量池、方法元数据等,Java 8+ 用 “元空间” 替代了早期的 “永久代”。
Java 7 及以下版本(使用 “永久代”):
直接内存(Direct Memory)不属于 JVM 堆内存,由操作系统直接管理,主要用于 NIO 的 DirectByteBuffer 操作(如网络 IO、文件 IO),避免堆内存与操作系统之间的数据拷贝,提升性能。
假设服务器物理内存为 8GB,部署一个 Spring Boot 应用,建议配置如下(避免占用过多内存影响其他进程):
- 堆内存上限:
-Xmx 建议不超过服务器物理内存的 70%(例如 8GB 内存,-Xmx 不超过 5~6GB),避免与其他进程(如数据库、缓存)抢占内存导致系统卡顿。
- 初始与最大堆一致:
-Xms 与 -Xmx 设为相同值,避免 JVM 运行中动态调整堆大小(会触发额外 GC,影响性能)。
- 元空间与直接内存:若应用依赖大量第三方库(类数量多),需调大
MaxMetaspaceSize;若频繁使用 NIO(如 Netty、文件上传),需调大 MaxDirectMemorySize。
- 监控与调整:通过
jstat(监控 GC 情况)、jmap(查看内存分布)或可视化工具(JConsole、VisualVM)观察内存使用,逐步优化参数。
如果需要根据具体应用场景(如微服务、大数据处理、高并发接口)优化参数,可以告诉我你的应用特点,我会提供更针对性的配置建议~
java -jar -XX 配置超过机器的内存 能起来服务么
当 java -jar 配置的 JVM 内存参数(如 -Xmx、-XX:MaxMetaspaceSize 等)超过机器的实际可用内存时,服务可能启动失败,也可能启动成功但运行中崩溃,具体取决于操作系统的内存管理机制和实际内存压力。
如果 JVM 配置的总内存(堆内存 + 元空间 + 直接内存等)超过了机器物理内存 + 虚拟内存(swap)的总和,操作系统会拒绝为 JVM 分配足够的内存,导致启动失败,通常会报类似以下错误:
- JVM 层面:
Error occurred during initialization of VM Could not reserve enough space for object heap(无法预留足够的堆内存)。
- 操作系统层面:Linux 可能报
out of memory,Windows 可能提示 “内存不足”。
原因:JVM 启动时会尝试向操作系统申请配置的内存(尤其是 -Xms 初始内存),如果系统无法满足,直接启动失败。
如果配置的内存超过物理内存,但 未超过物理内存 + 虚拟内存(swap)的总和,服务可能启动成功,但会面临严重问题:
- 频繁卡顿 / 性能暴跌:当 JVM 实际使用的内存超过物理内存时,操作系统会将部分内存数据写入磁盘(swap 分区),而磁盘 IO 速度远低于内存,导致应用响应极慢。
- 运行中 OOM 崩溃:即使启动时内存足够,若运行中内存需求持续增长(如大量对象创建),超过系统实际能提供的内存(物理 + swap),会触发
OutOfMemoryError 导致进程崩溃。
- 被操作系统杀死:Linux 有 OOM Killer 机制,当系统内存耗尽时,会优先杀死 “内存占用高且优先级低” 的进程(如 JVM 进程),直接导致服务中断。
-
操作系统虚拟内存(swap):若机器配置了 swap 分区(Linux)或页面文件(Windows),系统会将部分磁盘空间作为 “虚拟内存” 临时替代物理内存。若 JVM 配置的内存 ≤ 物理内存 + swap,可能启动成功,但性能会受严重影响。
-
JVM 内存参数的 “实际使用” 特性:
-Xmx 是 “最大堆内存”,启动时 JVM 不会立即占用全部,而是按需增长(但会预留地址空间)。
- 若配置的
-Xmx 很大,但应用实际运行中内存需求较小(远低于物理内存),可能暂时正常运行(但仍有风险)。
-
操作系统内存分配策略:Linux 有 “内存过度分配(overcommit)” 机制,默认允许进程申请超过实际可用的内存(假设进程不会真的用完),但实际使用时若内存不足,会触发 OOM Killer 杀进程。
- 若配置的内存 > 物理内存 + swap 总和:启动失败,无法分配内存。
- 若配置的内存 ≤ 物理内存 + swap 总和:可能启动成功,但运行中会因频繁 swap 导致性能崩溃,或被系统杀死。
最佳实践:JVM 总内存配置(堆 + 非堆 + 直接内存)应 ≤ 机器物理内存的 70%(避免占用过多内存影响其他进程),且绝不能超过物理内存 + swap 的总和。如果需要调整内存参数,建议先通过 free -m(Linux)或 “任务管理器”(Windows)查看机器实际可用内存。
---------------------------------------------------------------------------------------
java -Xms512m -Xmx4096m -jar demo-0.0.1-SNAPSHOT.jar --server.port=8081
java -Xms512m -Xmx4096m -jar demo-0.0.1-SNAPSHOT.jar --server.port=8082
java -Xms4g -Xmx4g -Xmn1g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:MaxDirectMemorySize=4g \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof \
-jar demo-0.0.1-SNAPSHOT.jar --server.port=8081
java -Xms4g -Xmx4g -Xmn1g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:MaxDirectMemorySize=4g \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof \
-jar demo-0.0.1-SNAPSHOT.jar --server.port=8082
java -Xms4g -Xmx4g -Xmn1g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:MaxDirectMemorySize=4g \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof \
-jar demo-0.0.1-SNAPSHOT.jar --server.port=8083
java -Xms4g -Xmx4g -Xmn1g \
-XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=2048m \
-XX:MaxDirectMemorySize=4g \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof \
-jar demo-0.0.1-SNAPSHOT.jar --server.port=8084
java -Xms20g -Xmx20g -Xmn20g \
-XX:MetaspaceSize=20480m -XX:MaxMetaspaceSize=20480m \
-XX:MaxDirectMemorySize=20g \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof \
-jar demo-0.0.1-SNAPSHOT.jar --server.port=8091
---------------------------------------------------------------------------------------
java -Xms20g -Xmx20g -Xmn20g \
> -XX:MetaspaceSize=20480m -XX:MaxMetaspaceSize=20480m \
> -XX:MaxDirectMemorySize=20g \
> -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof \
> -jar demo-0.0.1-SNAPSHOT.jar --server.port=8091
OpenJDK 64-Bit Server VM warning: MaxNewSize (20971520k) is equal to or greater than the entire heap (20971520k). A new max generation size of 20971008k will be used.
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000002c0080000, 21474312192, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 21474312192 bytes for committing reserved memory.
# An error report file with more information is saved as: