讨论下强引用把
1。
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
强引用必须设置他为空,gc才能去清除这段内存。 
我感觉这个结论不是绝对的 要看引用对象的生命周期。2.    Object A = new Object ();这个是个强引用,但是如果A的生命周期结束, 例如在函数里这么写, A就会放到栈里, new 的对象放入堆里, A从栈指向堆, 从这个函数结束后, A就会自动出栈, 生命周期结束,由此在堆上的B就会被gc 回收! 
    如果在函数里想用gc 去回收堆上空间,必须要显示的说明 A=null 这样gc 才能去回收!
 3.   如果在一个函数里这么写
    Object A = new Object();
    A= new B();
    在这个函数中堆分配的空间 object 会被回收吗? 应该会把 他没有在Gc root 的回收链上! 4. 还有一个问题是 我们在写代码的时候一般不会让强引用主动设置为null, 这样的话会产生内存泄露吗?强引用

解决方案 »

  1.   

    问题3:引用已经指向其他对象,可以被GC回收。问题4:个人观点,这个和JAVA栈的运行有关。
    当前方法对应的栈帧会在抛出异常或者返回时从线程栈中弹出去,局部变量区也在此栈帧里,所以当方法结束栈帧弹出,局部变量区也会失效,这个时候引用就不存在了,GC是可以回收的。所以写代码时,不用对局部变量的引用强制指定为null。
      

  2.   

    按thinking in java的提到的垃圾回收的方式大概是说:垃圾回收机,先去栈上面找引用指针 ,只要是栈上面在引用的就是有效的;否则就是垃圾。
    所以重点是,栈上面的引用是否还在;因为函数内定义的引用会出栈,出栈了引用就销毁了;时机一到就被GC回收了;然后GC不是简单的解决内存泄露,内存泄露只是其目的之一;垃圾回收在解决内存碎片上很有用;另外我个人认为,也正是因为GC的原因,Java可能更合适做服务器应用(内存处理效率高)?