应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

如果这题都不会面试官还会继续问我JVM如何判断对象是否可回收

  不懂就问,世界都快毁灭了我为啥还要在这背八股写论文(滑稽)
  首先,对于JVM来说,什么是垃圾?
  简单说就是内存中已经不再被使用到的空间就是垃圾
  其次,什么是垃圾收集(GarbageCollection,下文简称GC)?
  简单来说,就是清除垃圾占用的空间,从而给新生的对象腾出内存空间。
  垃圾收集发生在哪个内存区域?
  回顾下Java内存运行时区域,程序计数器、虚拟机栈、本地方法栈这3个区域是线程私有的,随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然就跟随着回收了。
  而堆和方法区这两个区域是线程共有的,有着很显著的不确定性:一个接口的多个实现类需要的内存可能会不一样,一个方法所执行的不同条件分支所需要的内存也可能不一样,只有处于运行期间,我们才能知道程序究竟会创建哪些对象,创建多少个对象,这部分内存的分配和回收是动态的。所以一般垃圾收集器所关注的就是对这部分内存的管理。
  确定了垃圾收集发生的具体地点,还需要考虑的其实无非就是以下三个问题:哪些内存需要回收?(GC目标)什么时候回收?(GC时间)如何回收?(GC方法)
  毫无疑问,垃圾收集器在进行回收前,第一件事情就是要确定GC目标,判断这些对象之中哪些还存活着,哪些已经死去成为垃圾(即不可能再被任何途径使用的对象)。所以,我们今天这篇文章的目的,就是探讨如何判断对象是否已经成为垃圾。
  老规矩,背诵版在文末。点击阅读原文可以直达我收录整理的各大厂面试真题引用计数法
  众所周知,在Java中,如果要操作对象是必须通过引用来进行的。
  因此,如果某个对象已经不存在任何引用指向它了,就说明这个对象已经没有作用了,就是一个垃圾了。
  所以,很显然的一个办法就是通过引用计数来判断一个对象是否可以回收。
  算法的实现非常简单:在对象中添加一个字段作为引用计数器,每当有一个地方引用这个对象时,计数器的值就加一;当引用失效时,计数器值就减一;计数器为零的对象就是可以被回收的对象。
  But!!!目前主流的JVM里面都没有选用引用计数算法来管理内存。
  主要原因是,这个看似简单的算法需要考虑很多例外情况,比如,单纯的引用计数就很难解决对象之间相互循环引用的问题。
  所谓对象之间的相互循环引用,举个简单的例子,如下代码:对象objA和objB都有字段instance,赋值令objA。instanceobjB及objB。instanceobjA,除此之外,这两个对象再无任何引用
  当我们令objA和objB为null的时候,意思就是不想再让他俩指向的对象被其他人访问了,虚拟机可以回收掉了,但是它们因为互相引用着对方,导致它们的引用计数都不为零,所以引用计数算法也就无法回收它们
  可达性分析法
  当前主流的JVM都是通过可达性分析(ReachabilityAnalysis)算法来判定对象是否可回收的。
  这个算法的基本思路也不难,可以理解为一棵多叉树:就是通过一系列称为GCRoots的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为引用链(ReferenceChain),如果某个对象到GCRoots间没有任何引用链相连,或者用说从GCRoots到这个对象不可达时,则证明此对象是不可能再被使用的。
  如图所示,对象object5、object6、object7之间虽然互有关联,但是它们到GCRoots是不可达的,因此它们将会被判定为可回收的对象
  这里要说明下,GCRoots存的到底是引用还是对象?
  答案是引用,指向对象的引用。至于为什么很多人会直接说是对象,主要原因就是因为Java中引用无法脱离对象存在,没有指向对象的引用是没有任何意义的。另外,GCRoots到底存放在哪里呢?
  事实上,GCRoots本身是没有存储位置的他们都是字节码加载运行过程中加入JVM中的一些普通引用,只不过被认为是GCRoots罢了。哪些对象的引用可以作为GCRoots?
  下面所列举出来的对象,指向它们的引用,就可以作为GCRoots:
  1)在虚拟机栈中引用的对象
  举个例子,a是栈帧中的本地变量,指向了nameJack这个User对象。当anull时,由于此时a充当了GCRoot的作用,a与原来指向User对象断开了连接,所以这个User对象会被回收。
  2)在本地方法栈中JNI引用的对象(JavaNativeInterface,Java本地接口,即通常所说的Native方法)
  3)类的静态变量引用的对象(JDK1。7开始静态变量的存储从方法区移动到堆中)
  如下代码所示,首先,存储在虚拟机栈中的变量a是一个GCRoot对吧,当anull时,那么a原来指向的nameJack的User对象与GCRoot断开了连接,所以nameJack的User对象会被回收。
  而由于我们给s赋值了变量的引用,s在此时是类静态属性引用,充当了GCRoot的作用,它指向的nameTom的User对象依然存活
  4)常量引用的对象(运行时常量池属于方法区的一部分,另外,其中的字符串常量池从JDK1。7开始由方法区移动到堆中)
  如下代码所示,常量s指向的对象并不会因为a指向的对象被回收而回收
  5)JVM内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。这个很好理解,如果这些核心的系统类对象被回收了,程序就没办法运行了。
  6)所有被同步锁(synchronized关键字)持有的对象
  7)反映JVM内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等(这个说实话我不懂,也没去查资料,感觉不是很重要,哈哈哈哈,偷个懒吧)
  另外,需要注意的是,除了这些固定的GCRoots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象引用临时性地加入,共同构成完整GCRoots集合。
  简单介绍下,众所周知分代收集机制,如最典型的只针对新生代的垃圾收集,这时候该怎么判断GCRoots?判断堆区中的所有对象作为GCRoots?显然这样作会导致GCRoots包含过多对象而过度膨胀只判断新生代中的对象作为GCRoots?每个内存区域都不是孤立封闭的,所以某个区域里的对象完全有可能被位于堆中其他区域的对象所引用,这时候就需要将这些关联区域的对象也一并加入GCRoots集合中去,才能保证可达性分析的正确性。这有个专业术语:局部回收(PartialGC),目前最新的几款垃圾收集器无一例外都具备了局部回收的特征,当然它们在实现上也做出了各种优化处理对象可回收,就一定会被回收吗?
  并不是,对象的finalize方法给了对象一次垂死挣扎的机会。
  当对象不可达(可回收)并发生GC时,会先判断对象是否执行了finalize方法,如果未执行,则会先执行finalize方法!
  所以,我们可以在此方法里拯救这个濒死的对象。
  具体做法就是将当前对象与GCRoots关联,这样执行finalize方法之后,GC会再次判断对象是否可达,如果不可达,则会被回收,如果可达,则不回收!
  需要注意的是,这个保命套路只能用一次,因为finalize方法只会被执行一次,如果第一次执行finalize方法此对象变成了可达确实不会回收,但如果对象再次被GC,则会忽略finalize方法,对象会被直接回收掉!
  最后放上这道题的背诵版:
  面试官:如何判断对象是否可回收?
  类似提问:如何判断对象是否存活?如何判断对象是否为垃圾?
  :sunglasses:小牛肉:两种方法,引用计数法和可达性分析法。
  所谓引用计数法就是在对象中添加一个字段作为引用计数器,每当有一个地方引用这个对象时,计数器的值就加一;当引用失效时,计数器值就减一;计数器为零的对象就是可以被回收的对象。
  虽然这个算法简单但是无法解决对象之间的循环引用问题,所以目前主流的JVM用的都是可达性分析算法。
  这个算法的基本思路可以理解为一棵多叉树:就是通过一系列称为GCRoots的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,如果从GCRoots到某个对象不可达时,则说明此对象是可以被回收的。在虚拟机栈中引用的对象在本地方法栈中引用的对象在方法区中类的静态变量引用的对象(JDK1。7开始静态变量从方法区移动到了堆中)在方法区中常量引用的对象JVM内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器等。这个很好理解,毕竟如果这些核心的系统类对象被回收了,程序就没办法运行了所有被同步锁(synchronized关键字)持有的对象

