概述
部分内容引用以下文章(推荐大家阅读大佬的文章):
https://blog.csdn.net/weixin_39067991/article/details/81045201
https://blog.csdn.net/qq_27035123/article/details/72857739
2种垃圾回收机制:(
(1)引用计数:每个对象都有一个引用计数器,当有引用连接至对象时,引用计数加1。当有引用离开作用域或者被置为null时,引用计数减1。而垃圾回收器会在含有全部对象的列表上遍历,当发现每个对象的引用计数为0时,就释放其占用的空间。
- 优点:简单
- 缺点:工作量大,速度慢;
有一缺陷:如果对象之间存在循环引用,可能会出现“对象应该被回收,但引用计数却不为0的情况(假设有A和B两个对象之间互相引用,也就是说A对象中的一个属性是B,B中的一个属性时A,这种情况下由于他们的相互引用,从而是垃圾回收机制无法识别。objA.instance = objB, objB.instance = objB)”
(2)可达性分析法::如果我们将一些GC Roots对象作为起始点,从这些节点向下搜索,搜索到的路径为引用链,如果有一些对象没有任何引用链相连,那么这个对象对于GC Roots是不可达的,即使它们之间可能相互产生关联,所以将其判定为可回收对象。
依据思想(Thinking in java 中原话):
在一些更快的模式中,它们依据的思想:对于任何活的对象,一定能够追溯到其存活在堆栈或静态存储区之中的引用。这个引用链条可能会穿越数个对象层次
5种垃圾回收算法:
- 标记-清扫(Mark-and-sweep)—早期Java虚拟机使用这个技术。
原理:对于“活”的对象,一定可以追溯到其存活在堆栈、静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。第一阶段:从GCroots开始遍历所有的引用,对有活的对象进行标记。第二阶段:对堆进行遍历,把未标记的对象进行清除。这个解决了循环引用的问题。
缺点:1、暂停整个应用;2、会产生内存碎片。
- 复制(copying)(Thinking in java中将其称为 停止-复制 stop-and-copy)
原理:为了提升效率,把内存空间划分为2个相等的区域,每次只使用一个区域。垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另外一个区域。
优点:不会出现碎片问题。
缺点:1、暂停整个应用。2、需要2倍的内存空间。
- 标记-整理(Mark-Compact)
原理:第一阶段标记活的对象,第二阶段把为标记的对象压缩到堆的其中一块,按顺序放。即将所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
优点:1、避免标记扫描的碎片问题;2、避免停止复制的空间问题。
具体使用什么方法GC,Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率低的话,就切换到“标记-扫描”方式;同样,Java虚拟机会跟踪“标记-扫描”的效果,要是堆空间碎片出现很多碎片,就会切换回“停止-复制”模式。这就是自适应的技术。
- 分代(generational collecting)—–J2SE1.2以后使用此算法
原理:基于对象生命周期分析得出的垃圾回收算法。把对象分为年轻代、年老代、持久代,对不同的生命周期使用不同的算法(2-3方法中的一个即4自适应)进行回收。
新生代:每次垃圾收集都有大量对象死去,只有少量存活,就选择复制算法
老年代:对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”,或者“标记-整理”算法来进行回收。
- 自适应算法(Adaptive Collector)
在特定的情况下,一些垃圾收集算法会优于其它算法。
基于Adaptive算法的垃圾收集器就是监控当前堆的使用情况,并将选择适当算法的垃圾收集器。
如何实现:
java虚拟机会进行监视,如果对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫”方式;
同样,java虚拟机会跟踪“标记-清扫”的效果,要是堆空间出现很多碎片,就会切换回“停止-复制”方式。
最后
以上就是勤奋丝袜为你收集整理的Java垃圾回收器了解机制+算法的全部内容,希望文章能够帮你解决Java垃圾回收器了解机制+算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复