2011-06-08 79 views
0

为什么java编译器不是更聪明。 假设它是,那么它可以在编译时找到不可达对象,并且代码本身清理垃圾。我认为这将有助于避免java中的垃圾收集概念(需要添加DELETE关键字以删除对象)。为什么这是不可能的?智能Java编译器垃圾收集

+2

提高我不知道你说的是(所以我标志着这是什么不是一个真正的问题)。否则,我会将其标记为“主观和争议”或“异议”。 – 2011-06-08 07:21:18

+0

我不同意这是“不是真正的问题”。 – Jesper 2011-06-08 07:29:05

+0

我在java中发现了垃圾收集的一些缺点。在这里,我想如何从这里过来。 – 2011-06-08 07:44:04

回答

1

计算机不能总是给出是或否的答案。实际上,计算机无法解决的问题比可以解决的问题多。

看看Undecidable problemList of undecidable problems。在那里你会发现暂停问题:Halting problem这说明计算机甚至不能说程序是否停止。如果你可以按照你的描述构建一个编译器,那么这不会是一个问题 - 所以你不能(它可以被证明)。

此外,还有是说你永远不能做出最佳的编译器定理;-)它们总是可以:-)

0

名称“garbage collection”意味着该程序不再需要的对象是“garbage”并且可以被丢弃。
垃圾收集是删除未引用对象的过程。这不是一个编译时间过程。

垃圾回收是RunTime进程。只有在堆上创建对象时才会发生。

How Garbage collection works in Java ?

+0

绝对......但是这里我要重新考虑一下,这是否可以在编译时间内完成......垃圾收集器在未知时间自动调用jvm,这是我的重要任务正在处理时的一个大问题。 – 2011-06-10 05:26:46

2

垃圾收集一个很好的教程,不能在编译时完成。这是因为“编译时间”是源代码转换为字节码的时间。内存中没有正在运行的程序。由于内存中没有正在运行的程序,因此没有分配对象。因此没有垃圾收集。

例如,如果您有下面的代码:

int num = new Scanner(System.in).readInt(); 

for(int i = 0; i < num; i++) 
{ 
    Object o = new Object(); 
} 

现在在编译时如何将编译器知道有多少对象将被创建并应该有多少是垃圾收集。只有在运行该程序的运行时,JVM才会知道创建了多少个对象[根据用户输入的值num]以及应该垃圾收集的数量。

+0

但是,我需要一些想法在代码本身中删除这个对象(例如:O)。因为在这里每个循环对象都将不可用。因此,比较器需要通知程序员或者引发错误或者自动插入一些代码... hv有什么想法吗? – 2011-06-08 13:25:07

+0

你不能用Java直接删除对象。 – 2011-06-08 14:24:08

3

通常,在编译时不可能知道程序中的哪个点确切地说有一个对象变为未被引用(以便编译器可以在该点插入“delete”语句)。

从Java 6更新14开始,Java有escape analysis(作为一个实验性功能;它可能成为更高版本的标准功能)部分解决了此问题。

转义分析会发生什么情况是编译器检查对象是否从某个本地作用域“转义”例如,方法内的局部变量。如果编译器发现一个对象没有转义,Java将在栈上而不是在堆上分配对象,这意味着当方法返回时它将被“免费”抛弃(在那一刻,堆栈帧该方法结束并且对象被丢弃) - 所以垃圾收集器不需要做任何事情来清理对象。

+0

你可以发送一些逃生分析的更多细节......它的intrested。 – 2011-06-08 07:28:28

+0

请参阅我的文章中的链接。 – Jesper 2011-06-08 07:29:29