[size=large]看到项目中有这里的代码,大家看下,一个类里面有一个static字段的变量,当new一个对象后,没有被引用,是否会被垃圾回收器回收?
比如,代码如下:[/size]
[size=large]这里不讨论System.gc()执不执行的问题,这里主要强调理论上,一个含static字段的对象没有被引用后会不会被垃圾回收!!! [/size]
=====================================================================
[size=large]今天看到关于finalize()方法的使用,想到一种查用GC是否回收了对象的方法,方法如下:
可以把第一个类这样定义,增加一个finalize()方法,这样就可以看到效果了.[/size]
[size=large]再测试时,可以看到打印出的效果,可以证明对象的确被回收,但现在另一个问题是,对象被回收后,静态字段的值是2,非初始的0,此含静态字段的类的信息是否就是存储在程序所谓"静态存储区"呢?这个问题有待考证![/size]
比如,代码如下:[/size]
public class Sta {
private static int s = 0;
public Sta(int i) {
setS(i);
}
public static int getS() {
return s;
}
public static void setS(int s) {
Sta.s = s;
}
}
public class StaDriver {
public static void main(String[] args) {
new Sta(2);
System.out.println(Sta.getS());
System.gc();
System.out.println(Sta.getS());//如果被回收,值应该是0,否则为2,大家看呢?
}
}
[size=large]这里不讨论System.gc()执不执行的问题,这里主要强调理论上,一个含static字段的对象没有被引用后会不会被垃圾回收!!! [/size]
=====================================================================
[size=large]今天看到关于finalize()方法的使用,想到一种查用GC是否回收了对象的方法,方法如下:
可以把第一个类这样定义,增加一个finalize()方法,这样就可以看到效果了.[/size]
public class Sta {
private static int s = 0;
public Sta(int i) {
setS(i);
}
public static int getS() {
return s;
}
public static void setS(int s) {
Sta.s = s;
}
// 当一个对象要被GC回收里,此对象的finalize()方法将会被调用!
public void finalize(){
System.out.println("finalize() called !");
}
}
[size=large]再测试时,可以看到打印出的效果,可以证明对象的确被回收,但现在另一个问题是,对象被回收后,静态字段的值是2,非初始的0,此含静态字段的类的信息是否就是存储在程序所谓"静态存储区"呢?这个问题有待考证![/size]