IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JVM-(6)JVM GC -> 正文阅读

[Java知识库]JVM-(6)JVM GC

JVM GC

GC (Gabage Collection),即垃圾收集器

什么是垃圾

没有引用指向的对象就可以称为垃圾

Java 与 C++ 垃圾处理异同

如何寻找垃圾

引用计数法 (reference count)

???????在对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就会加一;当引用失效时,计数器的值就会减一;只要任何时刻计数器为零的对象就是不会再被使用的对象。虽然这种判断方式非常简单粗暴,但是往往很有用,不过,在 Java 领域,主流的 Hotspot 虚拟机实现并没有采用这种方式,因为引用计数法不能解决对象之间的循环引用问题

循环引用即 对象 A 与 对象 B 相互引用,虽然对象A与对象B的引用计数器数量都不为0,但是却没有其他引用指向A或B,那么这里的对象A和对象B都是垃圾

根可达性算法 (Root Searching)

当前主流的 JVM 都采用了可达性分析算法来进行判断,这个算法的基本思路就是通过一系列被称为GC Roots的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程走过的路径被称为引用链(Reference Chain),如果某个对象到 GC Roots 之间没有任何引用链相连接,或者说从 GC Roots 到这个对象不可达时,则证明此这个对象是无用对象,需要被垃圾回收。

在 Java 技术体系中,可以作为 GC Roots 进行检索的对象主要有:

在虚拟机栈(栈帧中的本地变量表)中引用的对象。
	
方法区中类静态属性引用的对象,比如 Java 类的引用类型静态变量。

方法区中常量引用的对象,比如字符串常量池中的引用。

在本地方法栈中 JNI 引用的对象。

JVM 内部的引用,比如基本数据类型对应的 Class 对象,一些异常对象比如 NullPointerException、OutOfMemoryError 等,还有系统类加载器。

所有被 synchronized 持有的对象。

还有一些 JVM 内部的比如 JMXBean、JVMTI 中注册的回调,本地代码缓存等。

根据用户所选的垃圾收集器以及当前回收的内存区域的不同,还可能会有一些对象临时加入,共同构成 GC Roots 集合。

深入理解看这篇:https://blog.csdn.net/qq_44802992/article/details/109909988

垃圾清除算法

① 标记清除 Mark Sweep


步骤:
1)通过Root Searching算法标记出存活对象
2)遍历堆内存,找出可回收的对象

标记清除算法缺陷:

1)产生内存碎片,回收的内存并不连续,难以管理。
2)产生了两次扫描,效率比较低。

② 标记复制算法

将内存大小划分为相等的两块,每次只使用其中一块,当内存使用完时将存活的对象复制到另一块,然后将这块内存空间清除

标记复制算法解决了内存碎片化的问题,但是空间浪费问题很明显,适用于存活对象较少的情况

② 标记压缩算法 Mark Compact

标记-复制算法虽然解决了内存碎片问题,但是没有解决复制对象存在大量开销的问题。为了解决复制算法的缺陷,充分利用内存空间,提出了标记-整理算法。该算法标记阶段和标记-清除一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。

参考: https://baijiahao.baidu.com/s?id=1713113300105186800&wfr=spider&for=pc

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:20:27  更:2022-05-12 16:22:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:33:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码