JVM中垃圾回收机制是如何运作的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2865个文字,预计阅读时间需要12分钟。
概述Java运行时区域,程序计数器,虚拟机栈,本地方法栈三个区域随线程的创建而创建,随线程的结束而销毁。这些区域的内存分配和回收都具有确定性,无需过多考虑回收问题。
概述
Java运行时区域中,程序计数器,虚拟机栈,本地方法栈三个区域随着线程的而生,随线程而死,这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收问题。而Java堆和方法区则不一样,一个接口的多个实现类需要的内存不一样,一个方法的多个分支需要的内存可能也不一眼,我们只有在运行期,才能知道会创建的对象,这部分的内存分配和回收,是垃圾回收器所关注的。垃圾回收器需要完成三个问题:那些内存需要回收;什么时候回收以及如何回收。
那些垃圾需要回收
垃圾回收的基本思想是考察一个对象的可达性,即从根节点开始是否可以访问到这个对象,如果可以,则说明对象正在被使用,相反如果从根节点无法访问到这个对象,说明对象已经不再使用了,一般来说此对象就是需要被回收的。这个算法为根搜索算法。
可达性分析
但是实际中,一个不可达的对象有可能在某种条件下“复活”自己,那么对它的回收就是不合理的。为此给出一个对象可达性状态的定义,并规定了在什么状态下可以安全的回收对象。可达性对象包含了以下三种状态。
可达的:从根节点开始,按照引用节点,可以搜索到这个对象
可复活的:对象的所有引用都被释放,但是对象可能在finalize()方法中复活自己。
不可达的:对象的finalize()方法被调用,并且没有复活,那么就进入不可达状态。不可达的对象不可能会被“复活”,因为finalize()方法只能调用一次。
本文共计2865个文字,预计阅读时间需要12分钟。
概述Java运行时区域,程序计数器,虚拟机栈,本地方法栈三个区域随线程的创建而创建,随线程的结束而销毁。这些区域的内存分配和回收都具有确定性,无需过多考虑回收问题。
概述
Java运行时区域中,程序计数器,虚拟机栈,本地方法栈三个区域随着线程的而生,随线程而死,这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收问题。而Java堆和方法区则不一样,一个接口的多个实现类需要的内存不一样,一个方法的多个分支需要的内存可能也不一眼,我们只有在运行期,才能知道会创建的对象,这部分的内存分配和回收,是垃圾回收器所关注的。垃圾回收器需要完成三个问题:那些内存需要回收;什么时候回收以及如何回收。
那些垃圾需要回收
垃圾回收的基本思想是考察一个对象的可达性,即从根节点开始是否可以访问到这个对象,如果可以,则说明对象正在被使用,相反如果从根节点无法访问到这个对象,说明对象已经不再使用了,一般来说此对象就是需要被回收的。这个算法为根搜索算法。
可达性分析
但是实际中,一个不可达的对象有可能在某种条件下“复活”自己,那么对它的回收就是不合理的。为此给出一个对象可达性状态的定义,并规定了在什么状态下可以安全的回收对象。可达性对象包含了以下三种状态。
可达的:从根节点开始,按照引用节点,可以搜索到这个对象
可复活的:对象的所有引用都被释放,但是对象可能在finalize()方法中复活自己。
不可达的:对象的finalize()方法被调用,并且没有复活,那么就进入不可达状态。不可达的对象不可能会被“复活”,因为finalize()方法只能调用一次。

