我正在面试,面试官问是否有可能在Java中杀死GC。对于另一个问题,如果应用程序有效,他的回答是肯定的。我说不重建JDK就无法做到这一点,或者更确切地说,我建立了一些猜测,但是为了让应用程序工作,我不知道该怎么做。面试官说可以和需要什么google一下,我在google上没找到类似的,请告诉我。
我正在面试,面试官问是否有可能在Java中杀死GC。对于另一个问题,如果应用程序有效,他的回答是肯定的。我说不重建JDK就无法做到这一点,或者更确切地说,我建立了一些猜测,但是为了让应用程序工作,我不知道该怎么做。面试官说可以和需要什么google一下,我在google上没找到类似的,请告诉我。
不。你不能从代码中杀死 GC。面试官希望得到这样的回应:
GC 无法停止。它从内存所剩无几时开始。开始工作时,它将内存从被遗忘的(无法访问的,没有引用的对象)中释放出来。GC 在低优先级守护线程上运行。您唯一能做的就是通过调用 System.gc() 要求它进行垃圾收集,但您无法阻止它。
ps 虽然可以,但可以使用开发大师 System.exit() 的一个秘密命令;
资源
这是我唯一能找到的。
恕我直言:当内存不足时,GC 会打开。如果程序没有用完所有的内存,那么它就不会开始工作,你可以说它死了,但事实并非如此。如果他们都以未知的方式杀死了他,那么您将通过 OutOfMemoryError 知道这一点,并且应用程序将停止
按照@ViacheslavVedenin的想法,如果在 finalize 中,GC 会发生什么
@ViacheslavVedenin自己在码头上写道,我决定进行实验。并且没有区别。
正常操作日志
登录 c
Thread.currentThread().stop();完成登录自
while(true);登录 c
throw new RuntimeException();完成老实说,我并没有注意到太大的区别,所以我认为在为 finalize 创建新线程时 GC 并不真正关心它,也不遵循它。完成后,对象将被删除。线程结束的原因并不困扰他,既然它已经结束,那么它已经做了它可以做的一切。
我还将添加@Suvtruf同志的答案,以便它们更加引人注目:
有可能(虽然不是杀死,而是强制抛出 OutOfMemory 并停止垃圾收集,而应用程序将能够继续工作),这是一个示例:
这里发生了什么?根据规范,收集器必须
finalize在删除对象之前执行,因为无限循环finalize,它将无法删除对象并开始抛出 OutOfMemoryError(但是,您可以只使用永恒的对象引用)。在这种情况下,无法创建新对象,但您可以继续使用旧对象和堆栈(参见 catch (OutOfMemoryError e) 中的代码)。包括重用已经存在的对象,例如,将新数据存储在旧对象中(您甚至可以编写自己的 new 和 delete 类似物,使用字节数组作为数据存储和“序列化”对象)。一段时间后,我们关闭终结器中的无限循环,然后像往常一样进行垃圾收集和对象创建。