JVM内存启动问题

 

springboot jar项目什么情况下会宕机
 
Spring Boot Jar 包形式的项目(即通过 java -jar 启动的独立应用)宕机(突然退出或崩溃)的原因多种多样,可能涉及代码缺陷、资源问题、外部环境影响等。以下是常见的宕机场景及具体原因分析:

一、未处理的异常导致进程退出

Java 进程的生命周期依赖于主线程(main 线程)和关键守护线程的存活。若核心线程因未捕获的异常终止,可能导致整个进程退出。
  1. 主线程抛出未捕获异常Spring Boot 的启动入口是 SpringApplication.run(),若启动过程中(如容器初始化、Bean 加载阶段)抛出未捕获的 Exception 或 Error(如 OutOfMemoryErrorNoClassDefFoundError),且未被框架捕获,会直接导致主线程终止,进程退出。例:
    • 配置文件错误(如 @Value 注入的属性不存在且无默认值)导致 IllegalArgumentException
    • 自定义 CommandLineRunner 或 ApplicationRunner 的 run 方法抛出未处理异常。
  2. 非守护线程抛出未捕获异常Java 中,非守护线程(用户线程)的未捕获异常若未被 Thread.UncaughtExceptionHandler 处理,会导致该线程终止;若所有非守护线程都终止,进程会退出。例:
    • 业务线程池中的线程执行任务时抛出 RuntimeException 且未捕获,若线程池核心线程全部异常终止,且无新任务触发线程重建,可能导致进程 “空转” 后退出(视线程池配置而定)。
    • 定时任务(如 @Scheduled)的执行逻辑抛出未处理异常,若框架未配置全局异常处理器,可能导致定时任务线程终止,极端情况下引发进程退出。

二、内存问题导致崩溃

内存不足或内存泄漏是 Java 应用宕机的常见原因,尤其在 Jar 包部署的独立环境中。
  1. OutOfMemoryError(OOM)当 JVM 无法分配足够内存时,会抛出 OutOfMemoryError,若该异常未被捕获(通常无法捕获,因为内存已耗尽),进程会直接崩溃。常见 OOM 场景:
    • 堆内存溢出(Java heap space):对象创建过多且未及时回收(如无限循环创建对象、内存泄漏),堆内存(-Xmx)设置不足。
    • 方法区 / 元空间溢出(Metaspace):动态生成大量类(如 CGLIB 代理、反射频繁生成类),元空间(-XX:MaxMetaspaceSize)设置不足。
    • 栈溢出(StackOverflowError):递归调用过深,栈内存(-Xss)不足,虽不属于 OOM,但会直接导致线程终止,若发生在主线程则进程退出。
  2. 内存泄漏长期运行的应用中,内存泄漏会逐渐耗尽可用内存,最终触发 OOM 导致宕机。例:
    • 静态集合(如 static List)无限添加对象且不清理。
    • 未关闭的资源(如数据库连接、文件流)导致对象无法被 GC 回收。
    • 第三方库(如缓存框架)使用不当,导致内存占用持续增长。

三、资源耗尽导致不可用或崩溃

系统资源(如文件描述符、线程、端口)耗尽会导致应用无法处理新请求,甚至被操作系统强制终止。
  1. 文件描述符(File Descriptor)耗尽每个打开的文件、网络连接(Socket)都会占用文件描述符。若应用频繁创建连接却不释放(如未关闭的数据库连接、HTTP 客户端连接),或系统默认文件描述符上限(ulimit -n)过低,会导致 Too many open files 错误,最终引发 IO 操作失败,甚至进程崩溃。
  2. 线程耗尽若应用无限制创建线程(如每次请求创建新线程),或线程池核心线程 / 最大线程数设置过大,会导致系统线程数超过内核限制(/proc/sys/kernel/threads-max),引发 OutOfMemoryError: unable to create new native thread,最终进程崩溃。
  3. 端口耗尽客户端短连接场景下(如频繁创建 outbound 连接),若本地端口(临时端口,默认范围 32768-60999)被耗尽,会导致新连接无法建立(Address already in use),若核心业务依赖外部服务,可能因无法通信而触发应用自我终止(如健康检查失败)。

四、外部信号或系统干预

