这是昨天看java的垃圾回收时 写的一个测试类。代码如下
没想到运行之后 成了无限循环了,一直不停,郁闷了。
看了多遍代码、加了一些打印语句,也没有看出个所以然。
所以想请大家帮忙看看 向大家请教了class gb {
static boolean gcrun = false;
static boolean f = false;
static int created = 0;
static int finalized = 0;
int i;
gb() {
created++;
System.out.println("now created:" + created);
i = created;
if(created == 47)
System.out.println("created 47");
}
protected void finalize() {
System.out.println("into finalize()");
if(!gcrun) {
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");
this.f = true;
}
finalized++ ;
if(finalized >= created){
System.out.println("all finalized finalized");
this.created=0;
this.finalized=0;
}
System.out.println("outof finalize()");
}
}
public class garbage {
public static void main (String[] args) {
while(!gb.f){
new gb();
System.out.println("to take up space");
}
System.out.println("after all chairs have been created:n total created
= "+gb.created+", total finalized = "+gb.finalized);
System.out.println("gc():");
System.gc();
System.out.println("runFinalization():");
System.runFinalization();
System.out.println("bye!");
}
}
没想到运行之后 成了无限循环了,一直不停,郁闷了。
看了多遍代码、加了一些打印语句,也没有看出个所以然。
所以想请大家帮忙看看 向大家请教了class gb {
static boolean gcrun = false;
static boolean f = false;
static int created = 0;
static int finalized = 0;
int i;
gb() {
created++;
System.out.println("now created:" + created);
i = created;
if(created == 47)
System.out.println("created 47");
}
protected void finalize() {
System.out.println("into finalize()");
if(!gcrun) {
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");
this.f = true;
}
finalized++ ;
if(finalized >= created){
System.out.println("all finalized finalized");
this.created=0;
this.finalized=0;
}
System.out.println("outof finalize()");
}
}
public class garbage {
public static void main (String[] args) {
while(!gb.f){
new gb();
System.out.println("to take up space");
}
System.out.println("after all chairs have been created:n total created
= "+gb.created+", total finalized = "+gb.finalized);
System.out.println("gc():");
System.gc();
System.out.println("runFinalization():");
System.runFinalization();
System.out.println("bye!");
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;class gb {
static boolean gcrun = false; static boolean f = false; static int created = 0; static int finalized = 0; int i; gb() {
created++;
System.out.println("now created:" + created);
i = created;
if (created == 47){
System.out.println("created 47");
}
} protected void finalize() {
System.out.println("into finalize()");
if (!gcrun) {
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");
this.f = true;
}
finalized++;
if (finalized >= created) {
System.out.println("all finalized finalized");
this.created = 0;
this.finalized = 0;
}
System.out.println("outof finalize()");
}
}public class garbage {
public static void main(String[] args) throws InterruptedException, SQLException {
while (!gb.f) {
new gb();
Thread.sleep(1000);
System.out.println("to take up space");
//你的垃圾回收应该放在循环里面,否则永远执行不到外面!
//生成47个对象后,以后每次都建议JVM垃圾回收,直到f=true终止循环!
if(gb.created>=47){
System.runFinalization();
//这里也只是建议回收,JVM不一定真的回收!
System.gc();
}
}
System.out
.println("after all chairs have been created:n total created = "
+ gb.created + ", total finalized = " + gb.finalized); System.out.println("gc():");
System.out.println("runFinalization():");
System.out.println("bye!");
Connection con=DriverManager.getConnection("");
con.createStatement(); }
}
GC的调用时间由JVM决定
finalize()同样也是由JVM决定调用
这个并不能作为析构函数来处理
con.createStatement();
抱歉,这2行去掉,不小心加上去了
对你的代码进行一下修改,你就能看出问题了,修改如下
protected void finalize() {
System.out.println("into finalize()" + i);
这样,你就会发现,47号对象不一定会在你想像的时刻被回收.
private Object[] stack;
private int index;
ObjStack(int indexcount) {
stack = new Object[indexcount];
index = 0;
}
public void push(Object obj) {
stack[index] = obj;
index++;
}
public Object pop() {
index--;
return stack[index];
}
}
public class Pushpop {
public static void main(String[] args) {
int i = 0;
Object tempobj;
ObjStack stack1 = new ObjStack(64);//new一个ObjStack对象,并调用有参构造函数。分配stack Obj数组的空间大小为64,可以存64个对象,从0开始存储。
while (i < 64)
{
tempobj = new Object();//循环new Obj对象,把每次循环的对象一一存放在stack Obj数组中。
stack1.push(tempobj);
i++;
System.out.println("第" + i + "次进栈" + "\t");
}
while (i > 32)
{
tempobj = stack1.pop();//这里造成了空间的浪费。
//正确的pop方法可改成如下所指示,当引用被返回后,堆栈删除对他们的引用,因此垃圾收集器在以后可以回收他们。
/*
* public Object pop() {index - -;Object temp = stack [index];stack [index]=null;return temp;}
*/
i--;
System.out.println("第" + (64 - i) + "次出栈" + "\t");
}
}
} 以上转自http://www.programfan.com
created 和finalized 是类属性,做计数器用的,不会是单独去标识一个对象的
我是想生成47个之后就要回收的
至于虚拟机什么时候回收垃圾 不是我们可以控制的
我们只能建议 是否真的回收了 那是虚拟机的事了只像跳出死循环的话 可以加一个计时器import java.util.Timer;
import java.util.TimerTask;class gb {
static boolean gcrun = false; static boolean f = false; static int created = 0; static int finalized = 0; int i; gb() {
created++;
System.out.println("now created:" + created);
i = created;
if (created == 47)
System.out.println("created 47");
} protected void finalize() {
System.out.println("into finalize()");
if (!gcrun) {
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");
this.f = true;
}
finalized++;
if (finalized >= created) {
System.out.println("all finalized finalized");
this.created = 0;
this.finalized = 0;
}
System.out.println("outof finalize()");
}
}class garbage {
public static void main(String[] args) {
//定时...1分钟
new ExecuteTimer(1).start();
while (!gb.f) {
new gb();
System.out.println("to take up space");
}
System.out
.println("after all chairs have been created:n total created = "
+ gb.created + ", total finalized = " + gb.finalized); System.out.println("gc():");
System.gc();
System.out.println("runFinalization():");
System.runFinalization(); System.out.println("bye!"); }
}
//定时器 以分钟为单位
class ExecuteTimer {
private final Timer timer = new Timer();
private final int minutes; public ExecuteTimer(int minutes) {
this.minutes = minutes;
} public void start() {
timer.schedule(new TimerTask() {
public void run() {
stopProgram();
timer.cancel();
}
private void stopProgram() {
gb.f = true;
}
}, minutes * 60 * 1000);
}
}