当前位置: 首页 > news >正文

东莞家用台灯东莞网站建设wordpress回水印

东莞家用台灯东莞网站建设,wordpress回水印,卖主机 服务器的网站,浙江建设人才网官网1.对象已死吗? 在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象). 引计数法 引用计数算法是一…
1.对象已死吗?

在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象).

引计数法

引用计数算法是一种垃圾回收算法,它通过记录每个对象被引用的次数来判断对象是否已经成为垃圾并进行回收。当对象被创建时,其引用计数器初始化为0,当有其他对象引用该对象时,其引用计数器就会加1,当引用该对象的对象被销毁时,其引用计数器就会减1。当一个对象的引用计数器变为0时,即表示该对象已经没有被任何其他对象引用,可以被认为是垃圾对象,并被回收。

可达性分析

这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。

在Java语言中,可作为GC Roots的对象包括下面几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。
  • 方法区中类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象。
2.引用的分类

在JDK 1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。

  • 强引用就是指在程序代码之中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
  • 软引用是用来描述一些还有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2之后,提供了SoftReference类来实现软引用。
  • 弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK 1.2之后,提供了WeakReference类来实现弱引用。
  • 虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2之后,提供了PhantomReference类来实现虚引用。
3.三色标记算法
3.1三色标记标记流程

我们知道CMS垃圾回收器是通过可达性分析找到存活对象,然后给存活对象打个标记,最终在清理的时候,如果一个对象没有任何标记,就表示这个对象不可达,需要被清理。而标记算法就是使用三色标记算法。一般使用白色、黑色和灰色来表示。

  • 白色:说明这个对象没有被标记过,在初始阶段,所有对象都是白色,整个过程枚举完最后仍是白色的对象会被当做垃圾对象被清理。
  • 灰色:这个对象正在被标记,但是这个对象直接引用的对象中,至少还有一个没有被标记过。
  • 黑色:对象和他直接引用的所有对象都被标记过,对直接引用的对象下一级引用不做要求,比如A只引用了B,B引用了C、D,那么只要A和B都被标记过,A就是黑色,即使B所引用的C或D还没有被访问到,此时B就是灰色。

根据定义jvm中三色标记算法大致流程是:

  1. 首先从GC Roots开始标记,他们所有直接引用对象变成灰色,自己本身变为黑色(GC Roots对象本身不是垃圾),这里我们用队列去存储灰色对象,把这些灰色对象放到队列中。
  2. 然后从队列中取出灰色对象继续进行分析:将这个对象所有直接引用变成灰色,放入队列中,然后这个对象变为黑色;如果没有直接引用就直接变为黑色。
  3. 继续从队列中取出一个灰色对象,重复第二步,一直到灰色队列为空。
  4. 分析完后,仍然是白色的对象,就是不可大对象,可以作为垃圾被回收。
  5. 最后重置标记状态。

下面提供一个例子,加深下印象:

刚开始所有对象都是白色

三色标记初始阶段(标记的初始解读,不是CMS的初始标记),所有GC Roots直接引用(A、B)变成灰色,放入队列中,GC Roots变成了黑色

然后从灰色队列中取出一个灰色对象进行标记,比如A、将他直接引用C、D变成灰色,放入队列,A因为已扫描完它的直接引用对象,所以变成黑色:

继续从队列中取出灰色对象B,但是E没有直接引用其他对象,将B标记为黑色:

根据上述步骤,取出C 、D 对象进行分析,他们都没有直接引用其他对象,那么就变为黑色:

最终分析标记结束后,还有一个E对象是白色,说明此E 对象是一个垃圾对象,不可访问,可以被清理掉。

3.2三色标记的缺陷
  • 多标-浮动垃圾(标记为不是垃圾对象,变成了垃圾)

如果整个标记过程是STW的,那么没有任何问题,但是并发标记过程中,用户线程也在运行,那么对象引用关系很可能发生变化,进而导致前面提到过的两个问题的出现。

比如垃圾回收线程标记回到上面的这个状态:

此时E对象已经被标记为黑色,表示不是垃圾,不会被清除,因为处在并发标记阶段,同一时刻某个用户线将GC Roots和B对象之间的关系断开了(objRoots.b = null;),如图:

很显然,B对象变为了垃圾对象,但是由于之前被标记为黑色,就不会被当作垃圾回收,这种问题称之为浮动垃圾。

浮动垃圾的问题,影响不大,即使本次不清理,下次GC也会被清理,而且在并发清理阶段也会产生所谓的浮动垃圾,因为用户线程也在不断地断开引用,影响不大。

  • 漏标-错杀问题(标记为垃圾对象,变成了非垃圾)

如果一个非垃圾对象,变成了垃圾,后果就比较严重,再回到上面的状态:

这里标记线程执行到分析B对象,但是刚好发生线程切换,操作系统调度用户线程来运行,而用户线程先执行A.f = E;那么引用关系变成了

用户线程做完上述动作,GC线程重新开始运行,按照之前的流程继续走,从对类中取出B对象,发现对象没有直接引用,那么B对象变成了黑色:

接着继续取出 C、D 三个灰色对象,他们没有直接引用,那么变为黑色对象:

http://www.dtcms.com/a/612847.html

相关文章:

  • 在哪里可以找到做网站的公司阳江人社局官网招聘
  • 郑州网站设计价格2022年网页游戏排行榜
  • 个人可以做彩票网站吗涂料网站设计
  • 搭建一个网站需要哪些技术wordpress获取标签链接地址
  • 百度做的网站国外可以打开吗网络设计的原则有哪些
  • 服装定制网站源码android开发工具箱
  • 苏宁易购网站建设水平网络公司注册的流程
  • 吃的网站要怎么做网站平台怎么做推广
  • 上海 有哪些做网站的公司好手机网站知识
  • 专业网站制作哪家强搜索网页内容
  • 自己的网站怎么开男装网站模板演示
  • 做好网站建设和运营开发公司移交物业资料
  • 手机网站制作教程电商平台网站大全
  • 免费做国际网站网页统计代码大全
  • 汝州市城乡建设局网站wordpress如何给指定位置添加代码
  • 做课题查新网站微信群推广平台有哪些
  • 北京网站建设交易学校建设网站的目的和意义
  • 婚纱摄影 网站关键词 优化网站建设策dw php
  • 网站 数据库 模板韶关市住房和城乡建设局网站
  • wordpress搭建企业网站思路南通网站建设协议
  • 建站边检站深圳最近一个星期新闻
  • 贵州建设职业技术学院官方网站政务中心网站自身建设
  • aspcms网站地图生成南宁网站建设公司电话
  • 合川做网站地图网站开发
  • 不同性质网站的营销特点一览表房地产企业网站建设
  • 航天桥网站建设黑龙江网站设计
  • 华为官方网站手机商城首页手机网页怎么做出来的
  • 企业网站栏目设置宁波网站推广方法
  • 做网站需要模板吗自己注册个公司做网站怎么样
  • 苏州大学网站建设目标wordpress 51la