53岁的王菲,脸上写满了青春永驻3月12日,王菲参加聚会的近照在网上曝光,1969年出生的王菲看起来状态非常好。从照片中可以看出,王菲打扮舒适随意,淡紫色上衣款式很简单,头发剪成细碎,看不出现在的王菲与……全胜收官!中国女篮挺进世界杯!中国女篮13日在塞尔维亚首都贝尔格莱德举行的2022年国际篮联女篮世界杯预选赛中以103:70大胜法国队,以三战全胜的战绩完美结束本届世界杯预选赛。本场比赛中国队表现出色……11月奥迪无厘头文案脑洞大开,小鹏变身佛系玩家车企抖音年关将近,叠加新能源汽车购置补贴、燃油车购置税优惠即将到期,各大车企为了实现全年目标开启花式冲销量。养号千日,用号一时,抖音号如何做好神助攻?来看看这些品牌都是怎么玩的。……在北京遇见非洲非洲文旅中心把非洲带到你身边来源:中央广电总台国际在线编辑:张馨叶国际在线报道(记者朱宛玲):在北京东北五环外的一处文创园区中,隐藏着一个非洲文旅中心。在这里,人们可以近距离接触到来自非洲的动……宇宙中的费米气泡与黑洞现象的分析判断我们的宇宙星云的产生是因为沿着星云的中间轴线方向,应当具有很强大的力作用,也就是视频中的所谓费米气泡区域,这个区域存在力的作用就一定存在两种事物或以上的相互接触(所谓的黑洞现象……速收藏!关于微信支付宝个人收款码禁商用,您想知道的都在这儿从2022年3月1日起支付宝、微信的个人收款码禁止用于经营性服务,好多人看到这个消息会有很多的疑惑,比如:2022年3月1日后就不能扫码支付了吗?难道我们又要回到以前用现金的时……Steam推荐这几款沙雕联机多人游戏,免费玩,朋友一叫就来哈喽各位看官好,这里是小游,每日为你带来最新的热门游戏资讯。虽然在座的各位有很多都是打工人,白天奉献给了工作,但下了班生活还是自己的!无聊的时候做什么呢?今天小游就为大伙推荐几……处理好人际关系,要牢记这3句话!生活中我们每个人,或多或少都得到过别人的帮助,经常发现这样一种现象,两人彼此关系一直很好,有时就为一件琐碎的小事或者意见不合,从此如同陌路。人这一生,与人交往是不可避免的……东北巨骗陈相贵陨落史开悍马买182万手机号,08年锒铛入狱2020年,著名笑星赵本山自导自演的乡村系列喜剧《刘老根3》在各大电视台热播。虽然距离刘老根的上一部已经过去十八年了,但是它的热度依旧不减。当年众多主演再度联袂合作……安顿好妻儿之后,拳王洛马琴科返回乌克兰参军之前给大家报道过俄乌战事之下,乌克兰四大拳王战后百态。根据最新消息,此前战争打响后,被爆离开乌克兰的前三个级别世界拳王、两届奥运会瓦西里洛马琴科,已经重新返回乌克兰,拿起武器打……费翔妈妈毕丽娜,亲手拆散儿子姻缘,儿子62岁依旧未婚费翔曾经是当红明星,五官英俊,身材魁梧。作为歌手他唱过《故乡的云》、《冬天里的一把火》、《流连》等等。作为演员,他出演过《竹篱笆外的春天》、《昨夜之灯》、《爱情魔戒……要求高!九球天后潘晓婷40岁如少女身价不菲仍单身择偶标准公布说起台球运动,相信大家一定会想到台球名将丁俊晖,丁俊晖是知名的斯诺克选手,从小接触台球的他,获得了无数荣誉,各种大奖也是拿到手软,他也被媒体称为东方之星。而女性台球运动员中,球……
按图索冀湖光山色入画来盛夏时节河北省保定市易县易水湖景区青山环绕,碧波荡漾27平方公里水面烟波浩渺、水天一色游览其中有一种舟行碧波上,人在画中游之感易水湖是……新疆被全国游客挤爆!悄悄走热的新疆菜未来可期?离开新疆后,新疆菜能迸发出多大潜力?本文由红餐网(ID:hongcan18)原创首发,作者:简煜昊。7月,新疆被全国游客挤爆的相关话题冲上热搜。那拉提、喀纳斯、天池……30万底薪加盟上海队,丁彦雨航10年CBA生涯赚了多少钱?根据五星体育的报道,丁彦雨航已经和上海队签约一年,据悉双方签下的是C类常规合同,新赛季薪水为30万元,是C类合同的最低薪水。丁彦雨航曾是CBA最好的小前锋,2016201……春天适合光腿穿呢子裙,又暖和又高级,气质好独特说到春季里。最适合的材质面料一定是毛呢材质的搭配。因为它在春季里,无论是质感还是保暖性,都是非常优越的,它要高于其他的面料。春天适合光腿穿呢子裙,又暖和又高级,气质好独特。……吉林首富李永新23岁白手创业,如今坐拥1859所分校,一年营文浮渔说娱编辑浮渔说娱如果有人向你借3万块钱,承诺以后挣钱了还3亿,会不会觉得这是个骗子。但在2001年的时候,走投无论的李永新,便曾对母亲鲁忠芳说过这一番话……上场就玩命!低调的张镇麟NBA夏联首秀很高调我想把湖人夏联后卫路易斯团成一个球,踢到九霄云外!NBA夏季联赛,张镇麟身着17号球衣,代表太阳队与湖人队进行拉斯维加斯夏联首场比赛。可惜啊,直到末节2分47秒,张镇麟才……暑期大放价,大华存储PCIe4。0硬核固态即刻开黑GO暑期已经开始,游戏玩家们纷纷拿起自己的电竞宝贝,拉着好友结队,一路通关打怪升级。要想在电竞世界大展身手,除了过硬的技术,电脑配件也要强劲!大华存储暑期大放价,硬核PCIe4。0……下四国军棋,读棋子人生当年在体制内,总体来说,工作还是很多,但有时候心情还不错,便在网上又拾起了多年未下的军棋。曾记得从两国到四国,反正是一路厮杀,有的时候被人杀……孙杨已低调领证结婚?女方套路曝光,谈2次恋爱还称自己传统日前,某百万大V突然爆料称,孙杨和她的老婆张豆豆已经领证一段时间!虽然该博主的爆料只有简单的一句话,但鉴于其百万大V的身份,爆料还是有一定可信度的。事实上,早在今年的4月份,就……小米12系列唯一直屏手机?小米12Lite来了不到3500元对于曲面屏、直屏这两种屏幕形态,一直以来都有着巨大的争议。有人觉得曲面屏难贴膜、难用,而且还会影响屏幕显示效果,也有人觉得直屏太丑、没有科技感,手感方面也要差点意思。那么,曲面……景城一体文化赋能池西区推进全域旅游发展见实效看天池、泡温泉、摘蓝莓、玩漂流随着22度的清凉夏天到来,长白山池西区的旅游日渐升温,吸引了全国各地的游客。一花一草一风景,一山一水一首诗。近年来,池西区依托丰富的生态资源……惨败张本智和遭刘国梁狠批,等待4年,林高远终于迎来复仇机会WTT冠军赛布达佩斯站男单决赛对阵出炉,林高远对阵张本智和!4年前的国际乒联年终总决赛,林高远14不敌张本智和,赛后,刘国梁很不满。如今,林高远等待了4年,终于,复仇的机会来了……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网