Java垃圾回收器 - 什么时候进行垃圾回收?

37 浏览
0 Comments

Java垃圾回收器 - 什么时候进行垃圾回收?

是什么决定了垃圾收集器实际进行收集的时机呢?是在一定时间之后还是在使用了一定量的内存之后?还是有其他因素?

admin 更改状态以发布 2023年5月19日
0
0 Comments
  • 它取决于程序的JIT编译方式。
  • 从外部我们无法确定它何时运行。
  • 它遵循一些算法,这取决于特定的GC。
  • Java虚拟机在客户端机器上运行,如果是Windows系统,则默认为4GB虚拟内存。它还取决于特定时间的可用虚拟内存。

您可以尝试这个小程序以检查GC的行为:

public class GCTest {
   final int NELEMS = 50000;
   void eatMemory() {
      int[] intArray = new int[NELEMS];
      for (int i=0; i

可能的输出 - 在您的情况下可能会有所不同:

free memory before creating array: 4054912
free memory after creating array:  3852496
free memory after running gc():    4064184

请查看此链接http://www.devdaily.com/java/edu/pj/pj010008/

0
0 Comments

当垃圾收集器确定到达运行时间时,它会开始运行。在分代垃圾收集器中,通常的策略是当分配临时内存失败时,运行垃圾收集器。也就是说,每当分配一小块内存时(大块内存通常直接放置在“较老”的代中),系统会检查代0堆中是否有足够的可用空间,如果没有,则运行GC以释放空间,使分配成功。\n然后,旧数据会移动到gen-1堆中,当那里的空间用完时,GC就会在那里运行一次收集,将最长时间存在的数据升级到gen-2堆中,以此类推。因此,GC不只是“运行”。它可能仅在gen-0堆上运行(大多数收集只会这样做),或者只有在需要释放大量内存时,它才会检查每个代。\n但这远非唯一的策略。并发GC在程序运行时在后台运行,进行清理。一些GC可能作为每个内存分配的一部分运行。增量收集器可能会这样做,在每个内存分配时扫描一些对象。\n垃圾收集器的整个意义在于,它应该在不需要任何用户输入的情况下顺利运行。因此,通常情况下,您无法预测垃圾收集器何时运行,也不应该这样做。\n其他JVM当然可以自由选择任何策略。\n编辑:Java和分代GC的上述部分是不真实的。请参阅下面的更多详细信息:\n1.0和1.1虚拟机使用标记-清除收集器,在垃圾收集后可能会导致堆片段化。从Java 1.2开始,虚拟机改用分代收集器,它具有更好的碎片整理行为(请参阅Java理论和实践:垃圾回收和性能)。因此,Java实际上已经拥有分代GC很久了。Java 6中的新内容是可在Java 6u14中使用的Garbage-First垃圾收集器(G1)。根据1.6.0_14版发布的文章:它不是默认启用的。并行收集器仍然是默认GC,是常见家庭使用的最有效GC。G1旨在成为并发收集器的替代方案。它设计成更可预测,具有内存区域设计使其能够快速分配的能力。

0