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("Created 47");
}

public void finalize() {
if(!gcrun) {
//THe first time finalize() is called
gcrun = true;
System.out.println("Beginning to finalize after " 
+ created + " Chairs have been created");
}
if (i == 47) {
System.out.println("Finalizing Chair #47, " + 
"Setting flag to stop Chair creation");
f = true;
}
finalized++;
if(finalized >= created)
System.out.println("All" + finalized + " finalized");
}
}
public class Garbage {
public static void main(String[] args){
// As long as the flag hasn't been set,
// make Chairs and Strings:
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);
// optional arguments force garbage
// collection & finalization:
if(args.length > 0) {
if(args[0].equals("gc")||
   args[0].equals("all")) {
System.out.println("gc():");
System.gc();
}
if(args[0].equals("finalize")|| args[0].equals("all")){
System.out.println("runFinalization():");
System.runFinalization();
}
}
System.out.println("bye");
}
}///:~他说new Chair(); new String("To take up space");时建立了很多的对象,但是没有循环,怎么建立的对象?
还有,finalize()是怎么工作的?不是说java是自动垃圾回收的吗?谢谢

解决方案 »

  1.   

    while(!Chair.f){
    new Chair();
    new String("To take up space");
    }
    这个不是循环吗?对亚,是自动垃圾回收,可是你不知道在什么时候.而且垃圾回收器只知道释放那些经由new分配的内存.为了应对这种情况,java定义了finalize()方法.finalize的工作原理是这样的: 一旦垃圾回收器准备好释放对象占用的存储空间,讲首先调用其finalize()方法,并且在下一此垃圾回收动作发生时,才会真正回收对象占用的内存.而你这个程序里面还有sysytem.gc();它是用于强制进行终结动作.即使你没有System.gc()通过重复执行程序,也可以.关于System.gc()
    一、JVM回收内存的机制。当:
    1、JVM比较空闲的时候,JVM会自动检测内存的使用情况,回收不用的内存。
    2、当JVM发现内存占用率太高,没有内存可以使用的时候,JVM也会马上自动回收内存。
    所以,楼主看到内存使用率高的时候,其实JVM就会回收了。二、内存使用的一些技巧
    1、尽量不要在循环内部声明变量。比如
    for(int i=0;i<100;i++){
      Object ob=new Object();
      bo.xxxxx();
    }
    应该使用
    Object ob=null;
    for(int i=0;i<100;i++){
      ob=new Object();
      bo.xxxxx();
    }
    2、对象不再使用的时候将它设置为null,有利于内存回收。
    实际上,java的变量和reference的关系可以这样表示
    Object ob=new Object();
    这里的ob是一个reference,它指向了一个Object对象实例。
    如果设置
    ob=null;
    那么ob就指向了一个空值。原来指向的Object的实例就没有引用了。
    JVM对没有引用的对象,很容易就判断为可以回收的内存。这样就会提高内存回收的效率