初识java程序的垃圾回收机制及对象在内存中的状态-----自学JAVA(第二节)

来源:互联网 发布:中小学图书馆软件下载 编辑:程序博客网 时间:2024/05/16 16:01

本文属于小编原创,请使用者标明出处:

一.初识java程序的垃圾回收机制

     1、垃圾回收(Garbage Collection : GC);

     2、垃圾:在Java中,当没有任何应用变量指向原先分配给某个对象的内存时,该内存便成为垃圾;

     3、Java程序的内存分配和回收都是由JRE在后台自动进行的;

     4、JRE会提供一个后台线程来进行检查和控制,一般在CPU空闲和内存不足时自动进行垃圾回收;

     5、垃圾回收只能回收堆内存资源,不能回收其他物理资源(如:数据库连接、磁盘I/O等);

     6、垃圾回收也可以清除内存记录碎片;

     7、垃圾回收一个潜在缺点:它的开销影响程序性能,Java虚拟机必须跟踪程序中有用的对象,这个过程需要花费处理器的时间;

     8、编写Java程序时,一个基本规则:对于不在需要的对象,不要引用它。

二.对象在内存中的状态

     1、执行状态:当一个对象被创建后,若有一个以上引用变量引用它,即这个对象处于执行状态。此时程序可通过引用变量来调用该对象 实例变量和方法。

     2、被挂起状态:如果程序中某个对象不再有任何引用变量引用它,即他进入被挂起状态。此时系统的垃圾回收机制准备回收该对象所占内存。在回收对象前,系统会调用所有可恢复对象的finalize()方法进行资源清理。如果系统在调用finalize()方法时重新让一个引用变量引用该对象,则这个对象将再次变成执行状态,否则变成被丢弃状态。

     3、被丢弃状态:当对象与所有引用变量被切断时,并系统已调用所有对象的finalize()方法依然没有使该对象变成执行状态,这个对象永久性得失去引用。此时,系统才会真正回收该对象所占有的资源。



     补充知识

                 当一个对象失去所有引用后,系统何时调用它的finalize()方法对它进行资源清理,何时它会被丢弃状态,系统何时回收它所占有的内存,这些对于程序完全透明。

                  程序无法精确控制Java垃圾回收的时间,但依然可以进行强制系统进行垃圾回收(这种强制只是通知系统进行垃圾回收,但系统是否进行垃圾回收不确定)。

                 1、强制垃圾回收方式:

                      >调用System类的gc()静态方法:System.gc();

                      >调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc()。

                 2、finalize()方法

                      Java提供了默认机制来清理该对象的资源,即使用finalize();

                      该方法定义在Object类中实例方法:protected void finalize() throws Throwable;

                      4个特征:

                             >不要主动调用某个对象的finalize()方法,该方法因交给垃圾回收机制调用;

                             >finalize()方法何时被调用,是否被调用具有不确定性,不能把该方法当成一定会被执行;

                             >当JVM执行可恢复对象的finalize()方法时,可使该对象或系统中其他对象重新变成可执行状态;

                             >当JVM执行finalize()方法时出现异常,垃圾回收机制不会通知异常,程序继续执行。





0 0
原创粉丝点击