在学习垃圾回收,有点不自信,在写程序时,先判断了哪儿符合了回收标准,但是不明白应该如何验证我的判断是正确的,
我是初学者,分析得也不一定对,想请教大家一下
写程序的时候,有什么测试方法没有,不是分析代码来判断,可以量化,观察所分配给一个对象的内存块已经被JVM回收了谢谢

解决方案 »

  1.   

    用java程序自己来检测??
    还没学过,难道真有这样的方法?
      

  2.   


    可惜这儿讨论的是JVM啊,呵呵。谢谢你的参与,呵呵
      

  3.   

    public static void main(String[] args) {
    Test t = new Test();
    SoftReference<Test> soft = new SoftReference<Test>(t);

    /* WeakReference<Test> weak = new WeakReference<Test>(t);*/
    t = null;
    System.gc();
    if (soft.get()==null) { 
    System.out.println("obj 已经被清除了 "); 
       } else {
    System.out.println("尚未被清除"); 
    }
      

  4.   


    这个??有点问题吧?如果用来测试下面这段程序的话并不能显示有内存块A的回收吧?
    import java.lang.ref.SoftReference;public class TestA{
    public static void main(String []args){
    TestA aa = new TestA();//设此处所分配的内存块为A
    TestA bb = new TestA();//设此处所分配的内存块为B
    SoftReference <TestA> soft1 = new SoftReference <TestA>(A);
    SoftReference <TestA> soft2= new SoftReference <TestA>(B);

    aa = bb;

    System.out.println(soft1.get());
    System.out.println(soft2.get());
    }
    }至此内存块A应该会符合了回收条件,但是程序运行永远都是类似如下:
    TestA@de6ced
    TestA@c17164
    并不表示内存块已经被回收,或者符合了回收标准。你在我的另外一个帖子里说此时内存块并不会被回收,但是我的问题是如果不被回收的话不就内存块A永远被分配出去了,即无法利用,也无法回收,浪费了吗?
      

  5.   

    在没个类里protected void finalize() throws Throwable {
          System.out.println("i am a garbage");
          super.finalize();
    }然后在你做了  一切事情后  让对象变成垃圾加上System.gc();参考代码
    public class T{
    public static void main(String[] args) {
    T t = new T();
    t = new T();
    System.gc();

    }
    @Override
    protected void finalize() throws Throwable {
    System.out.println("i am a garbage");
    super.finalize();
    }
    }
      

  6.   

    任何对象都有作用域,出了作用域才有可能被回收
    java中把对象的引用分为四种级别,分别是强引用、软引用、弱引用和虚引用强引用
        所有对象默认强引用,对于强引用,垃圾回收器一般不回收,哪怕冒内存溢出的风险,
      这就是有的程序运行时总报OutOfMemoryError,但查看后却发现代码并没有问题的原因
    软引用(SoftReference)
        当内存空间足够,软引用跟强引用一样,GC不回收
        当内存空间不够,GC才回收
    弱引用(WeakReference)
        不论内存够不够,GC都回收
    虚引用(PhantomReference)
        虚引用同弱引用,但使用时有区别
      

  7.   

    jconsole
    jprofile
    之类的工具可以看看
      

  8.   

    jconsole
    jprofile
    之类的工具可以看看