Java求职面试。有多少个对象可以进行垃圾回收?

时间:2013-12-08 18:22:00

标签: java reference garbage-collection

这是一个典型的Java求职面试问题。 System.gc();将垃圾收集多少个对象?

我将在代码中使用以下名称:

  • a1包含对A1
  • 的引用
  • a2包含对A2
  • 的引用
  • mas包含对Mas
  • 的引用
  • list包含对List
  • 的引用

使用过的课程。

package com.mock;

public class GCTest {

    static class A {

        private String myName;

        public A(String myName) {
            this.myName = myName;
        }
    }
}

使用。

package com.mock;

import com.mock.GCTest.A;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        A a1 = new A("a1"); // A ref to A1. 1 ref in all.
        A a2 = new A("a2"); // A ref to A2. 2 refs in all.
        ArrayList<A> list = new ArrayList<A>(); // A ref to the empty ArrayList. 3 refs in all.
        list.add(a1); // The list has a1 holding a ref to A1 
        A[] mas = new A[2]; // A ref to an array; it has nulls in it. 4 refs in all.
        mas[0] = a2; // Now mas holds the ref to A2.
        a2 = a1; // a2 holds the ref to A1 
        clear(mas); // Nothing changed because methods deals with copies of parameters rather than with parameters themselves. 
        a1 = null; // a1 no longer holds the ref to A1
        a2 = null; // a2 no longer holds the ref to A1
        System.gc(); // Nothing should be garbage collected
    }

    private static void clear(A[] mas) {
        mas = null;
    }

}

2 个答案:

答案 0 :(得分:3)

这可能是一个棘手的问题。

System.gc()的作用取决于底层的垃圾收集器。

gc

public static void gc()

Runs the garbage collector.

Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.

The call System.gc() is effectively equivalent to the call:

     Runtime.getRuntime().gc()


See Also:
    Runtime.gc()

你所知道的是:

  • 介于0和“程序中的对象数量”Object之间将被垃圾收集。
  • 非常高的可能性是介于0和“应该被垃圾收集的对象数量”之间。
  • 有一个相对较高的可能性,它将垃圾收集到“应该被垃圾收集的对象的数量”。

答案 1 :(得分:3)

我的回答是0,因为listmas都有包含对A1(列表)和A2(mas)的引用的元素。

我创建了三个图表以简化我的回答。矩形对应于内存中的块;圆圈对应于对象。灰色箭头对应于不再存在的参考。

在a1 = a2之前。

enter image description here

a1 = a2。

之后

enter image description here

a1和a2都没有引用

enter image description here

我可以覆盖课程finilize()的{​​{1}},以了解gabage收集的符合条件

A

虽然我在测试代码时看到了日志,但在调用System.gc()

后,没有100%保证内存已清除
  

运行垃圾收集器。

     

调用gc方法表明Java虚拟机耗费   努力回收未使用的物体以制造记忆   它们目前可用于快速重复使用。当控制返回时   从方法调用中,Java虚拟机已尽最大努力   从所有丢弃的物体中回收空间。