31. 如何计算对象已死

31.1.引用计数器算法

引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象不再被使用,是“垃圾”了。

引用计数器实现简单,效率高;但是不能解决循环引用问问题(A对象引用B对象,B对象又引用A对象,但是A,B对象已不被任何其他对象引用),同时每次计数器的增加和减少都带来了很多额外的开销,所以在JDK1.1之后,这个算法已经不再使用了。

31.2.可达性分析算法

可达性分析算法是通过一些“GC Roots”对象作为起点,从这些节点开始往下搜索,搜索通过的路径成为引用链(Reference Chain),当一个对象没有被GC Roots的引用链连接的时候,说明这个对象是不可用的,如下图所示。

GC Roots对象包括:
1.虚拟机栈(栈帧中的本地变量表)中的引用的对象。
2.方法区域中的类静态属性引用的对象。
3.方法区域中常量引用的对象。
4.本地方法栈中JNI(Native方法)的引用的对象。
上面只是标记了对象是否可以被回收,实际上在java中首先会标记下对象,会调用对象里面的protected void finalize()这个方法,这个时候对象还有救,只要在这个方法把该对象和引用链对接上,其实可以逃脱被回收

32.对象是否可 GC?

评注:这个问题就是在问,JVM如何判断对象是否需要被回收!不用答引用计数法,答可达性分析算法就行。
回答:
这个算法的基本思路是通过一些列称为“GC Roots”的对象作为起始点,从这些点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象需要被回收.

Java可作为GC Roots的对象包括下面几种:
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象

33. Minor GC 和 Full GC

**评注:**基础题,会JVM调优的,基本都会!我只是奇怪,怎么没问Major GC呢?我们还是把Major GC也给答了吧!
回答:
堆内存是JVM中最大的一块由年轻代和老年代组成。
那么,从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。
Major GC 是清理老年代。
Full GC 是清理整个堆空间—包括年轻代和老年代。

31. 如何计算对象已死(引用计数器算法、可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC相关推荐

  1. 引用计数器法 可达性分析算法_面试官:你说你熟悉jvm?那你讲一下并发的可达性分析...

    持续输出原创文章,点击蓝字关注我吧 上面这张图是我还是北漂的时候,在鼓楼附近的胡同里面拍的. 那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片.看到这 ...

  2. 对象是否要被回收(引用计数和可达性分析算法)

    java堆和方法区主要存放各种类型的对象(方法区中也存储一些静态变量和全局常量等信息),那么我们在使用GC对其进行回收的时候首先要考虑的就是如何判断一个对象是否应该被回收.也就是要判断一个对象是否还有 ...

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

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

  4. JVM—引用计数和可达性分析算法(存活性判断)

    1 引用计数算法 1.1 算法思想   给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:   当引用失效时,计数器值就减1:   任何时候计数器为0时的对象就是不能再被使用. 1. ...

  5. 【JVM】引用计数和可达性分析算法详解

    前言 JVM堆中几乎存放了所有对象的实例,那么垃圾收集器怎么确定哪些对象还"存活"着,哪些已经"死去"呢?本文主要介绍判断对象是否存活算法引用计数算法和可达性分 ...

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

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

  7. JVM学习 谁是垃圾?判断对象是否能被垃圾回收 可达性分析 四大引用

    系统性学习JVM请点击JVM学习目录 为什么要垃圾回收 为什么要进行垃圾回收?做任何事之前我们都要搞清做这件事的原因.当我们在运行java项目时,如果项目比较大,它会实例化很多很多对象,多到我们的内存 ...

  8. JAVA垃圾回收-可达性分析算法

    在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行.那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收.不失一般性,如果一个对象没有任何引用与之关联 ...

  9. bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...

    JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...

最新文章

  1. java上机题四取三排列_Java练习题
  2. 关于python3的readlines(),read()和readline()简介
  3. Date - Java处理日期和时间
  4. picturebox 图片自适应
  5. 操作系统之文件管理:1、初识文件管理
  6. C#设计模式之14-命令模式
  7. 为什么 Linux Mint 比 Ubuntu好?
  8. python自动视频摘要_专栏丨深度学习之视频摘要简述
  9. Pytorch——Dropout
  10. 使用Intent启动常用的应用与服务
  11. 计算机ppt操作知识,计算机基础知识:PPT常用操作(一)
  12. 集线器、交换机、路由器以及端口带宽区别
  13. 苹果cms10配置本地化播放器p2p加速
  14. C# 调用Windows media play 播放器方法
  15. 堆排序的基本概念和基本思路
  16. 我是如何将Pluto作为library分享到jCenter
  17. 数据库For Web
  18. 2021. 03. 04俱乐部月赛
  19. 基于Layui上传组件(upload)的动态增加上传组件并使得每个上传组件都可独立上传
  20. MFC面向对象程序设计

热门文章

  1. VTK:隐式二次元用法实战
  2. VTK:在3DScene显示图表用法实战
  3. wxWidgets:多线程概述
  4. boost::ratio_greater相关的测试程序
  5. boost::hof::rotate用法的测试程序
  6. boost::hana::lexicographical_compare用法的测试程序
  7. Boost:使用/type <>语法测试成员函数
  8. ITK:轮廓空间对象
  9. ITK:使用多线程过滤图像
  10. c语言求n到m之间的素数和