菜鸟提问:启动垃圾回收时,是否还能创建对象。
在看《java编成思想》P148页时遇到的
书上说启动垃圾回收以前,系统会先启动要被回收对象的finalize(),那么系统在运行finalize(这时候有许多对象都要被回收,因此会有多个finalize要运行)的时候,是否允许系统这个期间同时创建对象?
我把程序稍微改了一下,本来想写信问候老师,又怕他老人家笑话此等问题,只好请大家帮忙看看了
class Chair {
static boolean gcrun = false;
static boolean f = false;
static int created = 0;
static int finalized = 0;
int i;
Chair() {
i = ++created;
if(created == 47)
System.out.println("\n"+"已经建立了47个对象"+"\n");
}
public void finalize() {
if (i==1) //---监测在此期间是否还有创建对象------1
System.out.println("在释放第1号对象得时候,已经创建的对象为"+ created );
if (i==5000) //---监测在此期间是否还有创建对象------2
System.out.println("在释放第5000号对象得时候,已经创建的对象为"+ created);
if(!gcrun)
{
gcrun = true;
System.out.println("在建立了" + created + "个对象后,Finalize第一次开始运行");
}
if(i == 5001)
{
f = true; //在释放到5001号对象的时候,停止对象创建开关
}
finalized++;
if(finalized >= created)
System.out.println("All More=" + finalized + " finalized\n");
}
}
public class Garbage2 {
public static void main(String[] args) {
while(!Chair.f) {
new Chair();
new String("To take up space");
}
System.out.println(
"After all Chairs have been created:\n" +
"total created = " + Chair.created +
", total finalized = " + Chair.finalized);
if(args.length > 0) {
if(args[0].equals("gc") ||
args[0].equals("all")) {
System.out.println("gc():Will Be Run!!!");
System.gc();
}
if(args[0].equals("finalize") ||
args[0].equals("all")) {
System.out.println("runFinalization():Will Be Run!!!");
System.runFinalization();
}
}
System.out.println("bye!!!");
}
}