首页 > 试题广场 >

下面哪些描述是正确的:( ) public ...

[不定项选择题]
下面哪些描述是正确的:(  )
public class Test {
    public static class A {
        private B ref;
        public void setB(B b) {
            ref = b;
        }
    }
    public static Class B {
        private A ref;
        public void setA(A a) {
            ref = a;
        }
    }
    public static void main(String args[]) {
    …
        start();
    ….
    }
    public static void start() { A a = new A();
        B b = new B();
        a.setB(b);
        b = null; //
        a = null;
    …
    }
}

  • b = null执行后b可以被垃圾回收
  • a = null执行后b可以被垃圾回收
  • a = null执行后a可以被垃圾回收
  • a,b必须在整个程序结束后才能被垃圾回收
  • 类A和类B在设计上有循环引用,会导致内存泄露
  • a, b 必须在start方法执行完毕才能被垃圾回收
发表于 2020-04-08 16:56:33 回复(39)

b = null 时,B对象还被A对象引用着,不能别回收。
a  = null 时,b在之前已经为空,A对象可以被回收,此时,B对象不被引用了也可以被回收了
发表于 2020-03-09 13:24:50 回复(2)
答案BC。
内存如下:
a -> "a(b)"
b -> "b"
a引用指向一块空间,这块空间里面包含着b对象
b引用指向一块空间,这块空间是b对象
A选项,b = null执行后b可以被垃圾回收。这里"b可以被垃圾回收"中的b指的是引用b指向的内存。这块内存即使不被引用b指向,还是被引用a指向着,不会被回收。
B选项,a = null执行后b可以被垃圾回收。从代码中可以看到,a = null是在b = null后执行的,该行执行后,引用a和b都没有指向对象,对象会被回收。
C选项,同理。
发表于 2019-07-07 14:34:34 回复(6)
深堆和浅堆的问题 
深堆:自己的和引用别的对象
浅堆:只有自己的

这个题:互相引用 
如果使用计数器法来看 肯定是不能够回收的
现在虚拟机内部使用的是可达性分析 
a.set(b) a包含b的引用 深堆全部释放 a b全部被回收

发表于 2019-07-13 12:57:48 回复(0)
D:a,b必须在整个程序结束后才能被垃圾回收
只要通过可达性分析得出a,b不存在外部引用,则对其进行回收,可能是以下几种场景
1.在程序代码中显示的调用gc
2.新生代空间不足,触发minnor(忘记怎么拼写了)gc.
3.新生代空间不足,老年代不允内存担保或者担保失败概率超过50%进行一次full gc
所以,不一定非要程序运行结束才会触发gc,可以简单的理解为,gc是随时都有可能发生的(不严谨)。

E:类A和类B在设计上有循环引用,会导致内存泄露
没错,A,B设计上是存在循环引用,但是对于我们的HotSpot虚拟机来是,并没有采用引用计数法(上述场景会出现内存泄漏),而是采用可达性分析法,通过枚举gc root进行可达性分析,规避掉了循环引用带来的内存泄漏。

F:a, b 必须在start方法执行完毕才能被垃圾回收
同D gc的时机可程序的执行逻辑有关,但是不挂钩。


发表于 2020-07-26 15:11:38 回复(0)
这题不严谨啊, 什么叫a, b被回收?
a, b是本地变量, 所在方法执行完出栈后才能被回收
a,b所指向的A,B类对象存在堆上, b==null但是a.setB(b)使得B类对象任然被引用着, 所以不能回收;
a==null, A,B类对象根据可达性分析法就不存在于根引用链上, 所以被回收
发表于 2020-03-07 15:19:50 回复(0)
e选项,本人拙见,我认为是有循环引用,如果是引用计数算法的话会造成内存泄露。可jvm采用的是可达性分析算法,可以解决循环引用的问题,不会造成内存泄露
发表于 2022-05-14 20:01:45 回复(0)
发表于 2021-07-23 16:42:22 回复(0)
a = null执行后,a没有被引用了,b虽然被a引用着,但由于a没被引用,所以a和b是不可达的,可以被回收
发表于 2019-11-08 16:23:59 回复(0)
给牛客点建议啊,建议把代码规范一下,这看起来太费劲了😔
发表于 2020-03-14 16:04:56 回复(2)
如果在null之前加个b.setA(a),会是什么结果?
发表于 2019-10-22 17:54:48 回复(5)
本题存在两个会造成误解的点:
1、本题难度应该标识为中等,否则想多了反而造成误解。
2、因为jvm垃圾回收是不确定的,所以答案表述“可以被回收”会让人理解成“可以马上回收”,这个明显就有问题了,所以应该改成“可以在合适的时候被回收”
发表于 2021-08-01 16:29:07 回复(0)
发表于 2021-01-25 16:07:52 回复(0)
F也是错的,如果在start()方法中 a=null 后面添加一个while死循环,a和b就不能被回收了?如果实现一个线程里面有个while(true){}意思是说在只要线程不执行结束,线程执行过程中产生的对象都无法被回收了?
发表于 2019-09-12 10:34:00 回复(0)
如果a,b在本方法后续流程中变量槽没有没占用,那么在方法执行结束前,会一直被当作gc root,所以只有方法执行完毕才能被垃圾回收
发表于 2021-02-21 08:42:40 回复(1)
我怕不是学了个注水的java,一脸迷茫🙄
发表于 2020-08-09 19:47:41 回复(0)
E选项?有人解释的么
发表于 2020-04-19 11:43:56 回复(0)
格式能别反人类吗???
发表于 2020-02-13 22:38:40 回复(0)
我也选了F,我想了想,确实F不需要等待程序结束之后才回收,因为a = null之后,你已经没办法再找回这个a对象了。。除非编写类的时候增加了finalize()方法,自救。
发表于 2019-12-16 13:34:57 回复(0)
谁能解释一下D E F
发表于 2019-10-22 10:41:11 回复(1)