Java的内存分配与回收全部由JVM垃圾回收进程自动完成也就是GC。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。

了解Java 垃圾回收(GC)的基础:

  1. 垃圾回收简介
  2. 那些内存需要回收?
  3. 什么时候回收
  4. 如何回收?

Java 垃圾回收是一项自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM 解除了程序员在程序中分配和释放内存资源的开销。

启动Java垃圾回收

作为一个自动的过程,程序员不需要在代码中显示地启动垃圾回收过程。System.gc()和Runtime.gc()用来请求JVM启动垃圾回收。

虽然这个请求机制提供给程序员一个启动 GC 过程的机会,但是启动由 JVM负责。JVM可以拒绝这个请求,所以并不保证这些调用都将执行垃圾回收。启动时机的选择由JVM决定,并且取决于堆内存中Eden区是否可用。JVM将这个选择留给了Java规范的实现,不同实现具体使用的算法不尽相同。

1、如何判断对象已死?

我们都知道Java几乎所有的对象实例都是存放在堆里,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象哪些还存活,哪些已经死去,即不可能再被使用的对象。

Jvm有两种方式来判断对象是否存活:

(1)引用计数算法

(2)可达性分析

 

1、引用计数算法

      在对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1,当引用失效时,计数器就减1.任何时刻计数器为0的对象则不可能再被使用。

 

2、可达性分析

     1)、这个算法的基本思路通过一系列称为“GC Roots”的根对象来判定作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为引用链,如果某个对象到GC Roots没有任何引用链相连,则证明此对象不可用。

如图:

java进程池使用实例 java进程gc详情_垃圾回收

2)、固定作为GC Roots的对象包括以下几种:

        1、在虚拟机栈中引用的对象,比如各个线程被调用的方法堆栈中使用到的参数、局部变量等。

        2、java中的静态变量

        3、被synchronized关键字所持有的对象。