如何在java中销毁一个对象?

nr5*_*nr5 42 java garbage-collection finalize

我在接受以下选项的采访中遇到了这个问题:

如何在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.
Run Code Online (Sandbox Code Playgroud)
  1. 答案应该是e?

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

kos*_*osa 54

答案E是正确答案.如果E不存在,您很快就会耗尽内存(或)无正确答案.

无法访问对象以符合GC条件.JVM将执行多次扫描并将对象从一代移动到另一代,以确定GC的合格性,并在无法访问对象时释放内存.

  • 这仍然不是100%正确,对象可以在应用程序的整个时间内生存,即使它们"无法访问",与内存压力的删除没有那么多.JVM不会尝试维护最大可用空间,这会浪费资源. (7认同)

cHa*_*Hao 31

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

  1. System.gc()(以及Runtime.getRuntime().gc()完全相同的事情)暗示你想要破坏东西.依稀.如果JVM没有看到需要,那么JVM可以自由地忽略运行GC循环的请求.另外,除非您已经清除了对象的所有可访问引用,否则GC无论如何都不会触及它.所以A和B都被取消资格.

  2. Runtime.getRuntime.gc()语法不好.getRuntime是一个函数,而不是一个变量; 你需要用括号来调用它.因此B被双重取消资格.

  3. Objectdelete办法.所以C被取消资格.

  4. 虽然Object 的确有一个finalize方法,它不会破坏任何东西. 只有垃圾收集器才能实际删除对象. (在很多情况下,他们在技术上甚至懒得做那个,他们只是不复制它,当他们这样做的人,所以它被抛在后面.)所有finalize做的就是给一个对象的机会来清理之前的JVM丢弃它.更重要的是,你永远不应该finalize直接打电话.(由于finalize受到保护,JVM不会让你在任意对象上调用它.)所以D被取消资格.

  5. 除此之外,还object.doAnythingAtAllEvenCommitSuicide()要求运行代码引用object.仅这一点使它"活着",因此没有资格进行垃圾收集.因此C和D被双重取消资格.

  • 应该有一种编程语言,这样的宝石应该是合法的声明 - > object.doAnythingAtAllEvenCommitSuicide() (3认同)

小智 17

简答 - E

答案是E其余的明显错误,但..

答案很长 - 不是那么简单; 这取决于 ...

简单的事实是,垃圾收集器可能永远不会决定对每个对象进行垃圾收集,这是一个可行的收集候选对象,除非内存压力非常高.然而事实上,Java 与其他任何语言一样容易受到内存泄漏的影响,它们更难以引起,因此当你导致它们时更难找到它们!

以下文章有许多关于内存管理如何工作和不起作用的详细信息,以及由什么引起的内容.分代垃圾收集器如何工作感谢内存(了解JVM如何在Windows和Linux上使用本机内存)

如果您阅读了这些链接,我想您会认为Java中的内存管理并不像多项选择问题那么简单.


小智 8

设为null.然后就没有引用了,对象将变为可以为垃圾收集设置.GC将自动从堆中删除Object.


小智 5

这是代码:

public static void main(String argso[]) {
int big_array[] = new int[100000];

// Do some computations with big_array and get a result. 
int result = compute(big_array);

// We no longer need big_array. It will get garbage collected when there
// are no more references to it. Since big_array is a local variable,
// it refers to the array until this method returns. But this method
// doesn't return. So we've got to explicitly get rid of the reference
// ourselves, so the garbage collector knows it can reclaim the array. 
big_array = null;

// Loop forever, handling the user's input
for(;;) handle_input(result);
}
Run Code Online (Sandbox Code Playgroud)