我知道有很多关于java垃圾收集的文章但是在搜索之后我不知道“什么时候在java应用程序中运行垃圾收集?(当应用程序重启或者它仍在运行时) )“即可。
答案 0 :(得分:4)
Garbage Collector
是一个dameon主题。一个dameon线程在应用程序后面运行。它由JVM启动。该
当所有非dameon线程停止时,线程停止。
JVM控制垃圾收集器;它决定何时运行垃圾收集器。 JVM运行
当垃圾收集器意识到内存不足时。 GC的行为可以
通过将参数传递给JVM
进行调整。
可以请求垃圾收集发生 在java程序中,但无法保证此请求将由此处理 jvm.Check How to force garbage collection in Java?
答案 1 :(得分:2)
垃圾收集定期与程序一起运行。它是JVM的一部分。
什么时候运行呢?那么,这是不可预测的,依赖于版本的,应该被视为可以随时运行。
当变量超出范围时,应用程序会告诉JVM它完成了那段内存。然后,当垃圾收集器运行时,它将释放这些资源供操作系统使用。
例如
String capitalizeAll(String s) {
char[] chars = s.toCharArray();
for(int i = 0; i < chars.length; i++)
chars[i] -= 32;
return new String(chars);
}
方法一返回,方法中分配的char[] chars
就会超出范围。该程序告诉JVM它完成了这些资源,下次GC运行时它们将被释放。
有趣的是,JVM会考虑应用程序告诉它已准备好收集的程度。这意味着如果您的应用程序执行了大量不必要的复制或装箱操作,JVM将经常运行并导致您的应用受到性能影响。
答案 2 :(得分:0)
这主要是针对具体实现的。
最原始类型的垃圾收集器,串行GC将在分配期间找不到足够的可用空间时触发(使用世代GC这通常意味着年轻一代已满)。然后它通过触发mutator线程上的安全点来挂起整个JVM,并在单个线程上执行它,这被称为“停止世界暂停” 在这种情况下,您可以说GC可以由任何分配引起。
除此之外,一些GC还可以同时为mutator进行后台工作,例如Hotspot's CMS。但它仍然需要停止世界暂停一些工作,它们往往比串行GC更短。 对于CMS,它仍然由分配触发,但也在后台线程上完成一些工作。
Azul Zing的concurrent compacting collector也正如其名称所说的那样,或多或少地一直在专用线程上进行收集。它仍然需要来自mutator线程的合作,但是没有STW暂停。 所以这个案例可以说GC一直在后台运行,并且在前台做了一些工作。
还有其他收藏家,所以这不是一个全面的概述。但总的来说,它是一个实现细节,可能会发生变化而不是人们应该依赖的东西。一些GC甚至默认忽略System.gc(),因为它会破坏他们的启发式。
答案 3 :(得分:0)
这是来自Kathy Sierra和Bert Bates&#39; SCJP学习指南:
&#34;垃圾收集器在JVM的控制之下。 JVM决定何时执行 运行垃圾收集器。在Java程序中,您可以向JVM询问 运行垃圾收集器,但在任何情况下都无法保证JVM符合要求。留给自己的设备,JVM通常会在感知到内存不足时运行垃圾收集器。经验表明,当您的Java程序发出垃圾回收请求时,JVM通常会在短时间内批准您的请求,但是没有保证。当您认为可以依赖它时,JVM将决定忽略您的请求。&#34;