以前看过很多次关于垃圾回收相关的文章,都只是看过就忘记了,没有好好的整理一下,发现写文章可以强化自己的记忆。

java与C,c++有很大的不同就是java语言开发者不需要关注内存信息,不会显式的直接操作内存,而是通过jvm虚拟机来实现。

java虚拟机运行的时候内存分配图如下图:

jvm虚拟机栈:一个是线程独有的,每次启动一个线程,就创建一个jvm虚拟机栈,线程退出的时候就销毁。这里面主要保存线程本地变量名和局部变量值。

本地方法栈: 调用本地jni方法的时候而创建的。这里分配的jvm之外的内存空间。方法调用结束之后销毁。

pc寄存器 : 这个保存线程当前执行的字节码指令

堆:主要保存创建的对象。

方法区:保存class相关的信息。主要是class的一个内存结构信息

常量池:方法区的一部分,主要保存class内存结构中常量值 例如String值,public static final 类型的值

我们这里说的垃圾回收,主要是java虚拟机对堆内存区域的回收。

1 首先的问题是:jvm如何知道那些对象需要回收 ?

目前有两种算法

引用计数法

每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收

这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,对象B由于没有被引用,没有路径可以达到对象B,对象B的引用计数就就是0,对象B就会被回收。

但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收。例如下图:对象A,对象B 循环引用,没有其他的对象引用A和B,则A和B 都不会被回收。

root搜索算法

这种算法目前定义了几个root,也就是这几个对象是jvm虚拟机不会被回收的对象,所以这些对象引用的对象都是在使用中的对象,这些对象未使用的对象就是即将要被回收的对象。简单就是说:如果对象能够达到root,就不会被回收,如果对象不能够达到root,就会被回收。

如下图:对象D访问不到根对象,所以就会被回收

以下对象会被认为是root对象:

被启动类(bootstrap加载器)加载的类和创建的对象

jvm运行时方法区类静态变量(static)引用的对象

jvm运行时方法去常量池引用的对象

jvm当前运行线程中的虚拟机栈变量表引用的对象

本地方法栈中(jni)引用的对象

由于这种算法即使存在互相引用的对象,但如果这两个对象无法访问到根对象,还是会被回收。如下图:对象C和对象D互相引用,但是由于无法访问根,所以会被回收。

jvm在确定是否回收的对象的时候采用的是root搜索算法来实现。

在root搜索算法的里面,我们说的引用这里都指定的是强引用关系。所谓强引用关系,就是通过用new 方式创建的对象,并且显示关联的对象

以上就是代表的是强引用关系,变量obj 强引用了 Object的一个对象。

java里面有四种应用关系,从强到弱分别为:

Strong Reference(强引用) –>Weak Reference (弱引用) -> Soft Reference(软引用) – > Phantom Reference(引用)

Strong Reference : 只有在引用对象root不可达的情况下才会标识为可回收,垃圾回收才可能进行回收

Soft Reference : 无论其引用的对象是否root可达,在响应内存需要时,由垃圾回收判断是否需要回收。

Weak Reference :用来描述非必需对象。即使在root算法中 其引用的对象root可达到,只能生存到下一次垃圾回收之前。

Phantom Reference :无法通过虚引用获得一个对象的实例,设置虚引用的目的就是能在这个对象被收集器回收时收到一个系统通知。

下面可以看一个测试

这里创建大约1000个 10K的 Weak Reference 对象,最后打印的结果是:被回收的对象数:767,这里ReferenceObject如果设置为1K的话,最后的打印结果是0

这个例子并不严谨,但是却说明了被Weak Reference的对象在一定的时候会被jvm回收,但是强引用就不会出现这种状态。

