`
linsea
  • 浏览: 90764 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一个含static字段的类的对象没有被引用是否会被GC回收?

    博客分类:
  • Java
JVM 
阅读更多
看到项目中有这里的代码,大家看下,一个类里面有一个static字段的变量,当new一个对象后,没有被引用,是否会被垃圾回收器回收?
比如,代码如下:

public class Sta {   
    private static int s = 0;   
       
    public Sta(int i) {   
        setS(i);   
    }   
    public static int getS() {   
        return s;   
    }   
    public static void setS(int s) {   
        Sta.s = s;   
    }   
       
}  


public class StaDriver {   
  
    public static void main(String[] args) {   
  
        new Sta(2);   
        System.out.println(Sta.getS());   
        System.gc();   
  
        System.out.println(Sta.getS());//如果被回收,值应该是0,否则为2,大家看呢?        
    }   
  
}  

这里不讨论System.gc()执不执行的问题,这里主要强调理论上,一个含static字段的对象没有被引用后会不会被垃圾回收!!!



=====================================================================

今天看到关于finalize()方法的使用,想到一种查用GC是否回收了对象的方法,方法如下:
可以把第一个类这样定义,增加一个finalize()方法,这样就可以看到效果了.

public class Sta {
	private static int s = 0;
	
	public Sta(int i) {
		setS(i);
	}
	public static int getS() {
		return s;
	}
	public static void setS(int s) {
		Sta.s = s;
	}
	
//	当一个对象要被GC回收里,此对象的finalize()方法将会被调用!
	public void finalize(){
		System.out.println("finalize() called !");
	}
	
}



再测试时,可以看到打印出的效果,可以证明对象的确被回收,但现在另一个问题是,对象被回收后,静态字段的值是2,非初始的0,此含静态字段的类的信息是否就是存储在程序所谓"静态存储区"呢?这个问题有待考证!
分享到:
评论
2 楼 linsea 2008-10-27  
theone 写道

当然会! static的信息并不是保存在堆内存里面的,像s这个变量是保存在类Sta的meta信息里面的,和对象实例无关。

这里new Sta(2)后,s的值被设为2, 那么当对象被回收后,也就是说没有Sta类的实例了,那么它的static字段s的值还会是2吗? 你说的meta的信息是保存在类里的,但此时没有任何此类的"信息",它又是如何保存的呢? 难道在JVM里记录了Sta"类"的信息?虽然曾经创建过,现在没有此类的实例.否则再检查它的值时应该是最初始的值0 .
1 楼 theone 2008-10-27  
当然会!

static的信息并不是保存在堆内存里面的,像s这个变量是保存在类Sta的meta信息里面的,和对象实例无关。

相关推荐

    Dalvik虚拟机垃圾收集(GC)过程分析.docx

    此函数接收一个布尔参数`clearSoftReferences`,用于决定是否清除软引用指向的对象。根据该参数的不同,选择不同的GcSpec来执行相应的垃圾回收操作。 #### 八、总结 Dalvik虚拟机的垃圾收集机制是确保应用稳定运行...

    java面试宝典

    72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信...

    net学习笔记及其他代码应用

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    JVM 38道面试题及答案.docx

    内存泄漏是指一个不再被程序使用的对象或变量一直被占据在内存中。Java 中有垃圾回收机制,可以保证一对象不再被引用的时候,即对象变成了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。 在 Java 中,堆的...

    java面试题大集合

    在这种情况下,只会创建一个`String`对象,因为它直接指向字符串池中的引用。 #### 三十三、float型floatf=3.4是否正确? 不正确,因为3.4是双精度浮点数,应明确指定为浮点数: ```java float f = 3.4f; ``` ###...

    Java面试题.txt

    - **finalize**:是Object类的一个方法,用于垃圾回收机制,在对象被垃圾回收器清除之前调用,提供最后一次机会来清理资源。然而,自Java 9起,finalize方法的使用被标记为过时,建议使用更现代的资源管理技术。 ##...

    java面试题经典32问

    当一个对象即将被垃圾回收器回收时,如果该对象重写了`finalize()`方法,则会在该对象被回收前调用一次`finalize()`方法,给对象最后一次机会进行资源清理等工作。 #### 二、匿名内部类能否继承其他类或实现接口? ...

    Java常见面试题集及答案.docx

    - 抽象类可以包含非抽象方法和字段,可以有构造器,一个类只能继承一个抽象类。 - 接口只包含抽象方法和常量,不能有构造器,一个类可以实现多个接口。 21. **abstract的method是否可同时是static, native, ...

    Microsoft.Net常见问题集锦

    `==` 操作符用于比较对象引用是否相同,而 `equals` 方法用于比较对象的内容是否相同。 14. **数组有没有 length() 这个方法?String 有没有 length() 这个方法?** - 数组有一个 `length` 属性,用于获取数组的...

    Java企业面试题整理及答案

    - `final` 类中的所有字段也是不可变的,这意味着一旦创建了一个 `final` 类的对象,其状态就不能被修改。 **11. 继承时候类的执行顺序问题** 继承时类的执行顺序遵循从父类到子类的原则,先执行父类构造器再执行...

    10个java热点面试题

    - **修饰类**: 当一个类被声明为`final`时,表明该类不能被继承。 - **修饰方法**: 当一个方法被声明为`final`时,表明该方法不能被子类覆盖(重写)。 - **修饰变量**: 当一个变量被声明为`final`时,表明一旦给该...

    2008年java面试题全集

    在Java中,对象引用可以是null,表示没有指向任何对象。在处理对象引用时需要注意空指针异常(NullPointerException),确保对象已初始化。 9. 堆与栈内存: 堆内存存储对象实例,包括实例变量和数组。栈内存存储...

    深入理解Java虚拟机笔记(带目录).docx

    * 强引用(Strong Reference):普通的对象引用,垃圾收集器不回收。 * 软引用(Soft Reference):对象的软引用,垃圾收集器在内存不足时回收。 * 弱引用(Weak Reference):对象的弱引用,垃圾收集器在执行时回收...

    JAVA程序员面试32问,你能回答多少题

    27. **try{}里有一个return语句,finally{}里的code是否会执行?何时执行?** - `finally`块中的代码总是会被执行,无论是否有`return`语句。`finally`中的代码会在`return`语句执行前执行。 28. **最有效率的方法...

    计算机类面试基本问题合集

    - 示例:长时间持有不再使用的对象引用,导致这些对象无法被垃圾回收。 12. **Java 的内存回收机制** - Java 的内存回收机制主要依赖于垃圾回收器(Garbage Collector, GC)。 - 常用的垃圾回收算法包括分代...

    Java面试八股文十万字总结.docx

    用于判断一个对象是否为某个类或其子类的实例。 **6. Java自动装箱与拆箱** - **装箱**:将基本类型转换为对应的包装类。 - **拆箱**:将包装类转换为基本类型。 **7. 重载和重写的区别** - **重载**:在同一类...

    java程序员面试题及解答.pdf,这是一份不错的文件

    16. Set 中的比较:Set 中的元素通过 equals() 方法判断是否重复,而不是 ==,因为 == 比较的是对象引用,equals() 比较的是对象内容。 17. 常见的运行时异常:NullPointerException、...

    java面试题(尚学堂内部培训资源,绝对值得一看)

    - **垃圾回收机制**:自动管理内存的过程,当一个对象不再被引用时,垃圾回收器会自动回收其占用的内存空间,防止内存泄漏。 #### 5. 在JAVA中,如何跳出当前的多重嵌套循环? 可以使用带标签的break语句,如: ``...

    Java面试题以及答案

    - `==`操作符用于比较对象引用是否相同,而`equals()`用于比较对象的内容是否相同。 #### 53. List, Set, Map是否继承自Collection接口? - `List`和`Set`继承自`Collection`接口。 - `Map`不是`Collection`的子...

Global site tag (gtag.js) - Google Analytics