java: java.lang.OutOfMemoryError: GC overhead limit exceeded java.lang.RuntimeException: java.lang.OutOfMemoryError: GC overhead limit exceeded at com.sun.tools.javac.main.Main.compile(Main.java:559) at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129) at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138) at org.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:239) at org.jetbrains.jps.javac.ExternalJavacProcess.compile(ExternalJavacProcess.java:189) at org.jetbrains.jps.javac.ExternalJavacProcess.access$400(ExternalJavacProcess.java:28) at org.jetbrains.jps.javac.ExternalJavacProcess$CompilationRequestsHandler$1.run(ExternalJavacProcess.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded at java.io.BufferedInputStream.<init>(BufferedInputStream.java:203) at java.io.BufferedInputStream.<init>(BufferedInputStream.java:183) at org.jetbrains.jps.javac.ZipFileObject.openInputStream(ZipFileObject.java:48) at com.sun.tools.javac.api.ClientCodeWrapper$WrappedFileObject.openInputStream(ClientCodeWrapper.java:426) at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:2510) at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:2442) at com.sun.tools.javac.jvm.ClassReader.access$000(ClassReader.java:76) at com.sun.tools.javac.jvm.ClassReader$1.complete(ClassReader.java:240) at com.sun.tools.javac.code.Symbol.complete(Symbol.java:574) at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1037) at com.sun.tools.javac.code.Symbol$ClassSymbol.members(Symbol.java:978) at com.sun.tools.javac.jvm.ClassReader$AnnotationDeproxy.visitEnumAttributeProxy(ClassReader.java:1854) at com.sun.tools.javac.jvm.ClassReader$EnumAttributeProxy.accept(ClassReader.java:1676) at com.sun.tools.javac.jvm.ClassReader$AnnotationDeproxy.deproxy(ClassReader.java:1814) at com.sun.tools.javac.jvm.ClassReader$AnnotationDefaultCompleter.run(ClassReader.java:1918) at com.sun.tools.javac.comp.Annotate.flush(Annotate.java:143) at com.sun.tools.javac.comp.Annotate.enterDone(Annotate.java:129) at com.sun.tools.javac.comp.Enter.complete(Enter.java:512) at com.sun.tools.javac.comp.Enter.main(Enter.java:471) at com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:982) at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.enterTrees(JavacProcessingEnvironment.java:1015) at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.<init>(JavacProcessingEnvironment.java:902) at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.next(JavacProcessingEnvironment.java:921) at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1187) at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170) at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856) at com.sun.tools.javac.main.Main.compile(Main.java:523) at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129) at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138) at org.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:239) at org.jetbrains.jps.javac.ExternalJavacProcess.compile(ExternalJavacProcess.java:189) at org.jetbrains.jps.javac.ExternalJavacProcess.access$400(ExternalJavacProcess.java:28)
时间: 2025-05-28 18:51:24 浏览: 50
### 解决 IDEA 运行 Spring Boot 项目时出现 `GC overhead limit exceeded` OOM 错误的方法
#### 1. **理解 GC Overhead Limit Exceeded 的含义**
当 JVM 花费过多时间进行垃圾回收却只释放少量内存时,就会抛出此异常。默认情况下,如果超过约 98% 的时间用于垃圾回收而仅能恢复不到 2% 的堆空间,则触发该错误[^1]。
#### 2. **调整 IDEA 的 JVM 参数**
增加分配给 IDEA 的最大堆大小以及永久代区域的容量有助于缓解此类问题:
- 找到 IDEA 安装目录下的配置文件(Linux/macOS: `idea.vmoptions`, Windows: `idea64.exe.vmoptions`),编辑并添加以下内容:
```properties
-Xms1024m
-Xmx4096m
-XX:MaxPermSize=512m
-XX:MetaspaceSize=512m
```
#### 3. **修改 Gradle 或 Maven 构建工具的内存设置**
对于基于 Gradle 的项目,可以通过全局或局部方式提高构建进程可用的内存资源:
- 在根路径创建/编辑 `gradle.properties` 文件,加入如下选项:
```properties
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m
```
- 针对具体任务定制化内存需求,在 `build.gradle` 中定义:
```groovy
tasks.withType(JavaCompile) {
options.fork = true
options.incremental = true
options.forkOptions.memoryMaximumSize = '3g'
}
```
#### 4. **禁用 GC Overhead Limit 检测机制**
如果确认程序逻辑无明显泄漏风险且希望暂时绕过这一保护措施,可通过命令行参数抑制警告行为:
- 设置 `-XX:-UseGCOverheadLimit` 开关取消监控阈值限制。
- 示例启动脚本更新为:
```bash
./gradlew bootRun --no-daemon -Dorg.gradle.jvmargs="-Xmx2g -XX:MaxMetaspaceSize=512m -XX:-UseGCOverheadLimit"
```
#### 5. **分析堆转储数据定位潜在瓶颈**
出现 OOM 后通常伴随生成一份 `.hprof` 格式的堆快照文件,借助专门软件剖析其中细节以便采取针对性改进举措:
- 推荐工具有 Eclipse MAT (Memory Analyzer Tool),VisualVM 等。
- 加载对应 hprof 文件后查找占用比例最高的类实例及其关联链路。
---
```python
# Python辅助函数模拟查看系统级线程数上限情况
import os
def check_native_thread_limit():
try:
max_threads = int(os.sysconf('SC_THREAD_THREADS_MAX'))
current_count = len(os.sched_getaffinity(0))
print(f"System supports up to {max_threads} threads; Current CPU cores affinity count is {current_count}.")
except AttributeError as e:
print("Current platform does not support querying native thread limits directly.")
check_native_thread_limit()
```
---
阅读全文
相关推荐



