进程可能被外部信号强制终止,或因系统资源不足被内核杀死。
  1. 用户 / 脚本发送终止信号
    • kill -9 <pid>:强制终止信号(SIGKILL),进程无法捕获,会立即退出。
    • kill <pid>:默认发送 SIGTERM 信号,若应用未注册信号处理器,会被动退出(Spring Boot 默认不处理 SIGTERM,需自定义 ShutdownHook 优雅关闭,但强制终止仍会宕机)。
  2. 系统 OOM Killer 干预当操作系统内存耗尽时,内核的 OOM Killer 会根据进程的内存占用、优先级等评分(oom_score)选择 “牺牲品” 并杀死,释放内存。Spring Boot 应用若占用内存过高(如频繁 OOM 前的内存暴涨),可能被 OOM Killer 选中,进程会被强制终止(可通过 dmesg | grep -i 'killed process' 查看记录)。
  3. 容器 / 编排工具的健康检查失败在 Docker、K8s 等环境中,若应用健康检查(如 Actuator 的 /health 端点)持续失败,容器会被自动重启或杀死(如 K8s 的 livenessProbe 失败触发重启)。

五、配置错误或依赖冲突

启动阶段的配置错误可能导致应用无法正常启动,或运行中因配置不当引发崩溃。
  1. 启动时配置错误
    • 端口被占用(Address already in use):若 server.port 已被其他进程占用,且未配置 server.port=0(随机端口),应用启动失败后直接退出。
    • 依赖冲突:如不同版本的 Spring 组件、Jackson 等库冲突,导致 NoSuchMethodErrorClassCastException 等,启动时崩溃。
    • 外部服务不可用:若应用启动依赖数据库、Redis 等服务,且未配置重试或容错(如 spring.datasource.continue-on-error=false),连接失败会导致启动终止。
  2. 运行时配置不当
    • 线程池配置不合理:如核心线程数为 0、队列容量为 0,且拒绝策略为 AbortPolicy(默认),高并发下触发 RejectedExecutionException,若未处理可能导致关键任务失败,间接引发应用退出。
    • 超时配置缺失:如数据库连接超时未设置,网络波动时线程长期阻塞,导致线程池耗尽,应用失去响应,最终被监控系统杀死。

六、JVM 或系统级故障

  1. JVM 内部错误(Internal Error)罕见但可能发生,如 JVM 自身 Bug、硬件故障(内存损坏)导致的 Internal Error,会直接触发进程崩溃(通常伴随 hs_err_pid<pid>.log 日志)。
  2. 系统级问题
    • 磁盘满:应用写入日志、临时文件时,若磁盘空间耗尽(No space left on device),可能导致 IO 异常,若核心逻辑依赖文件操作,会引发应用崩溃。
    • 网络中断:分布式应用中,若与注册中心(如 Eureka、Nacos)、配置中心的连接长期中断,且未配置容错机制,可能触发自我保护机制失败后退出。

如何排查宕机原因?

  1. 查看日志:优先检查应用日志(如 application.log)的最后输出,是否有异常堆栈(如 OOM、未处理的 Exception)。
  2. JVM 崩溃日志:若发生 JVM 内部错误或 OOM,会生成 hs_err_pid<pid>.log,记录崩溃时的内存、线程状态。
  3. 系统日志:通过 dmesg/var/log/messages 查看是否被 OOM Killer 杀死,或系统资源不足的记录。
  4. 监控指标:结合 Prometheus、Grafana 等工具,查看宕机前的内存、CPU、线程数、文件描述符等指标是否异常。
总结:Spring Boot Jar 项目宕机通常是 “代码缺陷 + 资源限制 + 环境因素” 共同作用的结果,需从异常处理、资源配置、依赖管理、监控告警等多方面预防。

---------------------------------------------------------------------------------------

springboot jar 启动命令 java -jar
 
java -jar 是启动 Spring Boot JAR 包最基础的命令,通过它可以直接运行打包好的 Spring Boot 应用。

1. 基础启动命令

这是最常用的方式,直接执行 JAR 文件,使用应用默认的配置。
bash
 
 
java -jar your-project-name.jar
 
  • your-project-name.jar 需替换为实际的 JAR 文件名,例如 demo-0.0.1-SNAPSHOT.jar
  • 启动后,控制台会输出应用日志,关闭控制台会直接停止应用。

2. 进阶启动配置

在实际场景中,常需要结合配置文件、JVM 参数或后台运行等需求,以下是常见用法。

(1)指定配置文件

