有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓 Java垃圾收集行为

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

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    最终,它收集所有东西,不管大小。它在变得可省略后收集的内容是特定于实现的,不应依赖

  2. # 2 楼答案

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

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

    1. 寻找无法到达的对象
    2. 收集无法到达的对象

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

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

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

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