JVM(四、垃圾回收器)

1、概述

垃圾回收的三个问题:

  • 哪些内存需要回收?
  • 什么时候回收?
  • 如何回收?

在运行时数据区我们有了解到内存区域分为线程共享的线程独立的,程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,所以当方法结束或者线程结束时,内存自然会回收。

Java堆和方法区这两个区域有着不确定性,这部分内存的分配和回收时动态的,垃圾回收期所关注的也是这部分内存该怎么管理。

2、哪些内存需要回收

2.1、对象已死?

垃圾回收器在对堆回收之前就要确定哪些内存需要回收,哪些内存需要被回收要判断在此内存上的对象时候已经死亡,死亡的对象不可能再被使用。

2.1.1、引用计数法

引用计数法是再对象中添加一个引用计数器,每当有一个地方引用它时,计数器加一,当引用失效时,计数器减一。当计数器为0时,对象被视为死亡。

好处:原理简单、判定效率高。

坏处:很难解决一些特殊情况,比如相互引用的情况,两个对象相互引用,但又不被其他对象引用。

2.1.2、可达性分析算法

可达性分析算法:通过定义的一些GC Roots作为对象的起始节点集,根据引用关系向下搜索,搜索过的路径成为"引用链",如果一个对象到GC Roots之间没有任何引用链相连,对象被视为死亡。

GC Roots:

  • 虚拟机栈中的引用对象,线程中使用到的参数、局部变量、临时变量
  • 方法区中类静态属性引用的对象,引用类型静态变量
  • 方法区中常量引用的对象,字符串常量池的引用
  • 本地方法栈引用的对象
  • Java虚拟机内部的引用
  • 被synchronized持有的对象
  • 其他

2.1.3、引用

在JDK1.2之后,Java对引用的概念进行了扩充,引用分为4种:

  • **强引用:**传统的引用概念,最常见的引用赋值,只要强引用还在就不会被回收
  • **软引用:**还有用但非必须的对象,在系统要发生OOM之前,会回收这部分内存
  • **弱引用:**非必须的对象,比软引用更弱一点,下次垃圾回收就会被回收
  • **虚引用:**最弱的一种引用关系,只是为了能在这个对象被回收时收到一个系统通知

3、垃圾回收算法

3.1、分代收集理论

弱分代假说:绝大多数对象都是朝生夕灭的

强分代假说:熬过越多次垃圾回收器过程的对象就越难以消亡。

Java堆之所以分为新生代、年轻代、老年代,就是因为分代收集理论,每个区域所适用的垃圾回收算法也有所不同。

相关推荐
Mr. zhihao2 小时前
JVM 偏向锁 4 秒延迟:从源码动机到 JEP-374 废弃全链路
jvm·并发·偏向锁
孙克旭_3 小时前
JVM 入门详解:JVM、JRE、JDK 区别,JVM 基础结构梳理
java·开发语言·jvm
随遇而安zx3 小时前
【地基篇】---JVM 内存结构知识点(Java 8 运行时数据区深度解析)
java·开发语言·jvm
恒拓高科WorkPlus5 小时前
企业如何搭建安全内部通讯平台|企业内部通讯平台怎么选才更安全?
jvm·数据库·安全
随遇而安zx7 小时前
【地基篇】---JVM 类加载 源码解析(基于 Java 8)
java·jvm·python
ly76891 天前
JVM 类加载机制:打破双亲委派模型的实践与陷阱
jvm·热部署·spi·类加载器·双亲委派
随遇而安zx1 天前
【地基篇】---Java 8 JVM 知识大纲
java·开发语言·jvm
liangbo71 天前
01-JVM 内存模型全景
java·jvm
ly76891 天前
JVM 内存屏障与可见性:从 volatile 到 JSR-133 的底层实现
jvm·jit·volatile·内存屏障·jmm·jsr-133
晊晌_h2 天前
嵌入式从0到精通——线程
java·开发语言·jvm