扣丁学堂浅谈关于Java如何判定内存中的垃圾

2018-01-02 11:27:55 549浏览

        今天扣丁学堂给大家介绍一下关于Java如何判定内存中的垃圾介绍,下面我们一起来看一下吧。


扣丁学堂浅谈关于Java如何判定内存中的垃圾


        1、引用计数器算法

        解释:系统给每个对象添加一个引用计数器,每当有一个地方引用这个对象的时候,计数器就加1,当引用失效的时候,计数器就减1,在任何一个时刻计数器为0的对象就是不可能被使用的对象,因为没有任何地方持有这个引用,这时这个对象就被视为内存垃圾,等待被虚拟机回收。

        优点:客观的说,引用计数器算法,他的实现很简单,判定的效率很高,在大部分情况下这都是相当不错的算法,其实,很多案例中都使用了这种算法,比如IOS的Object-C,微软的COM技术(用于给window开发驱动,.net里面的技术几乎都是建立在COM上的),Python语言等。

        缺陷:无法解决循环引用的问题。这就好像是悬崖边的人采集草药的人,想要活下去就必须要有一根绳子绑在悬崖上.如果有两个人,甲的手拉着悬崖,乙的手拉着甲,那么这两个人都能活,但是,如果甲的手拉着乙,乙的手也拉着甲,虽然这两个人都认为自己被别人拉着,但是一样会掉下悬崖.

        比如说A对象的一个属性引用B,B对象的一个属性同时引用AA.b=B()B.a=A();这个A,B对象的计数器都是1,可是,如果没有其他任何地方引用A,B对象的时候,A,B对象其实在系统中是无法发挥任何作用的,既然无法发挥作用,那就应该被视作内存垃圾予以清理掉,可是因为此时A,B的计数器的值都是1,虚拟机就无法回收A,B对象,这样就会造成内存浪费,这在计算机系统中是不可容忍的.

        解决办法:在语言层面处理,例如Object-C就使用强弱引用类型来解决问题.强引用计数器加1,弱引用不增加Java中也有强弱引用

        2、可达性分析算法

        解释:这种算法通过一系列成为"GCRoots"的对象作为起始点,从这些节点开始向下搜索所有走过的路径成为引用链(ReferenceChain),当一个对象GCRoots没有任何引用链相连(用图论的话来说就是从GCRoots到这个对象不可达),则证明此对象是不可用的

        优点

        这个算法可以轻松的解决循环引用的问题

        大部分的主流java虚拟机使用的都是这种算法

        Java语言中的GCRoots

        在虚拟机栈(其实是栈帧中的本地变量表)中引用的对象

        在方法区中的类静态属性引用对象
        
        在方法区中的常量引用的对象

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

        好了,关于Java如何判定内存中的垃圾就为大家简单介绍到这里,想要学习Java开发的小伙伴可以选择口碑良好的扣丁学堂学习,扣丁学堂不仅有专业的老师和与时俱进的Java培训课程体系,还有大量的Java视频教程供学员观看学习,喜欢的小伙伴抓紧时间行动吧。Java技术交流群:670348138。




扣丁学堂微信公众号



【关注微信公众号获取更多学习资料】



查看更多关于“Java开发资讯的相关文章>>

标签: JavaEE视频教程 JavaEE培训 JavaEE开发工程师 Java培训

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号