大家好,最近看孙鑫的java 12cd视频教程的时候看到第3CD中的时候(CD播放时候为:
1小时56分38秒的时候有这样一个例子如下:
class Garbage
{
int index;
static int count;
Garbage()
{
count++;
System.out.println("object " + count + " construct!");
setId(count);
}
void setId(int id)
{
index=id;
}
protected void finalize()
{
System.out.println("object " + index + " is reclaimed!");
}
public static void main(String[] args)
{
new Garbage();
new Garbage();
new Garbage();
new Garbage();
System.gc();
}
}
我的输出结果为:
object 1 construct!
object 2 construct!
object 3 construct!
object 4 construct!
object 4 is reclaimed!
object 3 is reclaimed!
object 2 is reclaimed!
object 1 is reclaimed!
请按任意键继续. . .
而孙鑫的视频教程上输出为:
object 1 construct!
object 2 construct!
object 3 construct!
object 4 construct!
object 1 is reclaimed!
object 2 is reclaimed!
object 3 is reclaimed!
object 4 is reclaimed!
请按任意键继续. . .请大家看看是怎么回事呢?应该是后建立的对象先回收才对啊?我这个结果应当是正确的啊?怎么孙鑫的视频上的输出结果和我不一样呢?奇怪!
1小时56分38秒的时候有这样一个例子如下:
class Garbage
{
int index;
static int count;
Garbage()
{
count++;
System.out.println("object " + count + " construct!");
setId(count);
}
void setId(int id)
{
index=id;
}
protected void finalize()
{
System.out.println("object " + index + " is reclaimed!");
}
public static void main(String[] args)
{
new Garbage();
new Garbage();
new Garbage();
new Garbage();
System.gc();
}
}
我的输出结果为:
object 1 construct!
object 2 construct!
object 3 construct!
object 4 construct!
object 4 is reclaimed!
object 3 is reclaimed!
object 2 is reclaimed!
object 1 is reclaimed!
请按任意键继续. . .
而孙鑫的视频教程上输出为:
object 1 construct!
object 2 construct!
object 3 construct!
object 4 construct!
object 1 is reclaimed!
object 2 is reclaimed!
object 3 is reclaimed!
object 4 is reclaimed!
请按任意键继续. . .请大家看看是怎么回事呢?应该是后建立的对象先回收才对啊?我这个结果应当是正确的啊?怎么孙鑫的视频上的输出结果和我不一样呢?奇怪!
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。