Java的内存分配与回收全部由JVM垃圾回收进程自动完成也就是GC。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。
了解Java 垃圾回收(GC)的基础:
- 垃圾回收简介
- 那些内存需要回收?
- 什么时候回收
- 如何回收?
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没有任何引用链相连,则证明此对象不可用。
如图:
2)、固定作为GC Roots的对象包括以下几种:
1、在虚拟机栈中引用的对象,比如各个线程被调用的方法堆栈中使用到的参数、局部变量等。
2、java中的静态变量
3、被synchronized关键字所持有的对象。