文档章节

垃圾收集器与内存分配策略(三)之HotSpot的算法实现

PrivateO2
 PrivateO2
发布于 2017/08/01 10:19
字数 1040
阅读 1
收藏 0
点赞 0
评论 0

垃圾收集器与内存分配策略(三)——HotSpot的算法实现

 

  在HotSpot虚拟机上实现这些算法时,必须对算法的执行效率有着严格的考量,才能保证虚拟机高效地运行。

1、 枚举根节点

  采用可达性分析从GC Roots节点中找引用链为例

  存在的缺点:
  1、在前面找出还存活对象时,采用可达性分析从GC Roots节点中找引用链时,可作为GC Roots的节点主要在全局性的引用(方法区的常量或类静态属性引用)与执行上下文(虚拟机栈栈帧中的本地变量表或本地方法栈中的Native方法的引用)中,很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,必然会消耗很多时间。

  2、可达性分析对时间的敏感还体现在GC停顿上,因为这项工作必须在一个能确保一致性的快照中进行。“一致性值的是”GC进行时必须停顿所有Java执行线程(Stop The World)。

  HotSpot的解决方式
  1、当执行系统停下来时,不需要检查完所有的全局和执行上下文的引用位置,HotSpot采用一组称为OopMap的数据结构来记录那些地方存放着对象的引用。

  2、JIT(即时编译)编译过程中也会在特定位置记录下栈和寄存器中那些位置是引用。

 

2、 安全点

  如果为每一条指令都生成对应的Oopmap,会需要大量的额外空间,GC成本增高。其实HotSpot虚拟机并不是在为每条指令都生成了Oopmap,程序执行时也并非在任何地方都能停下来开始GC,只能到达特定位置才能开始记录,这些特定位置称为安全点(Safepoint)。

  安全点的选择:是否具有让程序长时间执行的特征(比如:方法调用,循环跳转,异常跳转等)。

  在GC发生时如何让所有线程跑到最近的安全点再停止有二种方案:

  1、抢先式中断:不需要线程的执行代码主动去配合,在GC发生时,首先把所有线程全部中断,如果发现有线程中断的地方不在安全点上,就恢复线程,让它“跑”到安全点上。 现在几乎没有虚拟机实现采用抢先式中断来暂停线程从而响应GC事件。

  2、主动式中断:当GC需要中断线程的时候,不直接对线程操作,仅仅简单地设置一个标志,各个线程执行时主动去轮询这个标志,发现中断标志为真时就自己中断挂起。轮询标志的地方和安全点是重合的,另外再加上创建对象需要分配内存的地方。

 

3、 安全区域

  当程序不执行的时候即没有分配CPU时间,比如:线程处于Sleep状态或Blocked状态,对于这种情况就需要安全区域(Safe Region)来解决。

  安全区域指在一段代码片段中,引用关系不会发生变化。在这个区域的任意地方开始GC都是安全的,或则可以将安全区域看做时扩展过得安全点。

  安全区域工作原理:在线程中执行到安全区域的代码时,首先标识自己已经进入了安全区域,若在这段时间JVM要发起GC时,就不用管标识自己为安全区域状态的线程了。在线程执行完安全区域的代码要离开安全区域时,当前线程要检查当前系统是否已经完成了根节点枚举(或是整个GC过程),若系统已完成则可以离开安全区域;若系统未完成,则它就必须等待直到可以离开安全区域为止。

© 著作权归作者所有

共有 人打赏支持
PrivateO2
粉丝 0
博文 45
码字总数 64704
作品 0
成都
程序员
《深入理解Java虚拟机 JVM高级特性...》核心笔记

深入理解Java虚拟机 JVM高级特性与最佳实践(第二版) 核心笔记 JAVA 环境: JAVA虚拟机高级特性: 一:java内存区域与内存异常 一):运行数据区 1:程序计数器(Program Counter Register),也...

洋哥6 ⋅ 2015/10/06 ⋅ 0

jvm系列(三):GC算法 垃圾收集器

这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理。 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世...

ityouknow ⋅ 2017/09/20 ⋅ 0

JVM初探- 内存分配、GC原理与垃圾收集器

JVM初探- 内存分配、GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念上可简单认为时分配外, 我们着重...

hanqing280441589 ⋅ 2016/12/30 ⋅ 0

Java GC 的那些事

一、收集算法 垃圾收集算法主要有:标记-清除、复制和标记-整理。 1、标记-清除算法 对待回收的对象进行标记。 算法缺点:效率问题,标记和清除过程效率都很低;空间问题,收集之后会产生大量...

xrzs ⋅ 2013/04/20 ⋅ 1

Java 内存区域和GC机制

目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况   Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与...

Lunqi ⋅ 2015/09/17 ⋅ 1

垃圾收集器与内存分配策略

阅读《深入理解Java虚拟机》艺术第三章“垃圾收集器与内存分配策略”,对本章中重要概念进行抄写,以便后续记忆及理解。 在堆里存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回...

无聊书生 ⋅ 2015/08/10 ⋅ 0

JVM垃圾回收总结

垃圾回收包含的内容不少,但顺着下面的顺序捋清知识也并不难。首先要 搞清垃圾回收的范围(栈需要GC去回收吗?),然后就是回收的前提条件 如何判断一个对象已经可以被回收(这里只重点学习根...

Kerry_Han ⋅ 2014/10/27 ⋅ 0

【转】JVM内存管理:深入垃圾收集器与内存分配策略

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项技术当...

mj4738 ⋅ 2011/12/01 ⋅ 1

Hotspot 性能架构 -转

第一章:介绍和概述 Java HotSpot虚拟机是Sun公司的Java平台一个高效的虚拟机实现。Java HotSpot技术提供Java标准平台的基础设施,提供对快速开发、部署关键业务的桌面和企业应用程序的解决方...

刘小兵2014 ⋅ 2011/10/18 ⋅ 0

JAVA 垃圾收集器与内存分配策略

引言 垃圾收集技术并不是Java语言首创的,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。垃圾收集技术需要考虑的三个问题是: 哪些内存需要回收 什么时候回收 如...

jiangmitiao ⋅ 2015/07/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 21分钟前 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 27分钟前 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 30分钟前 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 33分钟前 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 34分钟前 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 37分钟前 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 45分钟前 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 54分钟前 ⋅ 0

vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、一般模式下复制粘贴剪切

VIM Vim 是 UNIX 文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff),语法高亮,全面的帮助系统,本地脚本(Vimscript),和便于选择的...

蛋黄Yolks ⋅ 今天 ⋅ 0

springboot+mockito测试controller层遇到的问题

使用MockitoJUnitRunner测试的一个例子,原来报错无法找到bean, 类似的异常如下:createBeanError..... 原因:是因为@Runwith使用了SpringRunner,应该修改为MockitoJUnitRunner 代码如下: ...

writeademo ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部