一、运行时数据区域
Java虚拟机在Java程序运行时会将内存区域划分成若干个不同的区域,各自负责不同的职责,这些区域都有各自的用途。
- Java虚拟机运行时数据区分为以下几个部分。
- 方法区、虚拟机栈、本地方法栈、堆、程序计数器,如下图所示:
二、GC(垃圾回收机制)
对象已死吗?
在垃圾收集器进行回收前,第一件事就是确定这些对象哪些还存活,哪些已经死去。
3.2.1 引用计数算法
在对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器减1;其中计数器为0的对象是不可能再被使用的已死对象。
- 当两个对象相互引用时,这两个对象就不会被回收
- 引用计数算法,不被主流虚拟机采用,主要原因是它很难解决对象之间相互循环引用的问题。
3.2.2 可达性分析算法(DAG有向无环图原理)
通过一系列的称为GC Roots
的对象作为起始点,从这些节点开始向下搜索,搜索所经过的路径称为引用链(Reference Chain)
,当一个对象到GC Roots
没有任何引用链相连(在图论中称为对象不可达)时,这个对象就是不可用的。