一、起源

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

二、概要

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

Java堆、方法区:需要考虑垃圾回收

三、垃圾回收算法

1 引用计数算法

2 可达性分析算法

垃圾收集算法

1 标记-清除算法

Mark-Sweep

最基础的垃圾收集算法

不足

效率问题:标记和清除的过程效率不太高

空间问题:标记清除之后产生大量的碎片,再分配较大的对象时,由于空间不足不得不再进行另一次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)

java 回收策略_Java堆回收策略相关推荐

  1. java 垃圾回收 新生代_Java垃圾回收

    一.概述 Java垃圾回收器实现内存的自动分配和回收,这两个操作都发生在Java堆上(还包括方法区,即永久代).垃圾回收操作不是实时的发生(对象死亡不会立即释放),当内存消耗完或者是达到某一指标(th ...

  2. 6种java垃圾回收算法_Java垃圾回收机制

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  3. java内存 海子_Java垃圾回收机制 - 海 子

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  4. java垃圾回收菜鸟_java垃圾回收机制

    1:对象可能不被垃圾回收 2:垃圾回收并不等于"析构" 3:垃圾回收只与内存有关,为了回收程序不再使用的内存 java虚拟机采用了"自适应"的垃圾回收机制,即& ...

  5. java 设计模式 示例_Java中的策略设计模式-示例教程

    java 设计模式 示例 策略模式是行为设计模式之一 . 当我们对一个特定的任务有多种算法并且客户决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客 ...

  6. java gc回收算法_Java GC回收算法-判定一个对象是否可以回收

    开源推荐 推荐一款一站式性能监控工具(开源项目) Pepper-Metrics是跟一位同事一起开发的开源组件,主要功能是通过比较轻量的方式与常用开源组件(jedis/mybatis/motan/dub ...

  7. 6种java垃圾回收算法_Java垃圾回收算法

    主要根据以下3篇博客做的整理 http://blog.csdn.net/zsuguangh/article/details/6429592 http://www.cnblogs.com/ywl925/ ...

  8. java finalize逃脱_Java对象回收与finalize方法

    生存还是死亡 事实上,即使被可达性分析算法判断为不可达,对象也不是"非死不可",对象会先进入"缓刑"状态.要真正宣告一个对象死亡,至少要经历两次标记过程: 如果 ...

  9. 垃圾回收算法_Java 垃圾回收算法与几种垃圾回收器

    一.如何确定某个对象是"垃圾"? 目前主流垃圾回收器都采用的是可达性分析算法来判断对象是否已经存活,不使用引用计数算法判断对象时候存活的原因在于该算法很难解决相互引用的问题.如何确 ...

最新文章

  1. 菜鸟配置SAMBA服务之4
  2. python的celery的面试_python 面试
  3. 35岁前必做10件事 让你少奋斗8年挣足钱
  4. Practice:在2008 core上部署和管理DHCP服务器
  5. js 判断一个字符在字符串中出现的次数
  6. 前端学习(2537):vue源码解析2伪数组转换为真数组
  7. C++工作笔记-简单工厂模式基础(用静态类传入函数指针,再进行调用)(仿大佬代码)
  8. 编写可阅读代码的艺术 培训实践 第一部分 表面层次的改进
  9. 报错,ERROR 8324 --- [io-12000-exec-8] c.y.cols.controller.CardTypeController
  10. 试解析Tomcat运行原理(一)--- socket通讯
  11. WinPE作为启动硬盘
  12. Office 365身份认证管理-安装并配置活动目录同步
  13. Linux命令解释之fdisk
  14. bandzip关闭右键新建文件夹选项方法步骤
  15. 碧海威 L7多款产品 后台命令执行漏洞
  16. 搭建Android开发环境——Eclipse
  17. refresh( )
  18. vscode背景的更换_vscode背景图怎么换
  19. PMP新考纲 敏捷题目 (一)
  20. linux考试中的7654_Excel工作表G8单元格的值为7654.375,执行某些操作之后,在G8单元格中显示一串“”符号,说明G8单元格的()...

热门文章

  1. server2016 查看图片 预览图片
  2. 遥感图像处理-阴影检测
  3. Uncaught TypeError: Cannot read property 'setAttribute' of null
  4. 从ReLU到Sinc,26种神经网络激活函数可视化
  5. python where 多条件
  6. Only call `sigmoid_cross_entropy_with_logits` with named arguments解决
  7. Python2、Python3相对路径、绝对路径导入
  8. Gradle project refresh failed
  9. github高级搜索
  10. 浙江省单招单考计算机专业,2016浙江省单招单考《计算机类》试题卷