用于垃圾收集的智能Java编译器

时间:2011-06-08 07:18:32

标签: java

为什么java编译器不是更聪明。  假设它是,然后它可以在编译时找出无法访问的对象,代码本身清理垃圾。我认为这将有助于避免java中的垃圾收集概念(需要添加DELETE关键字来删除对象)。为什么不可能?...

4 个答案:

答案 0 :(得分:5)

一般情况下,无法在编译时知道程序中的某个点确切地说对象是未引用的(因此编译器可以在该点插入“delete”语句)。

自Java 6更新14以来,Java有escape analysis(作为实验性功能;它可能成为更高版本中的标准功能),可部分解决此问题。

转义分析会发生什么,编译器检查对象是否从某个局部范围“逃逸”;例如,方法内的局部变量。如果编译器发现对象没有转义,Java将在堆栈上而不是在堆上分配对象,这意味着当方法返回时它将被“免费”丢弃(此时,堆栈帧为方法结束,对象被丢弃) - 所以垃圾收集器不必做任何事情来清理对象。

答案 1 :(得分:2)

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

例如,如果您有以下代码:

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

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

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

答案 2 :(得分:1)

计算机无法给出是或否答案存在很多问题。实际上,计算机无法解决的问题多于可以解决的问题。

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

此外,有一个定理说你永远不能创造一个最佳的编译器;-)它们总能被改进: - )

答案 3 :(得分:0)

名称“garbage collection”表示程序不再需要的对象为“garbage”并且可以丢弃。
垃圾收集是一个删除未引用对象的过程。它不是编译时的过程。

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

关于How Garbage collection works in Java ?

的好教程