当前位置: 技术问答>java相关
关于构造器和垃圾回收器
来源: 互联网 发布时间:2015-02-12
本文导语: 有这样一个类: cclass Chair { static boolean gcrun = false; static boolean f = false; static int created = 0; static int finalized = 0; Chair() { ++created; } public void finalize() { if(!gcrun) { /...
有这样一个类:
cclass Chair {
static boolean gcrun = false;
static boolean f = false;
static int created = 0;
static int finalized = 0;
Chair() {
++created;
}
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");
}
finalized++;
if(finalized >= created){
f=true;
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");
}
}
发现创建2907个对象的时候(即created=2907时),就开始调用垃圾回收器;
但是如果再开始用相同的方法创建对像时(见下面程序):
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");
}
Chair.gcrun = false;
Chair.f = false;
Chair.created = 0;
Chair.finalized = 0;
while(!Chair.f) { //第2次使用相同的方法创建对象
new Chair();
new String("To take up space");
}
}
}
当创建了4354个对象(即created=4354),才调用垃圾回收器。这是为什么呀?java根据什么来确定多久回收对象?
cclass Chair {
static boolean gcrun = false;
static boolean f = false;
static int created = 0;
static int finalized = 0;
Chair() {
++created;
}
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");
}
finalized++;
if(finalized >= created){
f=true;
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");
}
}
发现创建2907个对象的时候(即created=2907时),就开始调用垃圾回收器;
但是如果再开始用相同的方法创建对像时(见下面程序):
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");
}
Chair.gcrun = false;
Chair.f = false;
Chair.created = 0;
Chair.finalized = 0;
while(!Chair.f) { //第2次使用相同的方法创建对象
new Chair();
new String("To take up space");
}
}
}
当创建了4354个对象(即created=4354),才调用垃圾回收器。这是为什么呀?java根据什么来确定多久回收对象?
|
在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:
1.给对象赋予了空值null,以下再没有调用过。
2.给对象赋予了新值,既重新分配了内存空间。
如;
程序段1:
1.fobj = new Object ( ) ;
2.fobj. Method ( ) ;
3.fobj = new Object ( ) ;
4.fobj. Method ( ) ;
问:这段代码中,第几行的fobj 符合垃圾收集器的收集标准?
答:第3行。因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。
程序段2:
1.Object sobj = new Object ( ) ;
2.Object sobj = null ;
3.Object sobj = new Object ( ) ;
4.sobj = new Object ( ) ;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第1行和第3行。因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。
1.给对象赋予了空值null,以下再没有调用过。
2.给对象赋予了新值,既重新分配了内存空间。
如;
程序段1:
1.fobj = new Object ( ) ;
2.fobj. Method ( ) ;
3.fobj = new Object ( ) ;
4.fobj. Method ( ) ;
问:这段代码中,第几行的fobj 符合垃圾收集器的收集标准?
答:第3行。因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。
程序段2:
1.Object sobj = new Object ( ) ;
2.Object sobj = null ;
3.Object sobj = new Object ( ) ;
4.sobj = new Object ( ) ;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第1行和第3行。因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。
|
是的!
要知道,垃圾收集是一个线程,而且为了不影响程序效率,优先级是很低的
符合垃圾收集的条件的对象,也要等到垃圾收集线程取得控制权之后才会被收集掉,比如你放到门口的垃圾袋也一般要放上一天才会被收集掉
要知道,垃圾收集是一个线程,而且为了不影响程序效率,优先级是很低的
符合垃圾收集的条件的对象,也要等到垃圾收集线程取得控制权之后才会被收集掉,比如你放到门口的垃圾袋也一般要放上一天才会被收集掉
|
Java的语言说明只定义了回收规则时系统可以回收该对象,但并未定义是否立即回收;而实际上Java也不是立即回收的,这可以在很多地方查到的。