• Tags         
  • 2018-07-26  15:36:39        
  • 100 °C    

    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