垃圾回收机制是怎么判断一个对象是否存活的,为什么要讲这个呢,这个讲完你就明白,新生代是怎么做晋升的,他的存活有几个方向点,垃圾回收对象是怎么判断存活的,哪几种,首先第一种引用计数法,根搜索法,GC roots,引用计数法已经被淘汰掉了,他有一个非常致命的缺点,就是循环依赖的问题,引用计数法的原理,比如我new一个对象的时候,我创建User对象出来了,拿到new User()对象的时候,每个对象有一个年龄,如果小于或者等于15岁的话,它会存放在新生代里面,如果大于15岁,就会存放在老年代里面,比如你创建一个对象的时候,我每次GC会不定时的去回收,如果对象呗继续使用,被引用,年龄会加1,如果没有被继续回收,年龄减1,默认年龄是0岁的,你刚出生的时候是0岁的,如果GC的时候你再被引用,你就加1,如果发现你没有被继续使用,那就减1,如果再次GC的时候你又没有被引用,那就继续减1,变1岁了,如果再次GC的时候你没有被使用,那就继续减1,那就变成0岁了,如果年龄为0岁的话,会被垃圾回收机制认为是不可达对象,会被清理掉,但是这种算法叫引用计数法,给每个对象做一个标记,一旦你被使用的情况下,我就加1岁,没有被继续使用的情况下就减1岁,如果是0岁的情况下,我会认为是不可达对象清理掉了,这个就叫引用计数法,引用计数法其实有一个非常大的缺点,因为引用技术法现在没有被使用掉了不推荐大家使用引用计数法,他有一个循环依赖的问题,什么是循环依赖问题
package com.learn.test;public class ReferenceCountingGC{public Object instance = null;private static final int OneM = 1024 * 1024;private byte[] bigSize = new byte[2 * OneM];public static void testCG(){/*** 这里new了两个对象A和B* 如果你new了A和B以后*/ReferenceCountingGC objA = new ReferenceCountingGC(); ReferenceCountingGC objB = new ReferenceCountingGC(); /*** B赋给A*/objA.instance = objB;/*** A赋给B* GC回收的时候也不会为0* 就会导致这个对象不会被回收掉* 有一个非常大的缺陷* GC日志的一个分析* GC分析的时候你就会知道一个整体的过程了* 年龄在计数法里也算是一个标记* 引用就加1* 没有引用就减1* 其实是一个例子* 就是闭环依赖* 你把B给了A,然后A给了B* 如果你再使用循环依赖的情况下* 那么这个时候怎么样呢* 你再把两个对象置为空的情况下* 很难知道他到底是被引用掉了* 一个是循环依赖的问题* 循环依赖很难知道这个对象到底有没有被引用* 很难判断出来* 所以会产生闭环* 就很难使用引用计数法标记为0* 如果你不把他标记为0的情况下* 这个时候GC就不会被回收掉了* 这是一个比较大的缺陷* 一个对象刚创建的时候* 它会放在EDEN区的时候* 他如果年龄超过15岁的时候* 那这个时候会怎样呢* 会直接进入到老年代里面去的* 到老年代的时候回收就不是很频繁了* 就已经非常稳定了* 引用计数法你也可以去了解一下* 引用计数法已经淘汰掉了* 他有一个比较大的缺陷*/objB.instance = objA;/*** 这边有一个对象* */objA = null;objB = null;System.gc();}}

如何判断对象是否存活之引用计数发相关推荐

  1. 深入理解JVM(三)——JVM之判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文转载自https://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Ja ...

  2. 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还"存活"着,哪些对 ...

  3. java中对象的生存期_深入理解Java虚拟机-判断对象是否存活算法与对象引用

    我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题.另外,本文还要谈 ...

  4. 垃圾回收器判断对象是否存活

    转载自:http://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Java ...

  5. 三、垃圾收集之判断对象是否存活

    2019独角兽企业重金招聘Python工程师标准>>> 一.引用计数算法 当有一个地方引用这个对象时,计数器加1 当引用失效时,计数器减1 当计数器为0时,则对象死亡,等待回收 二. ...

  6. 如何判断对象是否存活之根搜索算法

    根搜索算法有没有人了解过的,在垃圾回收机制里面判断对象存活,主要是使用根搜索算法进行实现的,根搜索算法可能稍微有点抽象,算法是怎么进行实现的,又叫GCRoots,类似于树形结构一样的,他怎么样进行实现 ...

  7. JVM判断对象是否存活

    引用计数法 可达性分析算法 引用计数法 给对象添加一个引用计数器,每当有一个地方引用,计数器就加1,当引用失效,计数器减1,计数器为0的对象没有被使用,Java中没有使用引用计数法,原因是引用计数法无 ...

  8. JVM怎么判断对象是否存活

    https://blog.csdn.net/qq_29860591/article/details/111244593

  9. 利用JSP内置的Application对象实现的网站引用计数

    源代码: <%@ page import="java.io.*,java.util.*" %><html> <head> <title&g ...

最新文章

  1. c++自底向上算符优先分析_词法分析程序的自动生成器(二)——Thompson算法
  2. SAP UI5 的 sap-ui-bootstrap script 脚本标签各属性解析
  3. 第六篇:Spring Boot 访问静态资源
  4. java 字符串实例_Java字符串实例
  5. 用C#编写一个抓网页的应用程序
  6. 微信又更新了,“拍一拍”玩法升级...
  7. 微课|玩转Python轻松过二级(2.2.2节):关系运算符
  8. Ajax实现--javascript
  9. 区块链社会:解码区块链全球应用与投资案例
  10. 31省“5G应用”主攻方向+责任单位一览!
  11. PHP如何实现二维码的生成以及识别(代码)
  12. 雨林木风YN9.9三分极速速终结版 http://www.51ylmf.cn
  13. Java项目前后端文件简体转换繁体
  14. 基于FFT的ofdm系统框图
  15. html5 observer api,转: HTML5新特性之Mutation Observer
  16. h5显示微信公众号文章
  17. 【QCM2150】WCN3680 WFA WPA3 STA 5.6.1测试失败
  18. 原生js时间格式化方法封装
  19. tomcat配置启动端口和默认项目及默认404
  20. 美女主持直播,被突发意外打断!湾区网友却高喊: 我懂!超甜

热门文章

  1. 索引键的唯一性(3/4):唯一聚集索引上的唯一和非唯一非聚集索引
  2. gsm,gprs,cmwap,cmnet,3g,TD-SCDMA,CDMA2000,WCDMA
  3. robot1,Mechanical structure
  4. iptables规则备份和恢复 firewalld服务
  5. 《程序员代码面试指南》第二章 链表问题 搜索二叉树转换为双向链表
  6. Loadrunner通过ssh连接linux进行hadoop基准测试
  7. am335x 打开内部 RTC
  8. 安装Hadoop及Spark(Ubuntu 16.04)
  9. Java集合框架(一)
  10. Oracle中如何删除某个用户下的所有数据的方法