关于垃圾收集行为查询

问题描述:

正如我在Sun内存管理白皮书阅读:关于垃圾收集行为查询

When stop-the-world garbage collection is performed, execution of the application is completely 
suspended during the collection 

所以,如果一个请求,而垃圾收集器运行,那么它是如何应用程序处理的情况发生?如果垃圾收集器花费太长时间,应用程序会抛出异常?我没有遇到这样的问题,但想知道这是可能的,并抛出什么异常?

+0

我不认为会有任何异常将被抛出。 – codeMan

+0

但是如果网络操作正在进行,那么确实需要更长时间才会出现某种网络超时。那么如何处理 – DevZer0

这个垃圾回收器不再被使用,并被更好的垃圾回收器取代。

stop-the-world垃圾回收器确实停止了完整的应用程序(所有线程)并清理了堆。

当垃圾收集器花费太长时间(几乎从不发生),则会抛出一个Error

收集器运行时缓冲网络套接字上的流量。

+0

抛出异常?我知道这一点!哪个例外会是@Uwe Plonus – codeMan

+0

如果任何垃圾收集器无法及时执行任务,则会抛出'OutOfMemoryError'。 –

+0

@UwePlonus:如果收集器是一个停止世界的收集器,它不需要多长时间,因为程序已经停止并且没有分配发生,所以您不会收到OutOfMemoryError。如果垃圾收集完成其运行,但无法回收任何可用空间,则可能会发生OutOfMemoryError。 – davmac

所有(几乎)Java垃圾收集器都有某种停止世界阶段,其中所有Java线程都挂起,等待独占系统操作完成。该状态有时被称为安全点

现代垃圾收集器与应用程序线程同时运行,这意味着垃圾收集器与应用程序同时执行其工作。在垃圾收集器进程期间,需要独占访问内存的阶段,应用程序线程进入此状态。

如果垃圾收集器无法恢复足够的内存以满足应用程序的分配需求,则会引发异常。

摆脱停止世界垃圾回收的一种替代方法是使用Azul系统中的C4收集器进行Zing JVM。这种实现具有很低的停顿方式,根本没有停止世界的收藏。相反,它使用的是并行压缩方法,没有停止世界阶段。

+0

线程在安全点之间可以运行多长时间?如果线程X位于安全点之间,并且需要垃圾回收,那么只要X使其到达下一个安全点,就会要求所有其他线程停止运行,无论收集的时间长短如何? – supercat