文档章节

Java堆回收策略

o
 osc_ogi0qclx
发布于 2019/08/23 21:36
字数 897
阅读 10
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

一、起源

1960年Lisp语言: 第一门真正使用内存动态分配和垃圾回收的语言。

二、概要

  • 线程相关:程序计数器、虚拟机栈、本地方法栈,不需要考虑垃圾回收
  • Java堆、方法区:需要考虑垃圾回收

三、垃圾回收算法

 

1 引用计数算法

 

2 可达性分析算法

 

垃圾收集算法

1 标记-清除算法

Mark-Sweep
最基础的垃圾收集算法

不足

  1. 效率问题:标记和清除的过程效率不太高
  2. 空间问题:标记清除之后产生大量的碎片,再分配较大的对象时,由于空间不足不得不再进行另一次GC操作。

2 复制算法


Copying

  • 半个区的内存回收后挪到另外半个区
  • 只需要移动堆顶指针,按顺序分配内存。

不足

每次都只能使用半个区的内存。

重点

现在的商业虚拟机都采用复制算法回收新生代。
新生代98%的对象都是朝生夕死的,所以不需要1:1比例划分内存空间。
分为一个Eden区,两个survivor区
HotSpot默认内存 8:1 比例,只有10%内存被浪费。
Survivor区不够用老年代。

3 标记-整理算法


Mark-Compact

 

原理


如果复制算法不想浪费50%的内存空间,就要有额外的空间担保Survivor区。用来应对所有对象都存活的情况。
所以老年代不能用复制算法。

流程


先标记,然后不直接清理,而是所有存活对象向一端移动。清理掉端边界以外的内存。

 

 

四、分代收集算法


Generational Collection

 

五、HotSpot 算法实现

 

枚举根节点


可达性分析


GC Root:全局性引用(常量、类静态属性)、执行上下文(栈帧的本地变量表)
GC停顿:分析工作必须在一个能确保一致性的快照中进行。所以GC时必须停顿所有Java线程。

 

准确式GC

不需要检查所有的执行上下文和全局的引用位置。
HotSpot使用OopMap在类加载完成时,计算对象内什么偏移量是什么类型。JIT编译过程中记录栈和寄存器哪些位置是哪些引用。

 

安全点

不为所有指令都生成OopMap(占用空间大),只在特定的位置生成--安全点(Safe Point)

安全点选定标准


是否具有让程序长时间执行的特征--指令复用,如方法调用、循环跳转、异常跳转。

所有线程都跑到安全点停顿(不包括JNI线程)

抢先式中断(Preemptive Suspension)


- 线程先全部中断,有不在安全点上的就恢复,跑到安全点上再中断。
- 现在没有虚拟机这么实现。

主动式中断(Voluntary Suspension)

- 设置一个标志,在轮询标志的时候发现标志是真就挂起。
- 轮询标志的位置:SafePoint;创建对象需要分配内存的位置。

安全区

 

背景


1. 没有分配CPU时间的时候执行不到安全点。
2. 线程处于Sleep或Blocked状态

原理


1. 一段代码片段中,引用关系不会发生变化,在这个区域中的任意地方开始GC都是安全的。
2. 线程进入Safe Region时标识自己进入SafeRegion

 

六、垃圾收集器

新生代垃圾收集器


Serial


ParNew


Parallel Scavenge

 

老年代垃圾收集器


Serial Old


Parallel Old


CMS(Consurrent Mark Sweep)


G1(Garbage First)

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1.1K
0
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.4K
0
Java™ 编译器--Janino

Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,...

匿名
2013/04/02
4.1K
0
CSS 选择器--Q.js

1, 和Sizzle的兼容 Q(expr, context, result, seed) Q.matches 支持Sizzle特别的setFilter伪类如:even,:first,:last,:lt... 支持复杂的:not和:has选择器(和sizzle一样) 2, 结果的正确性 Si...

hackwaly
2012/10/23
4.6K
0
高效 Java Web 开发框架--JessMA

JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate、MyBatis 与 JDBC DAO 组件),集成了 Action 拦截...

伤神小怪兽
2012/11/13
9.2K
3

没有更多内容

加载失败,请刷新页面

加载更多

SQL 语句大全

点击上方“掌上编程”,选择“置顶或者星标” 优质文章第一时间送达! 一、基础 「1、说明:创建数据库」 CREATE DATABASE database-name    「2、说明:删除数据库」 drop database ...

GeneralMa
昨天
0
0
山东创睦网络科技有限公司:使用Python爬取全球新冠肺炎疫情数据

使用Python爬取全球新冠肺炎疫情数据 导入所需库包 获取实时数据的url 正式编写程序 查看输出结果 导入所需库包 在获取数据之前,我们需要先安装好所需的包requests和pandas: 1.如果是使用p...

osc_qv1fwke0
7分钟前
0
0
如何1年获得别人3年的工作经验(深度好文)

最近有同学问我,为什么你的工作年限不长,技术却这么厉害,我笑了笑,啥也没说。 我不是不想回答,是不知道怎么回答。在他们的定位可能就是,每方面都懂一点,遇到问题能够快速解决,就是比...

zhang_rick
今天
0
0
新基建带动行业

什么是“新基建”? 什么是“新基建”? 根据央视发布的信息来看,其涵盖了5G基站建设、新能源汽车充电桩、大数据中心、人工智能、工业互联网,特高压,城际以及城轨交通,涉及了七大领域和相...

osc_anefoz50
8分钟前
0
0
怕入错行?这群技术人写了本“择业指南”

计算机专业好找工作吗?哪些方向是当前的主流和热门方向呢? 计算机专业的你是不是还在为职业发展纠结犹豫呢? 刚经历完高考选专业的你是不是还在迷茫徘徊呢? 那么福利来啦! 《软件技术职业...

阿里云云栖号
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部