如何在java中破坏对象?

2022-08-31 19:44:21

我在一次采访中遇到了这个问题,有以下选择:

如何在java中破坏对象?

a. System.gc();  
b. Runtime.getRuntime.gc();  
c. object.delete();  
d. object.finalize();  
e. Java performs gc by itself, no need to do it manually.
  1. 答案应该是e?

  2. 如果e不在那里呢?然后?显然c不是答案。a 和 b 将为整个应用程序执行 gc(问题需要一个对象)。我认为这是d,因为finize()是在gc之前调用的(但是在finize之后有必要调用gc吗?)或者我错了?e必须在那里回答这个问题?


答案 1

答案E是正确的答案。如果E不存在,您很快就会耗尽内存(或)没有正确答案。

对象应不可访问才有资格获得 GC。JVM 将执行多次扫描并将对象从一代移动到另一代,以确定 GC 的资格,并在对象无法访问时释放内存。


答案 2

为了澄清为什么其他答案不起作用:

  1. System.gc()(以及 ,它执行完全相同的操作)暗示你想要摧毁的东西。隐约。JVM 可以自由地忽略运行 GC 周期的请求,如果它认为不需要一个。另外,除非您已将对象的所有可访问引用清空,否则 GC 无论如何都不会触摸它。所以A和B都被取消了资格。Runtime.getRuntime().gc()

  2. Runtime.getRuntime.gc()是语法不好。 是一个函数,而不是一个变量;您需要在它后面加上括号来调用它。所以B是双重取消资格。getRuntime

  3. Object没有方法。所以C被取消了资格。delete

  4. 虽然确实有方法,但它不会破坏任何东西。只有垃圾回收器才能实际删除对象。(在许多情况下,从技术上讲,他们甚至懒得这样做;他们只是在做其他事情时不复制它,所以它被抛在了后面。所有做的就是在 JVM 丢弃对象之前给它一个清理的机会。更重要的是,你永远不应该直接打电话。(作为受保护的,JVM无论如何都不允许您在任意对象上调用它。所以D被取消了资格。Objectfinalizefinalizefinalizefinalize

  5. 除此之外,还要求正在运行的代码具有对 的引用。仅此一点就使它“活着”,因此没有资格进行垃圾回收。所以C和D是双重取消资格的。object.doAnythingAtAllEvenCommitSuicide()object