天天看点

java中的GC(gc工作原理,GC回收机制,GC内存分配)

收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。

自动内存管理解决的是:给对象分配内存 以及 回收分配给对象的内存。

为什么我们要了解学习GC与内存分配呢?

在JVM自动内存管理机制下,不再需要为每一个new操作写配对的delete/free代码。但出现内存泄露和溢出问题时,如果不了解虚拟机是怎样使用内存的,那么排查错误将是一项非常艰难地工作。

GC(垃圾收集器)在对堆回收前,会先确定哪些对象“存活”,哪些已经“死去”。那么就有了 对象存活判定算法。

对象存活判定算法

1:引用技术算法:

优点:实现简单,判断效率也很高。

缺点:很难解决对象之间相互循环引用的问题。

2:可达性分析算法

生存还是死亡?

如果对象在进行可达性分析后发现没有与 GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize() 方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,

垃圾回收算法

1:标记—清除算法:

2:复制算法:

3:标记—整理算法:

4:分代收集算法:

内存分配与回收策略

对象优先在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将一次Minor GC。

长期存活的对象将进入老年代:虚拟机采用了分代收集的思想来管理内存,那么内存回收时就必须能识别那些对象应放在新生代,那些对象应放在老年代,为了做到这点,虚拟机给每个对象定义了一个对象年龄计数器。如果对象在Eden处并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并且对象年龄设为1,对在Survivor区中每“熬过”一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度,就将会被晋升到老年代。

动态对象年龄判断:虚拟机并不是永远要求对象的年龄必须达到了Max Tenuring Threashold 才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到Max Tenuring Threshold 中要求的年龄。

空间分配担保:在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。

作者:weixin_39027589

来源:CSDN

原文:https://blog.csdn.net/weixin_39027589/article/details/81262801

上一篇: C#托盘程序
下一篇: C#程序打包