当需要使用非默认配置文件(如 application-dev.ymlapplication-test.properties)时,通过 --spring.profiles.active 指定环境。
bash
 
 
# 使用 dev 环境的配置文件
java -jar your-project-name.jar --spring.profiles.active=dev

# 也可直接指定外部配置文件路径(适用于配置文件不在 JAR 内的场景)
java -jar your-project-name.jar --spring.config.location=/path/to/application.yml
 

(2)设置 JVM 参数

用于调整内存大小、日志输出格式等 JVM 级别的配置,参数需放在 -jar 前面。
bash
 
 
# 设置初始堆内存 512M,最大堆内存 1024M
java -Xms512m -Xmx1024m -jar your-project-name.jar

# 同时指定 JVM 参数和环境配置
java -Xms512m -Xmx1024m -jar your-project-name.jar --spring.profiles.active=prod
 

(3)后台运行(避免控制台关闭后应用停止)

不同操作系统的后台运行命令不同,核心是让进程脱离控制台。
  • Linux/macOS:使用 nohup 和 &,日志默认输出到 nohup.out
    bash
     
     
    nohup java -jar your-project-name.jar --spring.profiles.active=prod &
    
     
     
  • Windows:可使用 start /b 后台运行,或创建批处理脚本。
    cmd
     
     
    start /b java -jar your-project-name.jar --spring.profiles.active=prod
    
     
     

3. 常见问题与解决

  • 问题 1:端口被占用
     
    报错信息通常为 Address already in use,可通过 --server.port 临时指定端口。
    bash
     
     
    java -jar your-project-name.jar --server.port=8081
    
     
     
  • 问题 2:找不到主类
     
    一般是 JAR 包打包不完整,需检查 pom.xml 中是否引入 Spring Boot 打包插件,确保打包正确。
    xml
     
     
    <build>
      <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
      </plugins>
    </build>
    
     
     

要不要我帮你整理一份 Spring Boot JAR 启动命令速查表?里面会包含基础、进阶用法及常见问题解决,方便你日常开发和部署时快速查阅。
 
java -jar 指定内存等参数
 
在使用 java -jar 启动 Spring Boot 应用时,JVM 内存参数(如堆内存、元空间等)需要放在 -jar 前面(JVM 参数必须位于命令主体前),用于指定 JVM 的资源分配策略。以下是常见的内存参数及配置方式:

一、核心内存参数(必知)

1. 堆内存设置(最常用)

  • -Xms:初始堆内存大小(JVM 启动时分配的内存)
  • -Xmx:最大堆内存大小(JVM 运行中允许使用的最大内存)
通常建议将两者设置为相同值(避免 JVM 频繁动态调整堆大小,减少性能损耗)。
单位:k(千字节)、m(兆字节)、g(千兆字节),不写单位默认字节。
bash
 
 
# 示例:初始堆 512M,最大堆 1024M
java -Xms512m -Xmx1024m -jar your-project.jar
 

2. 新生代 / 老年代设置(进阶)

堆内存分为 新生代(Young Generation,存放新创建的对象)和 老年代(Old Generation,存放长期存活的对象),可通过以下参数调整比例:
  • -Xmn:新生代内存大小(建议为堆内存的 1/3 ~ 1/4)
  • -XX:NewRatio:新生代与老年代的比例(默认 2,表示老年代:新生代 = 2:1)
bash
 
 
# 示例:堆内存 1024M,新生代 256M(老年代则为 768M)
java -Xms1024m -Xmx1024m -Xmn256m -jar your-project.jar

# 示例:通过 NewRatio 设置老年代:新生代 = 3:1(堆内存 1024M 时,新生代 256M,老年代 768M)
java -Xms1024m -Xmx1024m -XX:NewRatio=3 -jar your-project.jar
 

3. 元空间(Metaspace)设置(Java 8+)

元空间用于存储类信息、方法元数据等(替代 Java 7 及之前的 “永久代”),默认大小受系统内存限制,若类过多可能导致 OOM,需手动指定:
  • -XX:MetaspaceSize:元空间初始大小(触发 GC 的阈值)
  • -XX:MaxMetaspaceSize:元空间最大大小
bash
 
 
# 示例:元空间初始 128M,最大 256M
java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -jar your-project.jar
 

二、组合配置示例

