Java的内存回收

学习目标

JVM何时决定回收一个Java对象所占用的内存

JVM是否会漏掉某些Java对象,使之造成内存泄漏

JVM回收Java对象所占用的内存细节

JVM能否对不同的java对象占用的内存区分对待、回收

常见的垃圾回收器的实现细节

Java的引用的种类

Java内存管理包括内存分配和内存回收。

Java的垃圾回收机制采用有向图方式来管理内存中的对象,如下列程序

Class Node

{

    Node next;

String name;

public Node(String name){

  This.name = name;

}

}

public class NodeTest{

Public static void main(String[] args){

   Node n1 = new Node(“第一个节点”);

Node n2 = new Node(“第二个节点”);

Node n3 = new Node(“第三个节点”);

n1.next = n2;

n3 = n2;

n2 = null;

}

}

有向图表示如下:

 
   

 

 

 

 

 

 

 

 

 

一个对象在堆内存中运行时,可以把它所处的状态分为3种

可达状态:当对象被创建后,有一个以上变量引用它。

 

可恢复状态:如果程序中某个对象不再有任何变量引用它,它将进入可恢复状态,此时从有向图中的起始顶点不能找到该对象。在回收该对象之前,系统会调用finalize方法进行资源清理。

 

不可达状态:当对象的所有的关联都被切断,且系统调用所有对象的finalize方法依然没有使该对象变成可达状态,那这个对象将永久性的失去引用。

 
   

 

 

 

 

 

 

 

 

 

 

 

 

 

对垃圾回收机制来说,判断一个对象是否可回收的标准就在于该对象是否被引用,因此引用也是JVM进行内存管理的重要概念。下面将介绍四种引用:

  1. 强引用

程序创建一个程序,并将其赋值给一个引用变量,这个引用变量就是强引用。

JVM是不会回收强引用的Java对象,因此强引用就是造成内存泄漏的主要原因。

  1. 软引用

软引用是通过SoftReference类来实现,对于软引用而言,当系统内存充足时,他不会被系统回收,当系统内存不足时,系统将回收他。

  1. 弱引用

弱引用是通过类WeakReference来实现,对于弱引用的对象而言,不管内存是否充足,系统都会回收它。

  1. 虚引用

虚引用的主要作用是跟踪对象被垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用所引用的对象是否将被垃圾回收。

虚引用必须要和引用队列一起使用。

Java的运行时的数据区域

  1. 程序计数器

作用:在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程活动都需要依赖该计数器来完成。

同时,由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的。在任何一个时间内,一个处理器只能处理一个线程。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数互不影响,独立存储。称这类内存区域为“线程私有”

  1. Java虚拟机栈

作用:它也是线程私有的,

Java虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈,动态链接、方法出口等信息。

每一个方法的从调用直至执行完成的过程,就对应着栈帧在虚拟机中入栈和出栈的过程。

局部变量表:存放编译期可知的各种基本数据类型、对象引用和returnAddress类型。局部变量表在编译期就完成了内存的分配。方法在运行期间是不会改变局部变量表的大小。

Java虚拟机栈,会出现两种异常状况:若果线程的请求深度大于虚拟机所容许的深度,将抛出StackOverflowError异常。如果虚拟机动态扩展是无法申请到足够的内存时,就会抛出OutOfMemoryError异常。

  1. 本地方法栈

同Java虚拟机栈类似

  1. Java堆

是内存中最大的一块,Java堆是被所有线程共享的区域,此内存区域的目的就是存放对象实例。

Java堆是垃圾回收器的主要区域,因此,从内存回收的角度看, Java堆可以分为新生代、老年代。

  1. 方法区

也是线程共享区域,主要存储的是已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

posted @ 2017-03-15 10:38  Aladar  阅读(100)  评论(0编辑  收藏  举报