黑马程序员技术交流社区

标题: 垃圾回收器的原理 [打印本页]

作者: 孙建飞    时间: 2012-7-27 12:30
标题: 垃圾回收器的原理
解释一下垃圾回收器的工作原理吧,谢谢
作者: 李菁    时间: 2012-7-27 12:42
Java虚拟机用于释放那些不再使用的对象所占用的内存。
当没有对象引用指向原先分配给对象的内存时,这个内存就成为了垃圾,虚拟机的一个系统级线程就会自动释放该内存

这就是垃圾回收器的工作原理
作者: 刘海源    时间: 2012-7-27 12:43
Jvm在启动线程的时候,每一个线程都有自己要执行的内容。
其中一个负责执行main函数中的内容:这个线程称之为:主线程。 main.
负责垃圾回收器运行的称之为垃圾回收线程。 代码如下:
class LizeDemo extends Object
{
        public void finalize()
        {
                System.out.println("finalize run");
        }
}



class Demo
{
        public static void main(String[] args)
        {
                new LizeDemo();
                new LizeDemo();
                new LizeDemo();
                new LizeDemo();
                System.gc();//启动了垃圾回收器。垃圾回收器在回收每一个对象垃圾时,都会自动的调用该对象的finalize方法。
               
        }
}
作者: 陈汉维    时间: 2012-7-27 12:55
举个例子:
如int[] x = new int[]{1,2,3},系统会在堆内存中开辟一个内存空间,用来存储1,2,3,然后将该实体的首地址赋给x,当x = null 时,没有任何东西指向该实体,该实体就是一个垃圾,系统将会在不定时内自动对其进行垃圾回收。


作者: 曹晓涵    时间: 2012-7-27 13:00
      对于垃圾回收器GC而言,当程序员创建对象的时候GC就开始监控这个对象在内存的地址,大小以及使用情况。GC采用有向图的方法记录和管理堆中的所有对象,通过这种方式来确定哪些对象是被引用的,哪些对象是不被引用。当确定了不被引用的对象以后,就将该对象所占有的空间回收。
      1.GC并不是定期来回收你的垃圾内存,即是根据需要来回收。GC的回收是因为:它认为你的系统已经开始内存紧张,即使GC开始准备清理你的垃圾内存,但是如果该内存的引用还存在,  这个时候GC仍然无能为力!  
      2.可以马上回收内存,手动执行System.gc(),通知java虚拟机进行垃圾回收。
作者: 范泰洋    时间: 2012-7-27 13:10
Java语言中引入垃圾回收机制,是为了我们在编写程序的时候不再需要考虑内存管理。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
借鉴的。
作者: 乐峰    时间: 2012-7-27 13:15
垃圾回收机制:
垃圾回收器在不定时的时候回收堆内存中没有引用的一些对象。有时候垃圾回收器还没有来得急回堆内存中的垃圾,JVM就已经关闭那么此时所有分配的空间全部都被随着JVM的关机而全部释放。每次调用垃圾回收器,打印的结果不一样,原因是垃圾回收线程和其他线程抢夺资源。多线程不容易控制,随机性。
通常情况下,如果发生以下两种情况时,系统会认为这些对象是垃圾对象,需要销毁:
一是将一个NULL值赋值给对象。如用户先建立了一个对象str1。对象用完了之后,再利用赋值语句,将NULL值赋值给这个对象str1,即使用str1=NULL的方式将NULL值赋值给这个对象。此时这个对象与内存中对象的存储地址之间就失去了联系。此时内存中的对象就好像成为了一个无主的对象,就会被垃圾回收器销毁。
二是对象其超出了作用范围,这个这个对象就被认为是垃圾对象,被被垃圾回收器回收并释放内存。其实对象跟变量一样,其也有作用域。当超过这个作用域的话,跟变量一样,这个对象也就无效了,其他地方不能够再引用这个对象。此时这个对象就是名存实亡了。为此垃圾回收器也把这种超过作用范围的对象当作垃圾对象来处理。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2