Java虚拟机如何实现垃圾收集机制详解?

2026-04-30 09:181阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计4675个文字,预计阅读时间需要19分钟。

Java虚拟机如何实现垃圾收集机制详解?

1+垃圾收集区域+介绍过Java内存运行区域,其中程序计数器、虚拟机栈、本地方法栈三个区域线程共享。栈中的每个栈帧分配多少内存基本由类结构决定。

1 垃圾收集发生的区域

之前我们介绍过 Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程共存亡。栈中的每一个栈帧分配多少内存基本上在类结构确定下来时就已知,因此这几个区域的内存分配和回收都具有确定性,不需要考虑如何回收的问题,当方法结束或线程结束,内存自然也跟着回收了

而 Java 堆和方法区这两个区域则有显著的不确定性,只有在程序运行时我们才能知道程序究竟创建了哪些对象,创建了多少对象,所以这部分内存的分配和回收是动态的,垃圾收集器所关注的正是这部分内存该如何管理

2 如何判定需要被回收的对象?

如果一个对象没有被其他对象引用,则证明这个对象可以被回收,因为它已经没有实际用途了。那我们怎么去判断一个对象是否可回收呢?业界主要有两种判断方式:

1. 引用计数法
在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加一;当引用失效,计数器值减一;任何时刻计数器值都为零的对象就是不可能再被使用了。这种方法虽然会占用额外的内存空间用于计数,但它的原理简单,判定效率也高,大多数情况下它都是一个不错的算法。然而,这个看似简单的算法却需要考虑很多额外情况,否则将无法保证其正确工作,例如单纯的引用计数法就很难解决对象之间相互循环引用的问题

2. 可达性分析算法
该算法的基本思路是通过一系列称为 GC Roots 的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程走过的路径称为引用链。

阅读全文

本文共计4675个文字,预计阅读时间需要19分钟。

Java虚拟机如何实现垃圾收集机制详解?

1+垃圾收集区域+介绍过Java内存运行区域,其中程序计数器、虚拟机栈、本地方法栈三个区域线程共享。栈中的每个栈帧分配多少内存基本由类结构决定。

1 垃圾收集发生的区域

之前我们介绍过 Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程共存亡。栈中的每一个栈帧分配多少内存基本上在类结构确定下来时就已知,因此这几个区域的内存分配和回收都具有确定性,不需要考虑如何回收的问题,当方法结束或线程结束,内存自然也跟着回收了

而 Java 堆和方法区这两个区域则有显著的不确定性,只有在程序运行时我们才能知道程序究竟创建了哪些对象,创建了多少对象,所以这部分内存的分配和回收是动态的,垃圾收集器所关注的正是这部分内存该如何管理

2 如何判定需要被回收的对象?

如果一个对象没有被其他对象引用,则证明这个对象可以被回收,因为它已经没有实际用途了。那我们怎么去判断一个对象是否可回收呢?业界主要有两种判断方式:

1. 引用计数法
在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加一;当引用失效,计数器值减一;任何时刻计数器值都为零的对象就是不可能再被使用了。这种方法虽然会占用额外的内存空间用于计数,但它的原理简单,判定效率也高,大多数情况下它都是一个不错的算法。然而,这个看似简单的算法却需要考虑很多额外情况,否则将无法保证其正确工作,例如单纯的引用计数法就很难解决对象之间相互循环引用的问题

2. 可达性分析算法
该算法的基本思路是通过一系列称为 GC Roots 的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程走过的路径称为引用链。

阅读全文