zoukankan      html  css  js  c++  java
  • Java基础知识强化83:System类之gc()方法(垃圾回收)以及和finalize()区别

    1. System概述:

    System类包含一些有用的类字段和方法。它不能被实例化。

    2. gc()方法:垃圾回收器

    1 public static void gc()

          调用gc方法暗示着Java虚拟机做了一些努力来回收未使用的对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回,虚拟机已经尽最大了努力从所有丢弃的对象中回收了空间。

    调用System.gc()方法实际上等效于调用:Runtime.getRuntime().gc()

    3. 代码实现:

    Person.java

     1 package cn.itcast_01;
     2 
     3 public class Person {
     4     private String name;
     5     private int age;
     6 
     7     public Person() {
     8         super();
     9     }
    10 
    11     public Person(String name, int age) {
    12         super();
    13         this.name = name;
    14         this.age = age;
    15     }
    16 
    17     public String getName() {
    18         return name;
    19     }
    20 
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24 
    25     public int getAge() {
    26         return age;
    27     }
    28 
    29     public void setAge(int age) {
    30         this.age = age;
    31     }
    32 
    33     @Override
    34     public String toString() {
    35         return "Person [name=" + name + ", age=" + age + "]";
    36     }
    37 
    38     @Override
    39     protected void finalize() throws Throwable {
    40         System.out.println("当前的对象被回收了" + this);
    41         super.finalize();
    42     }
    43 
    44 }

    SystemDemo.java

     1 package cn.itcast_01;
     2 
     3 /*
     4  * System类包含一些有用的类字段和方法。它不能被实例化。 
     5  * 
     6  * 方法:
     7  *         public static void gc():运行垃圾回收器。 
     8  *        public static void exit(int status)
     9  *        public static long currentTimeMillis()
    10  *        public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
    11  */
    12 public class SystemDemo {
    13     public static void main(String[] args) {
    14         Person p = new Person("赵雅芝", 60);
    15         System.out.println(p);
    16 
    17         p = null; // 让p不再指定堆内存
    18         System.gc();
    19     }
    20 }

    运行效果如下:

    4.总结:

          System.gc()可用于垃圾回收。当使用System.gc()回收某个对象所占用的内存之前,通过要求程序调用适当的方法来清理资源。在没有明确指定资源清理的情况下,Java提高了默认机制来清理该对象的资源,就是调用Object类的finalize()方法。

          finalize()方法的作用是释放一个对象占用的内存空间时,会被JVM调用。而子类重写该方法,就可以清理对象占用的资源,该方法有没有链式调用,所以必须手动实现。 从程序的运行结果可以发现,执行System.gc()前,系统会自动调用finalize()方法清除对象占有的资源,通过super.finalize()方式可以实现从下到上的finalize()方法的调用,即先释放自己的资源,再去释放父类的资源。

          但是,不要在程序中频繁的调用垃圾回收,因为每一次执行垃圾回收,jvm都会强制启动垃圾回收器运行,这会耗费更多的系统资源,会与正常的Java程序运行争抢资源,只有在执行大量的对象的释放,才调用垃圾回收最好。

    5. gc 和 finalize方法的区别:

    (1)finalize 类似 c++中析构函数,表示对象即将消亡时,调用此方法

         gc() 方法表示把拉级回收器启动,把拉圾收走
    (2)

         我们都知道Java垃圾回收器是负责回收无用对象占据的内存资源的,但是由于垃圾回收器只知道释放那些经由new分配的内存,对其他未使用new分配的内存空间则无能为力。针对此情况,Java允许在类中定义一个名为finalize()的方法

         而System.gc()则是启动一个垃圾回收器,在释放new分配内存空间之前,将会通过finalize()释放用其他方法分配的内存空间(如本地方法调用C中用new分配的内存空间)

         gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内 存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行 内存回收就要靠finalize().


          举个例子来说,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了 free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法 调用它(free()).


           finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.

  • 相关阅读:
    Android 下压缩图片—微弱失真
    android中ViewHolder通用简洁写法
    Android裁剪固定大小头像的功能
    Android进度加载的Loading效果
    GitHub开源项目总结
    Android 实现emoji表情的demo
    vim 高级使用技巧第二篇
    android apk 防止反编译技术第一篇-加壳技术
    Android Metro风格的Launcher开发系列第二篇
    FFMPEG高级编程第一篇:环境搭建及编译
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4837886.html
Copyright © 2011-2022 走看看