实际部署中常需同时设置堆内存、元空间,并结合应用环境配置(如指定 prod 环境),示例:
bash
 
 
# 完整示例:堆内存 2G(初始=最大),新生代 512M,元空间最大 512M,使用 prod 环境配置
java -Xms2g -Xmx2g -Xmn512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -jar your-project.jar --spring.profiles.active=prod
 

三、验证参数是否生效

启动后,可通过 jinfo 命令查看当前应用的 JVM 参数(需知道进程 ID):
  1. 先查进程 ID(Linux 用 ps -ef | grep java,Windows 用 tasklist | findstr java
  2. 执行 jinfo <进程ID>,在输出中搜索设置的参数(如 XmsXmx)。
例如:
bash
 
 
# 查进程 ID
ps -ef | grep your-project.jar

# 假设进程 ID 是 12345,查看参数
jinfo 12345 | grep -E "Xms|Xmx|Metaspace"
 

四、注意事项

  1. 参数顺序:JVM 参数(如 -Xms)必须放在 -jar 前面,否则不生效;应用参数(如 --spring.profiles.active)放在 -jar 后面。
  2. 内存上限:最大堆内存(Xmx)不应超过服务器物理内存的 70%(避免与其他进程抢占资源)。
  3. 版本差异:Java 8 及以上用 Metaspace 参数,Java 7 及以下用 PermSize(永久代)参数(如 -XX:PermSize=128m -XX:MaxPermSize=256m)。
如果需要针对特定场景(如高并发、大数据处理)优化 JVM 参数,可以告诉我你的应用特点,我会提供更具体的配置建议~
 
java -jar 机器内存等参数有哪些
 
在使用 java -jar 启动应用时,与 “机器内存” 相关的参数主要是 JVM 内存分配参数(用于控制 JVM 对系统内存的使用),包括堆内存、非堆内存、直接内存等。这些参数决定了 JVM 如何从机器物理内存中分配资源,直接影响应用的性能和稳定性。

一、核心内存参数(按内存区域分类)

1. 堆内存参数(JVM 管理的主要内存区域,存放对象实例)

堆内存是 JVM 中最大的内存区域,所有对象实例都在这里分配,也是垃圾回收的主要区域。
参数作用说明示例
-Xms 初始堆内存大小(JVM 启动时分配的内存) -Xms512m(初始 512MB)
-Xmx 最大堆内存大小(JVM 运行中允许使用的最大堆内存) -Xmx2g(最大 2GB)
-Xmn 新生代内存大小(堆内存中 “新生代” 的固定大小,剩余为老年代) -Xmn1g(新生代 1GB)
-XX:NewRatio 老年代与新生代的比例(默认 2,即老年代:新生代 = 2:1) -XX:NewRatio=3(3:1)
-XX:SurvivorRatio 新生代中 Eden 区与 Survivor 区的比例(默认 8,即 Eden:Survivor=8:1:1) -XX:SurvivorRatio=10(10:1:1)

2. 非堆内存参数(存放类信息、方法元数据等,不参与垃圾回收)

非堆内存独立于堆内存,主要用于存储类结构、常量池、方法元数据等,Java 8+ 用 “元空间” 替代了早期的 “永久代”。
参数作用说明(Java 8+)示例
-XX:MetaspaceSize 元空间初始大小(触发首次 GC 的阈值) -XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize 元空间最大大小(默认无上限,受系统内存限制,建议手动指定避免 OOM) -XX:MaxMetaspaceSize=256m
Java 7 及以下版本(使用 “永久代”):
参数作用说明示例
-XX:PermSize 永久代初始大小 -XX:PermSize=64m
-XX:MaxPermSize 永久代最大大小 -XX:MaxPermSize=128m

3. 直接内存参数(堆外内存,用于 NIO 操作)

直接内存(Direct Memory)不属于 JVM 堆内存,由操作系统直接管理,主要用于 NIO 的 DirectByteBuffer 操作(如网络 IO、文件 IO),避免堆内存与操作系统之间的数据拷贝,提升性能。
参数作用说明示例
-XX:MaxDirectMemorySize 最大直接内存大小(默认与堆内存最大值 -Xmx 一致,建议手动指定) -XX:MaxDirectMemorySize=512m

4. 内存调试与监控参数(辅助排查内存问题)

参数作用说明示例
-XX:+HeapDumpOnOutOfMemoryError 发生堆内存溢出(OOM)时,自动生成堆转储文件(.hprof) 需配合 -XX:HeapDumpPath 使用
-XX:HeapDumpPath 指定堆转储文件的保存路径 -XX:HeapDumpPath=/logs/heapdump.hprof
-verbose:gc 输出 GC 详细日志(包括内存回收情况) 无额外值,直接添加参数
-XX:+PrintGCDetails 打印更详细的 GC 日志(包括各内存区域大小、回收时间等) 无额外值,直接添加参数

二、完整配置示例(结合机器内存)

假设服务器物理内存为 8GB,部署一个 Spring Boot 应用,建议配置如下(避免占用过多内存影响其他进程):
bash
 
 
# 堆内存:初始 2G,最大 4G(不超过物理内存的 50%)
# 新生代:1G(堆内存的 1/4 ~ 1/3)
# 元空间:最大 512M(根据类数量调整)
# 直接内存:最大 1G(若应用大量使用 NIO,可适当增加)
# 开启 OOM 时自动 dump 堆日志
java -Xms2g -Xmx4g -Xmn1g \
     -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
     -XX:MaxDirectMemorySize=1g \
     -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof \
     -jar your-project.jar --spring.profiles.active=prod
 

三、注意事项(结合机器内存配置)

  1. 堆内存上限:-Xmx 建议不超过服务器物理内存的 70%(例如 8GB 内存,-Xmx 不超过 5~6GB),避免与其他进程(如数据库、缓存)抢占内存导致系统卡顿。
  2. 初始与最大堆一致:-Xms 与 -Xmx 设为相同值,避免 JVM 运行中动态调整堆大小(会触发额外 GC,影响性能)。
  3. 元空间与直接内存:若应用依赖大量第三方库(类数量多),需调大 MaxMetaspaceSize;若频繁使用 NIO(如 Netty、文件上传),需调大 MaxDirectMemorySize
  4. 监控与调整:通过 jstat(监控 GC 情况)、jmap(查看内存分布)或可视化工具(JConsole、VisualVM)观察内存使用,逐步优化参数。
如果需要根据具体应用场景(如微服务、大数据处理、高并发接口)优化参数,可以告诉我你的应用特点,我会提供更针对性的配置建议~
 
java -jar -XX 配置超过机器的内存 能起来服务么
 
当 java -jar 配置的 JVM 内存参数(如 -Xmx-XX:MaxMetaspaceSize 等)超过机器的实际可用内存时,服务可能启动失败,也可能启动成功但运行中崩溃,具体取决于操作系统的内存管理机制和实际内存压力。

一、可能的结果及原因

1. 启动直接失败(最常见)

如果 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 初始内存),如果系统无法满足,直接启动失败。

