Java垃圾收集行为

Java垃圾收集行为,java,android,memory-leaks,garbage-collection,Java,Android,Memory Leaks,Garbage Collection,Android设备上的垃圾收集器是否只收集孤立的对象,并且认为这些对象太大,还是收集所有孤立的对象,而不管其大小 我正在做一个测试,在这个测试中,我快速地将一个活动推上推下堆栈几次,然后查看堆 如果所讨论的活动不包含任何代码,那么即使在强制执行GC之后,它的几个实例也会显示在堆转储中 但是,如果我向这个活动添加一个大变量,比如一个大字节数组,那么GC的行为似乎符合预期。最终它会收集所有内容,而不管大小。垃圾收集器在变得可用于收集后收集的内容是特定于实现的,不应依赖它。垃圾收集器不注意它们收集的对

Android设备上的垃圾收集器是否只收集孤立的对象,并且认为这些对象太大,还是收集所有孤立的对象,而不管其大小

我正在做一个测试,在这个测试中,我快速地将一个活动推上推下堆栈几次,然后查看堆

如果所讨论的活动不包含任何代码,那么即使在强制执行GC之后,它的几个实例也会显示在堆转储中


但是,如果我向这个活动添加一个大变量,比如一个大字节数组,那么GC的行为似乎符合预期。

最终它会收集所有内容,而不管大小。垃圾收集器在变得可用于收集后收集的内容是特定于实现的,不应依赖它。

垃圾收集器不注意它们收集的对象的大小。他们不分青红皂白。如果GC检测到某个对象不可访问,它将收集该对象

你可能观察到的是一种不同的效果。典型的垃圾收集器仅在JVM确定有足够的垃圾值得收集时运行。问题是集合的工作负载有两部分:

  • 查找无法访问的对象
  • 收集无法访问的对象
  • 在典型的现代收集器中,查找不可访问对象涉及遍历和标记所有可访问对象:不可访问对象是未标记的对象。然后,收集不可到达的对象通常是通过移动所有可到达的对象来完成的

    这意味着GC完成的工作与非垃圾量成比例。因此,如果垃圾与非垃圾的比率较高,GC将最有效地工作。最简单的度量是当堆已满或接近满时

    因此,您可能看到的是,较大对象的分配会导致堆更快地填满,并触发GC运行。当对象很小时,堆不会被填满,GC也不会运行

    至于“强制”GC,调用
    System.GC()
    的行为是高度特定于平台的。在一些平台上,它将触发一个完整的GC,在其他平台上,它将完全不做任何事情。。。以及介于两者之间的各个点