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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |