这次我们介绍JVM中的GC算法

引用计数法

可达性分析法

首先我们提出四个问题

哪里的内存需要回收?

什么时候回收?

如何回收?

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”, 墙外面的人想进去, 墙里面的人却想出来。

哪里需要回收?

需要排查各种内存溢出,内存泄漏的问题的时候,当垃圾的收集称为系统高并发量的瓶颈的时候。我们需要堆垃圾收集技术做必要的监控和调节。

由于在线程独占区的线程开始和结束得时候,都会将对应得内存在执行前获取分配好,在方法之完成释放内存。

而在方法执行得过程中在线程共享区,有大量得对象在堆或者方法去创建,这些对象的内存都是动态分配的,所以这里是垃圾收集器所关注的重点。

什么时候回收

当然实在对象死亡的时候做回收,那么在计算机中,我们是如何判断一个对象是否死亡了呢?

1. 引用计数法

这里需要提到的是引用计数法,通过这种方法可以判断对象是否死亡。

引用计数法的执行原理是:

给对象中添加一个引用计数器, 每当有一个地方引用它时, 计数器值就加1; 当引用失效时, 计数器值就减1; 任何时刻计数器为0的对象就是不可能再被使用的。

缺点做详细说明

按照上面的执行原理,如果我们创建两个对象相互引用,实际他们已经可以判定i死亡了,但是通过引用计数法是没有办法完成判定的,而在我们的Java语言中,面向对象是一个很常见的过程,所以JVM中一般不采用这种算法。

Object obj01 = new Object();

Object obj02 = new Object();

//相互引用

obj01=obj02;

2. 可达性分析法

