当Java堆用完时,故障模式的实际步骤是什么?

当Java堆用完时,故障模式的实际步骤是什么?,java,service,jmx,Java,Service,Jmx,我知道这比“你达到100%的使用率,服务就会下降”更复杂。我知道,当您接近100%的使用率时,垃圾收集开始更积极地运行,例如,当您接近这一点时,您会看到GC和CPU使用率的上升 但是当它继续运行时会发生什么呢?它会越来越剧烈地跳动直到我耗尽CPU吗?开始挂断电话?还是最终100%命中并完全崩溃 有没有什么好办法可以知道我离悬崖边缘有多近 这实际上取决于您的应用程序和运行的虚拟机(例如Oracle JVM、IBM JVM、OpenJDK JVM等)。在Oracle虚拟机上,在虚拟机退出之前,您可能

我知道这比“你达到100%的使用率,服务就会下降”更复杂。我知道,当您接近100%的使用率时,垃圾收集开始更积极地运行,例如,当您接近这一点时,您会看到GC和CPU使用率的上升

但是当它继续运行时会发生什么呢?它会越来越剧烈地跳动直到我耗尽CPU吗?开始挂断电话?还是最终100%命中并完全崩溃


有没有什么好办法可以知道我离悬崖边缘有多近

这实际上取决于您的应用程序和运行的虚拟机(例如Oracle JVM、IBM JVM、OpenJDK JVM等)。在Oracle虚拟机上,在虚拟机退出之前,您可能会看到以下一项或多项:

  • 频繁的GC周期会使VM的CPU使用率非常高
  • 当所有其他JVM线程被阻塞时,VM仅使用1个CPU以100%的速度长时间运行GC周期。这可能发生在使用CMS收集器时,它需要运行“停止世界”GC来压缩旧一代
  • GC完成后无法分配内存的一个或多个线程将抛出OutOfMemoryError。接下来会发生什么取决于应用程序,也就是说,如果这些线程是在应用程序中执行任何有用操作的唯一线程,并且这些线程没有捕获异常或在它们死亡后没有重新启动,那么JVM可能会继续运行,但应用程序将停止响应或停止进展
  • 如果GC消耗大量CPU时间,并且在每次收集后仅恢复少量内存,则JVM可能会抛出OutOfMemoryError,并显示消息“超出GC开销限制”,请参阅
  • 如果您的应用程序使用软/弱引用缓存数据,那么您可能会看到系统资源上的负载增加,因为您的应用程序无法使用缓存的数据,并且必须通过计算或从磁盘或其他外部服务加载来重新缓存的数据
  • 如果应用程序已打开套接字,则GC暂停可能会导致操作系统缓冲区填满,从而迫使操作系统丢弃数据包。连接另一端的网络客户端/服务器可能会断开连接,因为您的应用程序已成为一个缓慢的消费者,或者因为它错过了太多的心跳或应用程序超时
通过启用详细的GC日志记录(请参阅)和/或通过JMX,您可以监视应用程序内存使用情况以及GC正在做什么


您还可以使用JVM API访问JMX发布的数据,请参见

当数据达到100%时,您将得到一个
OutOfMemoryError
。您可以尝试
Runtime.getRuntime().freemory()