java问题1

来源:百度知道 编辑:UC知道 时间:2024/06/07 17:57:48
Which statement is true?
A. Memory is reclaimed by calling Runtime.gc().
B. Objects are not collected if they are accessible from live threads.
C. Objects that have finalize() methods are never garbage collected.
D. Objects that have finalize() methods always have their finalize() methods called before
the program ends.
E. An OutOfMemory error is only thrown if a single block of memory cannot be found
that is large enough for a particular requirement.
请问这道题为什么选B呢?谢谢了!

A. 调用Runtime.gc()方法时内存会被回收。
B. 存活的线程中的对象是不会被回收的。
C. 对象调用finalize()方法绝对不被垃圾回收。
D. 类的finalize()方法总是在程序结束以前被调用。
E. 只有在一块独立的内存区域无法找到的情况下才会抛出内存溢出异常。

A答案,说法不正确,调用Runtime.gc()的时候只能是通知、建议虚拟机调用垃圾回收器来回收已被废弃的对象。
B答案正确。
C答案,显然错误,finalize()方法是用于清除对象(注意我说是清除不是销毁!)的。
D答案,这个答案我不确定,但是程序结束前finalize()方法不是一定被调用的,从这个角度看,D选项的说法是不正确的。
E答案,导致这个错误的原因有很多,例如我们在写程序的过程中有时候会犯一种逻辑错误,程序会无限的申请内存,并且没有可用的内存提供给垃圾回收器,导致Java 虚拟机无法分配一个对象,这时候也会抛出内存错误!