Java中的垃圾回收机制的介绍

  • 在C / C ++中,程序员负责创建和销毁对象。通常程序员忽略对无用物体的破坏。由于这种疏忽,在某些时候,为了创建新对象,可能无法获得足够的内存,并且整个程序将异常终止导致OutOfMemoryErrors
  • 但是在Java中,程序员不需要关心所有那些不再使用的对象。垃圾收集器会破坏这些对象。
  • 垃圾收集器是守护程序线程的最佳示例,因为它始终在后台运行。
  • 垃圾收集器的主要目标是通过销毁无法访问的对象来释放堆内存。

重要条款:

  1. 无法访问的对象:如果一个对象不包含任何引用,则称该对象无法访问。另请注意,作为隔离岛一部分的物体也无法到达。
    Integer i = new Integer(4);
    //可以通过'i'中的引用访问新的Integer对象 
    i = null;
    //无法再访问Integer对象。 
    

    Java中的垃圾回收机制

  2. 垃圾收集的资格:如果一个对象无法访问,则称其符合GC(垃圾收集)的条件。在上面的图像中,i = null之后; 堆区域中的整数对象4有资格进行垃圾回收。

使对象符合GC条件的方法

  • 即使程序员没有责任销毁无用的对象,但强烈建议不要求对象无法访问(因此符合GC条件)。
  • 通常有四种不同的方法可以使对象符合垃圾回收的条件。
      1. 取消引用变量
      2. 重新分配参考变量
      3. 在方法内创建的对象
      4. Island of Isolation

     

请求JVM运行垃圾收集器的方法

  • 一旦我们使对象符合垃圾收集条件,垃圾收集器可能不会立即销毁它。每当JVM运行垃圾收集器程序时,只会销毁对象。但是当JVM运行垃圾收集器时,我们不能指望。
  • 我们也可以请求JVM运行垃圾收集器。有两种方法可以做到:
        1. 使用System.gc()方法:System类包含静态方法gc(),用于请求JVM运行Garbage Collector。
        2. 使用Runtime.getRuntime().gc()方法运行时类 允许应用程序与运行应用程序的JVM进行交互。因此,通过使用其gc()方法,我们可以请求JVM运行垃圾收集器。
    // Java program to demonstrate requesting 
    // JVM to run Garbage Collector
    public class Test
    {
        public static void main(String[] args) throws InterruptedException
        {
            Test t1 = new Test();
            Test t2 = new Test();
            
            // Nullifying the reference variable
            t1 = null;
            
            // requesting JVM for running Garbage Collector
            System.gc();
            
            // Nullifying the reference variable
            t2 = null;
            
            // requesting JVM for running Garbage Collector
            Runtime.getRuntime().gc();
        
        }
        
        @Override
        // finalize method is called on object once 
        // before garbage collecting it
        protected void finalize() throws Throwable
        {
            System.out.println("Garbage collector called");
            System.out.println("Object garbage collected : " + this);
        }
    }
    

    输出:

    Garbage collector called
    Object garbage collected : Test@46d08f12
    Garbage collector called
    Object garbage collected : Test@481779b8

    注意 :

      1. 无法保证上述两种方法中的任何一种都能运行垃圾收集器。
      2. 调用System.gc()实际上等同于调用:Runtime.getRuntime().gc()

finalize()

    • 在销毁对象之前,垃圾收集器调用对象上的finalize()方法来执行清理活动。一旦finalize()方法完成,垃圾收集器就会销毁该对象。
    • finalize()方法存在于Object类中,具有以下原型。
      protected void finalize()抛出Throwable
      

      根据我们的要求,我们可以覆盖finalize()方法来执行清理活动,例如关闭数据库连接。

注意 :

    1. 垃圾收集器调用的finalize()方法而不是JVM。虽然垃圾收集器是JVM的模块之一。
    2. 对象类 finalize()方法具有空实现,因此建议覆盖finalize()方法以处置系统资源或执行其他清理。
    3. 对于任何给定对象,finalize()方法永远不会被多次调用。
    4. 如果finalize()方法抛出未捕获的异常,则忽略该异常并终止该对象的终止。
 
转载请保留页面地址:https://www.breakyizhan.com/java/4983.html
扫描二维码添加微信 
  • ,每次淘宝领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘50元优惠券!添加微信后回复机械键盘即可领取!
    支持我们,就用微信淘宝!