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(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.

原文地址:https://www.cnblogs.com/hebao0514/p/4837886.html