可达性分析法的直白意思就是:是否可以到达的分析法。在主流程序语言都是用这种方法(Java、 C#, 甚至包括前面提到的古老的Lisp)

工作原理:

首先设定一个根节点,GCRoot, 从这些节点开始向下搜索, 搜索所走过的路径称为引用链( Reference Chain) , 当一个对象到GC Roots没有任何引用链相连时候则证明此对象不可用,如上图,object5,object6,object7,没有于根节点连接,所以判断位可回收对象。

常见的GCRoot节点对象

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

虚拟机栈( 栈帧中的本地变量表) 中引用的对象。

方法区中类静态属性引用的对象。

方法区中常量引用的对象。

本地方法栈中JNI( 即一般说的Native方法) 引用的对象。

PS: 这里我们增加对于方法区的垃圾回收介绍

一般情况,垃圾回收会集中在堆内存的Eden区域进行,这里会回收释放70%~ 95%的空间。而方法区的回收效率低成本高。

永久代的垃圾收集主要回收两部分内容:

废弃常量和无用的类。

废弃常量的回收和Java堆中的对象回收类似,以常量池中字面量的回收为例, 假如一个字符串“abc”已经进入了常量池中, 但是当前系统没有任何一个String对象是叫做“abc”的, 换句话说, 就是没有任何String对象引用常量池中的“abc”常量, 也没有其他地方引用了这个字面量, 如果这时发生内存回收, 而且必要的话, 这个“abc”常量就会被系统清理出常量池。 常量池中的其他类( 接口) 、 方法、 字段的符号引用也与此类似。

判断无用的类需要满足一下三个条件:

该类所有的实例都已经被回收, 也就是Java堆中不存在该类的任何实例。

加载该类的ClassLoader已经被回收。

该类对应的java.lang.Class对象没有在任何地方被引用, 无法在任何地方通过反射访问该类的方法。

Java常量什么时候被回收,JVM GC调优(2)-GC算法判定对象可以被回收(部分摘自深入理解Java虚拟机) - Java 技术驿站-Java 技术驿站...相关推荐

  1. Java架构学习(十二)java内存结构新生代老年代JVM参数调优堆内存参数配置解决堆栈溢出

    JVM参数调优与垃圾回收机制 一.java内存结构 Java内存模型:是多线程里面的,jmm与线程可见性有关 Java内存结构:是JVM虚拟机存储空间. Java内存结构图 Java内存机构分为:方法 ...

  2. JVM内存调优之GC算法

    初识JVM JVM简介 虽然理解JVM不是开发或运行Java程序的必要条件,但是多了解一些JVM知识,那么就可以避免很多性能上的问题. Java虚拟机(JVM)指的是Java应用的运行环境,从一般意义 ...

  3. Java程序员必须了解的JVM性能调优知识,全都在这里了

    来自:IT大咖说 1.Java 中是值传递还是引用传递? 传引用的错觉是如何造成的呢?在运行栈中,基本类型和引用的处理是一样的,都是传值,所以,如果是传引用的方法调用,也同时可以理解为"传引 ...

  4. jvm性能调优 - 08什么情况下对象会被GC

    文章目录 什么时候会触发垃圾回收? 被哪些变量引用的对象是不能回收的? Java中对象不同的引用类型 强引用 软引用 弱引用 虚引用 finalize()方法的作用 思考 什么时候会触发垃圾回收? 平 ...

  5. jvm性能调优 - 22JVM GC回顾

    文章目录 Pre 系统卡顿问题 年轻代gc到底多久一次对系统影响不大? 什么时候新生代gc对系统影响很大? 如何解决大内存机器的新生代GC过慢的问题? 要命的频繁老年代gc问题 Minor GC.Yo ...

  6. 22-09-02 西安 JVM 类加载器、栈、堆体系、堆参数调优、GC垃圾判定、垃圾回收算法、对象的finalize机制

    这篇文章不少地方都截图了宋红康老师的课件,实在他jvm这块讲的真好.连接地址如下: 尚硅谷宋红康JVM全套教程(详解java虚拟机)_哔哩哔哩_bilibili JVM入门 1.JVM结构图 JVM是 ...

  7. 一文看尽 JVM GC 调优

    一个著名的学习方法论 向橡皮鸭求助 学会提问,提问也是一门艺术 提问前,先投入自己的时间做好功课 发生了什么事情 问题的基本情况 你投入的研究和发现 能正确提出你的问题,你的问题差不多已经解决一半 深 ...

  8. 深入理解JVM虚拟机14:JVM性能调优的6大步骤,及关键调优参数详解

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

  9. 如何合理的规划一次 JVM 性能调优

    转载自   如何合理的规划一次 JVM 性能调优 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响,那么如何进行一次优雅的调优,提升应用的性能? 这是 JVM ...

最新文章

  1. OpenCV2马拉松第22圈——Hough变换直线检測原理与实现
  2. 网易技术干货 | 云信Web SDK测试实践
  3. LeetCode 581. 最短无序连续子数组(排序单调栈)
  4. sql alwayson群集 registerallprovidersip改为0_前沿观察 | 分布式SQL性能对比
  5. Python获取文件路径:os.listdir()和os.walk()
  6. 【渝粤教育】电大中专公共基础课程 (2)作业 题库
  7. 重读模电教材一_童诗白、华成英
  8. 如何挑选蓝牙耳机,蓝牙参数说明
  9. Indented Inventory BOM如何转为最终的单层采购BOM
  10. HTTP 405错误解决方法
  11. 计算机键盘有哪些作用,电脑键盘各个按键有哪些作用 电脑键盘各个按键作用介绍...
  12. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time datetime模块...
  13. [实用资料系列]注册表技术大全「二辛苦收集的注册表大全」
  14. 统计一行字符串中单词的个数
  15. 创业团队产品如何战胜大公司的抄袭 腾讯抄你肿么办?
  16. Springboot基础(二):数据库+Thymeleaf
  17. 新加坡风险投资公司将投资1000万美元建立加密货币区块链投资基金
  18. linux centos 解压 tar.bz2文件
  19. 41、流量统计--代码实现
  20. 手动汉化 PyCharm 的过程

热门文章

  1. 沟通CTBS V5.0发布, 南北通及安全性成最大亮点
  2. 【编译原理笔记10】语法制导翻译:在递归预测过程中进行翻译,L属性定义的自底向上翻译
  3. 腾讯优测干货精选| 安卓开发新技能Get -常用必备小工具汇总
  4. c语言求行列式的值原理,新手作品:行列式计算C语言版
  5. g楦和h楦的区别_药品与保健品的区别
  6. MAN PAGE: cvslock(1)
  7. TortoiseSVN 执行清理( cleanUp )失败的解决方案
  8. 关于2014年上半年全国计算机等级考试有关事宜的通知,关于2014年上半年全国计算机等级考试报名的通知...
  9. idea中如何查看一个类的方法被那些类调用了,显示方法对应的调用树
  10. history模式 nginx配置_Vue history模式Nginx配置