java.lang.OutOfMemoryError: GC overhead limit exceeded原因及解决方法

简介: java.lang.OutOfMemoryError: GC overhead limit exceeded原因及解决方法

java.lang.OutOfMemoryError: GC overhead limit exceeded原因及解决方法



问题复现:11-23日生产推送数据时,发生该错误,没有其他操作.


解释STW:


vm在执行垃圾回收线程时,其他线程都会被迫停止,只有垃圾收集线程执行完毕,其他线程才会恢复,这期间会有很少的等待时间,这个过程就是stw。


错误含义:


该错误表示cpu在98%(默认值)的时间内都在处理jvm的垃圾收集(STW),且堆中回收到的内存仍是低于2%,这时系统就会报GC overhead limit exceeded。


错误分析:


两种情况导致这种情况


一:服务器内存过小,不能支撑jvm的运行

二:为堆设置的内存过小(-Xmx ,-Xms)


找出问题:


生产一台服务器,部署了8个java微服务应用,也就是可以看成8个jvm在运行,虽然相互之间不打扰,但是内存在平时就会占用过高,很容易就会OOM,-Xms512m -Xmx512m -Xss1024k -XX:ParallelGCThreads=2 -Djava.compiler=NONE,这个是jvm配置参数,解释下各个参数意思,-Xmx512m:堆最大使用内存为512M,-Xms512m:堆最小使用内存为512M,-Xss1024k:单个线程的栈空间为1M(虚拟机栈与本地方法栈共用),-XX:ParallelGCThreads=2:垃圾收集线程最大数为2,即使用2个并行线程进行垃圾回收, -Djava.compiler=NONE:这个是禁用JIT(即时编译器)编译器的命令,默认是启动的(禁用JIT,就会使用转译器,转译器更适合debug使用,JIT运行程序会更快)。


解决方案:


①让该错误消失:-XX:-UseGCOverheadLimit,jvm增加这个参数会让GC overhead limit exceeded该错误消失,只会出现Java heap space。这不是根本解决办法,只是不报该错误。因为GC overhead limit exceeded相当于Java heap space他的预警。


②优化堆参数配置:增加-Xmx 与-Xms 两个参数大小。


③增加服务器内存:如果不是内存泄漏可以使用这种情况,内存泄漏只增加内存,只是治标不治本。


相关文章
|
12天前
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
31 4
|
17天前
|
开发工具
java.lang.unsatisfiedlinkerror解决方法
java.lang.unsatisfiedlinkerror解决方法
53 1
|
1月前
|
监控 算法 Java
Java面试题:如何在Java中触发一次Full GC?请详细解释垃圾回收机制和知识
Java面试题:如何在Java中触发一次Full GC?请详细解释垃圾回收机制和知识
124 4
|
1月前
|
Java
idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法
idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法
380 0
|
3天前
|
Oracle Java API
虚拟线程:Java的新利器?
作者通过本文梳理了自己对虚拟线程的理解,顺便捋一捋Java线程的过去、现在和未来。ps:写这篇文章的时候,Java 19刚刚发布,而现在Java 21已经正式GA了,不过虚拟线程的API和底层实现并没有什么变化。
|
4天前
|
Java 程序员 调度
【JAVA 并发秘籍】进程、线程、协程:揭秘并发编程的终极武器!
【8月更文挑战第25天】本文以问答形式深入探讨了并发编程中的核心概念——进程、线程与协程,并详细介绍了它们在Java中的应用。文章不仅解释了每个概念的基本原理及其差异,还提供了实用的示例代码,帮助读者理解如何在Java环境中实现这些并发机制。无论你是希望提高编程技能的专业开发者,还是准备技术面试的求职者,都能从本文获得有价值的见解。
21 1
|
2天前
|
Java 调度 数据库
Java并发编程:深入理解线程池
在Java并发编程的海洋中,线程池是一艘强大的船,它不仅提高了性能,还简化了代码结构。本文将带你潜入线程池的深海,探索其核心组件、工作原理及如何高效利用线程池来优化你的并发应用。
|
1天前
|
Java API
java中线程管理
java中线程管理
6 3
|
2天前
|
监控 安全 Java
Java多线程调试技巧:如何定位和解决线程安全问题
Java多线程调试技巧:如何定位和解决线程安全问题
13 2
|
2天前
|
监控 Java 测试技术
Java并发编程最佳实践:设计高性能的多线程系统
Java并发编程最佳实践:设计高性能的多线程系统
14 1