java可达性_java 垃圾回收总结(可达性分析 引用分类相关推荐

  1. java可达性_java垃圾回收机制--可达性算法

    先说一些题外话,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区,这些区分为线程私有区和线程共享区 1.线程私有区 a.程序计数器 记录正在执行的虚拟机字节码指令地址 ...

  2. java gc 可达性_JAVA--GC 垃圾回收机制----可达性分析算法

    在JVM 中,java 为我们提供可有效的垃圾回收机制,GC ,GC的创建无疑是为了缓解内存压力.保存有效数据.回收垃圾无效数据: 在此之前GC在我的理解中,一直只是个概念,内存中出现垃圾,GC来回收 ...

  3. 物品回收平台java代码_java垃圾回收

    jvm何时回收一个java对象所占的内存? 当java对象失去引用时,JVM垃圾回收机制会清除他们,回收所占内存空间. java有没有内存泄漏? 无用的内存没有被回收就是内存泄漏. C++内存泄漏:内 ...

  4. 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )

    文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...

  5. JVM 垃圾回收算法 -可达性分析算法!!!高频面试!!!

    前言:学习JVM,那么不可避免的要去了解JVM相关的垃圾回收算法,本文只是讲了讲了可达性分析算法,至于标记-清除.标记-复制,标记-整理,分代收集等等算法,会在近两天的文章中陆续更新出来. 很喜欢一句 ...

  6. Java GC系列(4):垃圾回收监视和分析

    转载自  Java GC系列(4):垃圾回收监视和分析 在这个Java GC系列教程中,让我们学习用于垃圾回收监视和分析的工具.然后,选用一种工具来监视一个Java示例程序的垃圾回收过程.如果你是一名 ...

  7. java 强制垃圾回收_Java垃圾回收机制

    Java垃圾回收机制 垃圾回收机制用到finalize.当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存 ...

  8. java简述垃圾回收原理及算法_Java垃圾回收原理和算法

    ·内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可.垃圾回收器将负责回收所有 ...

  9. java list clear 垃圾回收_java垃圾回收机制

    1.什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导数内存溢出,所以内存资源的管是非常重要了. 1.1.C/C++语言的垃圾回收 在C/C+ ...

  10. 一文搞懂JAVA与GO垃圾回收

    导语  现代高级编程语言管理内存的方式分为两种:自动和手动.像 C.C++ 等编程语言使用手动管理内存的方式,编写代码过程中需要主动申请或者释放内存:而 PHP.Java 和 Go等语言使用自动的内存 ...

最新文章

  1. 大连理工计算机专业等级,大连理工计算机专业全国排第几呀
  2. weblogic 安装教程
  3. PhotoshopCS6-视觉特效插画技法-15-磨砂金属效果分析
  4. [转]为什么我们不用软件工程?软件工程能帮多大忙?
  5. JAVA记录-Servlet介绍
  6. REDIS 字典数据结构
  7. 【Django】文件上传以及celery的使用
  8. oracle查询最近十条数据_Oracle-查询最近更新的前10条数据
  9. 【图像处理】基于matlab GUI图像直方图+滤波+小波变换+分割处理系统【含Matlab源码 608期】
  10. 宝塔面板部署网易云api
  11. 单片机入门教程之认识单片机
  12. 串口收数数码管显示(串口带协议带校验)
  13. linux内核audit,linux audit审计(7)--读懂audit日志
  14. 结对编程——自动生成数学试卷的系统(javaswing,mysql)by 陈松刘宇航
  15. <Zhuuu_ZZ>Map接口和equals重写
  16. 人工智能全栈学习路线之人工智能概览(百度云智学院学习笔记)
  17. VMware vSphere 服务器虚拟化部署安装图解
  18. 为什么广告技术发展了,成本却没降
  19. pandas -----变形(透视表、melt、stack、unstack),哑变量与因子变化
  20. 2021年金属非金属矿山(地下矿山)安全管理人员考试题库及金属非金属矿山(地下矿山)安全管理人员新版试题

热门文章

  1. 66天全部就业,最高薪资25000元!黑马Java学科真牛
  2. matlab 去掉相同的行数据库,关于UCI数据库每行数据列数不一致的处理代码
  3. 良心高效,3款超级好用的PC端软件,让你找不到拒绝的理由
  4. linux创建隐藏用户,Linux之隐藏权限lsattr和chattr
  5. Java冒泡排序法 经典例题
  6. python支持按指定字符串分割成数组_如何将js字符串分割指定的标签组成数组
  7. 多维奇异谱分析(Multivariate Singular Spectrum Analysis,MSSA)
  8. 代码美化网站,让你的代码别具一格
  9. 计算机表格入门2013,Access2013从入门到精通
  10. 吉客云与金蝶云星空集成方案(吉客云主管库存)