Java 关于垃圾收集器行为的查询
正如我在Sun内存管理白皮书中所读到的:Java 关于垃圾收集器行为的查询,java,garbage-collection,Java,Garbage Collection,正如我在Sun内存管理白皮书中所读到的: When stop-the-world garbage collection is performed, execution of the application is completely suspended during the collection 因此,如果在垃圾收集器运行时发生请求,那么应用程序将如何处理该请求?如果垃圾收集器花费的时间太长,应用程序是否会引发异常?我没有遇到过这样的问题,但想知道这是否可能以及引发了什么异常?此垃圾收集器不再
When stop-the-world garbage collection is performed, execution of the application is completely
suspended during the collection
因此,如果在垃圾收集器运行时发生请求,那么应用程序将如何处理该请求?如果垃圾收集器花费的时间太长,应用程序是否会引发异常?我没有遇到过这样的问题,但想知道这是否可能以及引发了什么异常?此垃圾收集器不再使用,取而代之的是更好的垃圾收集器 垃圾收集器真正停止了整个应用程序(所有线程)并清理了堆 当垃圾收集器花费的时间太长(这几乎从未发生过)时,就会抛出
错误
网络套接字上的输入流量在收集器运行时被缓冲。所有(几乎)Java垃圾收集器都有某种停止世界阶段,所有Java线程都被挂起,等待独占系统操作完成。这种状态有时被称为安全点
现代垃圾收集器与应用程序线程同时运行,这意味着垃圾收集器与应用程序同时执行其工作。在垃圾收集器过程中,有些阶段需要独占访问内存,应用程序线程会进入此安全点状态
如果垃圾收集器无法恢复足够的内存以满足应用程序的分配需求,则会引发异常
摆脱stop the world垃圾收集的一个替代方法是使用Azul系统的C4收集器来使用Zing JVM。该实现采用了一种低暂停的方法,根本不需要停止world collections。相反,它使用的是一种没有停止世界阶段的并发压缩方法。我认为不会引发任何异常。但是如果网络操作正在进行,则如果需要更长的时间,肯定会出现某种网络超时。那么handledAn异常是如何抛出的呢?我不知道!如果任何垃圾收集器不能及时完成其任务,将抛出OutOfMemoryError
。@Uwe Plonus:如果收集器是停止世界收集器,则不管需要多长时间,您不会得到OutOfMemoryError,因为程序已停止,并且没有进行分配。如果垃圾收集完成运行但无法回收任何可用空间,则可能会出现OutOfMemoryError。@davmac我已经有几个OutOfMemoryError
s不是由耗尽的堆空间引起的,例如,java.lang.OutOfMemoryError:超出了GC开销限制。
如果java 7中的默认垃圾回收器花费太多时间,就会抛出该错误。@UwePlonus我认为我们都有一点错误。如果垃圾收集花费很长时间,但只有当它无法回收足够的空间时,才会出现OutOfMemoryError。例如,当我说如果不能回收任何空间,你就会得到错误。一个线程可以在安全点之间运行多长时间?如果线程X位于安全点之间,并且需要进行垃圾收集,那么是否需要停止所有其他线程,直到X到达下一个安全点为止,而不管垃圾收集需要多长时间?