2. 启动成功,但运行中崩溃或卡顿

如果配置的内存超过物理内存,但 未超过物理内存 + 虚拟内存(swap)的总和,服务可能启动成功,但会面临严重问题:
  • 频繁卡顿 / 性能暴跌:当 JVM 实际使用的内存超过物理内存时,操作系统会将部分内存数据写入磁盘(swap 分区),而磁盘 IO 速度远低于内存,导致应用响应极慢。
  • 运行中 OOM 崩溃:即使启动时内存足够,若运行中内存需求持续增长(如大量对象创建),超过系统实际能提供的内存(物理 + swap),会触发 OutOfMemoryError 导致进程崩溃。
  • 被操作系统杀死:Linux 有 OOM Killer 机制,当系统内存耗尽时,会优先杀死 “内存占用高且优先级低” 的进程(如 JVM 进程),直接导致服务中断。

二、关键影响因素

  1. 操作系统虚拟内存(swap):若机器配置了 swap 分区(Linux)或页面文件(Windows),系统会将部分磁盘空间作为 “虚拟内存” 临时替代物理内存。若 JVM 配置的内存 ≤ 物理内存 + swap,可能启动成功,但性能会受严重影响。
  2. JVM 内存参数的 “实际使用” 特性:
    • -Xmx 是 “最大堆内存”,启动时 JVM 不会立即占用全部,而是按需增长(但会预留地址空间)。
    • 若配置的 -Xmx 很大,但应用实际运行中内存需求较小(远低于物理内存),可能暂时正常运行(但仍有风险)。
  3. 操作系统内存分配策略: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:

 

posted @ 2025-10-29 16:21  hanease  阅读(8)  评论(0)    收藏  举报