关于构造器和垃圾回收器 一句话,就是java 根据什么来确定什么时候回收对象? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在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也符合垃圾收集器的收集标准。 那么垃圾收集器和finalize() 有什么关系?renrzg(renrzg):你的意思是不是 while(!Chair.f) {Chair kk= new Chair(); }中,每次循环都对象都被回收了? 1.每一个对象都有一个finalize( )方法,这个方法是从Object类继承来的。 2.finalize( )方法用来回收内存以外的系统资源,就像是文件处理器和网络连接器。该方法的调用顺序和用来调用该方法的对象的创建顺序是无关的。换句话说,书写程序时该方法的顺序和方法的实际调用顺序是不相干的。请注意这只是finalize( )方法的特点。 3.每个对象只能调用finalize( )方法一次。如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。 4.垃圾收集器跟踪每一个对象,收集那些不可到达的对象(即该对象没有被程序的任何"活的部分"所调用),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。既然每个对象只能调用一次finalize( )方法,所以每个对象也只可能"复苏"一次。 5.finalize( )方法可以明确地被调用,但它却不能进行垃圾收集。 6.finalize( )方法可以被重载(overload),但只有具备初始的finalize( )方法特点的方法才可以被垃圾收集器调用。 7.子类的finalize( )方法可以明确地调用父类的finalize( )方法,作为该子类对象的最后一次适当的操作。但Java编译器却不认为这是一次覆盖操作(overriding),所以也不会对其调用进行检查。 8.当finalize( )方法尚未被调用时,System. runFinalization( )方法可以用来调用finalize( )方法,并实现相同的效果,对无用对象进行垃圾收集。 gxc_csdn(火箭炮) 你的事例符合我说的垃圾回收的两个标准的第二点2.给对象赋予了新值,既重新分配了内存空间。 既符合垃圾回收 renrzg(renrzg) 既然你说我的示例符合第2点,也就是说符合垃圾回收,但是是不是马上被回收掉了?如果被回收掉了,根据“在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。”,那么应该调用finalize( )方法。但是,我最顶上的程序可以测出,实际上是创建了2907个对象后,才开始调用finalize( )方法。这是为什么?是不是,“符合垃圾回收”并不是马上回收? 我觉的我们的注意力应该集中于如何解决问题,至于地层是如何运行的,一般是有能力就去研究,没有就不用了。毕竟那种搞地层的人不多。我把jdk的source code down下来,看了几天,还是看不出是如何运行的。毕竟还没有到cpu那层搞过东西,而且限于Intel,他那里各种cpu 和os 都有的. 我现在是在学习,主要是想尽量的搞懂,这应该对深入了解java有帮助的。对以后的应用应该也有很大的帮助 Java的语言说明只定义了回收规则时系统可以回收该对象,但并未定义是否立即回收;而实际上Java也不是立即回收的,这可以在很多地方查到的。 说一个有趣的故事,再大家告诉我:工厂模式,是不是有三种:工厂方法、抽象工厂、工厂 ?? 请问,poi写excel文件,如何生成下拉框 关于String的比较及其hashCode的含义 文件的删除与目录的建立 装tomcat的问题 请教一个“Java代码中的错误原因”. 教教我:netbeans这个集成环境怎么用?jdk管理在哪啊? Byte转换Short,如何实现? 请问如何比较两个object 型的大小? 关于Byte数组操作 关于jdk 1.4 测试版安装的问题 如何比较两个文件的差别,高分相送,如有源程序可给Money!!!
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也符合垃圾收集器的收集标准。
renrzg(renrzg):你的意思是不是
while(!Chair.f) {
Chair kk= new Chair();
}
中,每次循环都对象都被回收了?
2.finalize( )方法用来回收内存以外的系统资源,就像是文件处理器和网络连接器。该方法的调用顺序和用来调用该方法的对象的创建顺序是无关的。换句话说,书写程序时该方法的顺序和方法的实际调用顺序是不相干的。请注意这只是finalize( )方法的特点。
3.每个对象只能调用finalize( )方法一次。如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。
4.垃圾收集器跟踪每一个对象,收集那些不可到达的对象(即该对象没有被程序的任何"活的部分"所调用),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。既然每个对象只能调用一次finalize( )方法,所以每个对象也只可能"复苏"一次。
5.finalize( )方法可以明确地被调用,但它却不能进行垃圾收集。
6.finalize( )方法可以被重载(overload),但只有具备初始的finalize( )方法特点的方法才可以被垃圾收集器调用。
7.子类的finalize( )方法可以明确地调用父类的finalize( )方法,作为该子类对象的最后一次适当的操作。但Java编译器却不认为这是一次覆盖操作(overriding),所以也不会对其调用进行检查。
8.当finalize( )方法尚未被调用时,System. runFinalization( )方法可以用来调用finalize( )方法,并实现相同的效果,对无用对象进行垃圾收集。 gxc_csdn(火箭炮) 你的事例符合我说的垃圾回收的两个标准的第二点2.给对象赋予了新值,既重新分配了内存空间。 既符合垃圾回收
如果被回收掉了,根据“在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。”,那么应该调用finalize( )方法。但是,我最顶上的程序可以测出,实际上是创建了2907个对象后,才开始调用finalize( )方法。这是为什么?是不是,“符合垃圾回收”并不是马上回收?