# springboot-oom **Repository Path**: MacJackson/springboot-oom ## Basic Information - **Project Name**: springboot-oom - **Description**: 这是一个用于学习和演示各种内存溢出(OutOfMemoryError)场景的Spring Boot项目。通过模拟不同类型的OOM情况,帮助开发者理解内存管理和OOM排查技巧。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-17 - **Last Updated**: 2025-09-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot OOM模拟器 这是一个用于学习和演示各种内存溢出(OutOfMemoryError)场景的Spring Boot项目。通过模拟不同类型的OOM情况,帮助开发者理解内存管理和OOM排查技巧。 ## ⚠️ 重要警告 **本项目仅用于学习和测试目的,请勿在生产环境中使用!** - 这些API会故意导致应用程序崩溃 - 建议在隔离的开发或测试环境中运行 - 某些操作可能需要重启应用程序才能完全恢复 ## 🚀 快速开始 ### 环境要求 - Java 17+ - Maven 3.6+ - 至少2GB可用内存 ### 运行项目 1. 克隆或下载项目 2. 在项目根目录执行: ```bash mvn spring-boot:run ``` 3. 应用启动后访问:http://localhost:8080 ### JVM参数建议 为了更好地观察OOM现象,建议使用以下JVM参数: ```bash # 基础参数 java -Xms512m -Xmx1g -XX:MaxMetaspaceSize=128m -Xss256k -jar oom-simulator.jar # 详细GC日志 java -Xms512m -Xmx1g -XX:MaxMetaspaceSize=128m -Xss256k \ -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps \ -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dumps/ \ -jar oom-simulator.jar ``` 参数说明: - `-Xms512m`: 初始堆内存512MB - `-Xmx1g`: 最大堆内存1GB - `-XX:MaxMetaspaceSize=128m`: 限制元空间大小为128MB - `-Xss256k`: 每个线程栈大小256KB - `-XX:+HeapDumpOnOutOfMemoryError`: OOM时自动生成堆转储文件 ## 📚 功能特性 ### 1. 堆内存OOM模拟 - **快速堆OOM**: 快速消耗堆内存 - **慢速堆OOM**: 逐步消耗堆内存,便于观察 - **自定义参数**: 可调整对象大小、批次和延迟 ### 2. 元空间OOM模拟 - **动态类生成**: 使用ASM动态生成大量类 - **快速/慢速模式**: 不同速度的元空间消耗 ### 3. 栈溢出模拟 - **简单递归**: 基础的无限递归 - **带参数递归**: 每个栈帧消耗更多内存 - **相互递归**: 方法间相互调用 ### 4. 内存监控 - **实时监控**: 每30秒记录内存使用情况 - **自动GC建议**: 内存使用率高时自动建议垃圾回收 - **详细日志**: 分类记录不同类型的日志 ## 🔧 API接口 ### 获取帮助信息 ``` GET /api/oom/help ``` ### 查看内存状态 ``` GET /api/oom/status ``` ### 堆内存OOM ``` POST /api/oom/heap/fast # 快速堆OOM POST /api/oom/heap/slow # 慢速堆OOM POST /api/oom/heap/custom?objectSize=1048576&batchSize=100&delayMs=10 # 自定义参数 ``` ### 元空间OOM ``` POST /api/oom/metaspace/fast # 快速元空间OOM POST /api/oom/metaspace/slow # 慢速元空间OOM ``` ### 栈溢出 ``` POST /api/oom/stack/simple # 简单递归栈溢出 POST /api/oom/stack/parameters # 带参数栈溢出 POST /api/oom/stack/mutual # 相互递归栈溢出 ``` ### 清理内存 ``` POST /api/oom/cleanup # 清理内存泄漏 ``` ## 📊 监控和日志 ### 日志文件 项目会在 `logs/` 目录下生成以下日志文件: - `oom-simulator.log`: 主要应用日志 - `oom-simulator-error.log`: 错误日志 - `memory-monitor.log`: 内存监控日志 - `oom-simulator-details.log`: OOM模拟器详细日志 ### Actuator端点 项目启用了Spring Boot Actuator,可以通过以下端点监控应用: - `/actuator/health`: 健康检查 - `/actuator/metrics`: 应用指标 - `/actuator/metrics/jvm.memory.used`: JVM内存使用情况 - `/actuator/metrics/jvm.gc.memory.allocated`: GC内存分配情况 ## 🧪 测试场景 ### 场景1:观察堆内存OOM 1. 启动应用 2. 调用 `GET /api/oom/status` 查看初始内存状态 3. 调用 `POST /api/oom/heap/slow` 启动慢速堆OOM 4. 持续调用 `/api/oom/status` 观察内存增长 5. 观察应用崩溃和日志输出 ### 场景2:元空间OOM测试 1. 使用限制元空间的JVM参数启动:`-XX:MaxMetaspaceSize=128m` 2. 调用 `POST /api/oom/metaspace/slow` 3. 观察类生成过程和元空间使用情况 4. 等待元空间OOM发生 ### 场景3:栈溢出测试 1. 使用较小栈大小启动:`-Xss256k` 2. 调用 `POST /api/oom/stack/simple` 3. 观察递归深度和栈溢出 ### 场景4:内存监控 1. 启动应用后观察控制台输出 2. 查看 `logs/memory-monitor.log` 文件 3. 触发任意OOM场景,观察监控日志的变化 ## 🔍 OOM排查技巧 ### 1. 堆内存OOM排查 - 使用 `-XX:+HeapDumpOnOutOfMemoryError` 生成堆转储 - 使用MAT、VisualVM等工具分析堆转储文件 - 查找内存泄漏的对象和引用链 ### 2. 元空间OOM排查 - 检查是否有类加载器泄漏 - 使用 `-XX:+TraceClassLoading` 跟踪类加载 - 分析动态生成的类是否过多 ### 3. 栈溢出排查 - 检查递归调用的终止条件 - 使用 `-Xss` 调整栈大小 - 分析调用栈深度 ### 4. 常用JVM参数 ```bash # 内存设置 -Xms # 初始堆大小 -Xmx # 最大堆大小 -XX:MaxMetaspaceSize= # 最大元空间大小 -Xss # 栈大小 # GC日志 -XX:+PrintGC # 打印GC信息 -XX:+PrintGCDetails # 打印详细GC信息 -XX:+PrintGCTimeStamps # 打印GC时间戳 # OOM处理 -XX:+HeapDumpOnOutOfMemoryError # OOM时生成堆转储 -XX:HeapDumpPath= # 堆转储文件路径 -XX:OnOutOfMemoryError= # OOM时执行的命令 ``` ## 📁 项目结构 ``` src/ ├── main/ │ ├── java/com/example/oom/ │ │ ├── OomSimulatorApplication.java # 主应用类 │ │ ├── controller/ │ │ │ └── OomController.java # REST API控制器 │ │ ├── simulator/ │ │ │ ├── HeapOomSimulator.java # 堆内存OOM模拟器 │ │ │ ├── MetaspaceOomSimulator.java # 元空间OOM模拟器 │ │ │ └── StackOverflowSimulator.java # 栈溢出模拟器 │ │ └── config/ │ │ └── MemoryMonitorConfig.java # 内存监控配置 │ └── resources/ │ ├── application.yml # 应用配置 │ └── logback-spring.xml # 日志配置 └── test/ # 测试代码 ``` ## 🤝 贡献 欢迎提交Issue和Pull Request来改进这个项目! ## 📄 许可证 本项目采用MIT许可证。 --- **再次提醒:本项目仅用于学习目的,请勿在生产环境中使用!**