如何在java中销毁一个对象?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在java中销毁一个对象?相关的知识,希望对你有一定的参考价值。
我在接受以下选项的采访中遇到了这个问题:
如何在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.
- 答案应该是e?
- 如果e不存在怎么办?然后 ?显然c不是答案。 a和b将为整个应用程序执行gc(问题需要一个对象)。我认为这是因为在gc之前调用finalize()(但是在调用gc的最终化之后是否有必要?)或者我错了?我必须在那里回答这个问题吗?
答案E是正确答案。如果E不存在,您很快就会耗尽内存(或)无正确答案。
无法访问对象以符合GC条件。 JVM将执行多次扫描并将对象从一代移动到另一代,以确定GC的合格性,并在无法访问对象时释放内存。
澄清为什么其他答案不起作用:
System.gc()
(与Runtime.getRuntime().gc()
一起完成同样的事情)暗示你想要破坏东西。依稀。如果JVM没有看到需要,那么JVM可以自由地忽略运行GC循环的请求。另外,除非您已经清除了对象的所有可访问引用,否则GC无论如何都不会触及它。所以A和B都被取消资格。Runtime.getRuntime.gc()
语法不好。getRuntime
是一个函数,而不是变量;你需要用括号来调用它。因此B被双重取消资格。Object
没有delete
方法。所以C被取消资格。- 虽然
Object
确实有finalize
方法,但它不会破坏任何东西。只有垃圾收集器才能实际删除对象。 (在许多情况下,他们在技术上甚至不愿意这样做;他们只是在他们做其他人时不复制它,所以它被抛在后面。)所有finalize
确实给了一个对象一个机会清理之前JVM丢弃它。更重要的是,你永远不应该直接打电话给finalize
。 (由于finalize
受到保护,JVM不会让你在任意对象上调用它。)所以D被取消资格。 - 除此之外,
object.doAnythingAtAllEvenCommitSuicide()
要求运行代码引用object
。仅这一点使它“活着”,因此没有资格进行垃圾收集。因此C和D被双重取消资格。
Short Answer - E
回答isE
,其余的明显错误,但..
Long Answer - It isn't that simple; it depends ...
简单的事实是,垃圾收集器可能永远不会决定对每个对象进行垃圾收集,这是一个可行的收集候选对象,除非内存压力非常高。然而事实上,Java与其他任何语言一样容易受到内存泄漏的影响,它们更难以引起,因此当你导致它们时更难找到它们!
以下文章有许多关于内存管理如何工作和不起作用的详细信息,以及由什么引起的内容。 How generational Garbage Collectors work和Thanks for the Memory ( Understanding How the JVM uses Native Memory on Windows and Linux )
如果您阅读了这些链接,我想您会认为Java中的内存管理并不像多项选择问题那么简单。
设为null。然后没有引用,该对象将有资格进行垃圾收集。 GC将自动从堆中删除Object。
这是代码:
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);
}
在java中,没有明确的方法来进行垃圾收集。 JVM本身在后台运行一些线程,检查没有任何引用的对象,这意味着我们访问对象的所有方式都将丢失。另一方面,如果对象超出了我们创建对象的程序终止或结束的范围,则该对象也有资格进行垃圾收集。回到你的问题,方法finalize与C ++中的析构函数相同。 finalize方法实际上是在JVM清除对象内存之前调用的。您可以在程序中定义finalize方法。但是,如果在程序终止后完成对象的垃圾收集,则JVM将不会调用您在程序中定义的finalize方法。你可能会问到finalize方法有什么用?例如,让我们考虑您创建了一个对象,该对象需要一些流到外部文件,并且您明确地为此对象定义了finalize方法,该方法检查打开到文件的流是否打开,如果不是,则关闭流。假设在编写了几行代码后,您丢失了对该对象的引用。然后它有资格进行垃圾收集。当JVM即将释放对象的空间时,JVM只会检查您是否定义了finalize方法并调用该方法,因此不存在打开的流的风险。 finalize方法使程序无风险且更加健壮。
以上是关于如何在java中销毁一个对象?的主要内容,如果未能解决你的问题,请参考以下文章