加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java中垃圾收集器的工作

发布时间:2020-12-15 05:13:14 所属栏目:Java 来源:网络整理
导读:在调用System.gc()时有哪些对象可用于垃圾收集?为什么? public class GCTest { static class A { private String myName; public A(String myName) { this.myName = myName; } } public static void main(String[] args) { A a1 = new A("a1"); A a2 = new
在调用System.gc()时有哪些对象可用于垃圾收集?为什么?

public class GCTest {
    static class A {
        private String myName;
        public A(String myName) {
            this.myName = myName;
        }
    }

    public static void main(String[] args) {
        A a1 = new A("a1");
        A a2 = new A("a2");
        ArrayList list = new ArrayList();
        list.add(a1);
        A[] mas = new A[2];
        mas[0] = a2;
        a2 = a1;
        clear(mas);
        a1 = null;
        a2 = null;
        System.gc();
        // some code
        ...
    }

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

如果object == null它变成了垃圾?

我认为a1,a2和mas在调用System.gc()时可用于垃圾收集,因为它处于null状态.或者我错了?

解决方法

首先,您的程序变量永远不会“可用于垃圾回收”. GC只收集对象,程序变量是对象的引用,而不是对象本身. (引用Java变量的常用术语混淆了这一点.)

其次,a1,a2或mas引用的对象都不会被GC化.尽管事实上a1和a2已被设置为null.这是因为仍然可以通过列表或mas访问对这些对象的引用.为什么即使在调用clear()之后,a2引用的对象仍然可以通过mas访问?因为您无法通过将变量传递给方法clear()来更改main()中变量mas的值.您在该方法中所做的只是更改形式参数(也称为mas),它是与main()中的局部变量分开的变量. Java严格按值传递.然而,当涉及到对象时,总是传递的是一个引用.

通常,规则是只有当对象无法直接或间接地从任何程序变量中访问时,对象才会被GC.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读