大家好,又见面了,我是你们的朋友全栈君。
- 引用计数算法:
简单的来说就是判断对象的引用数量。实现方式:给对象共添加一个引用计数器,每当有引用对他进行引用时,计数器的值就加1,当引用失效,也就是不在执行此对象是,他的计数器的值就减1,若某一个对象的计数器的值为0,那么表示这个对象没有人对他进行引用,也就是意味着是一个失效的垃圾对象,就会被gc进行回收。 但是这种简单的算法在当前的jvm中并没有采用,原因是他并不能解决对象之间循环引用的问题。 假设有A和B两个对象之间互相引用,也就是说A对象中的一个属性是B,B中的一个属性时A,这种情况下由于他们的相互引用,从而是垃圾回收机制无法识别。
- 可达性分析算法:
因为引用计数法的缺点有引入了可达性分析算法,通过判断对象的引用链是否可达来决定对象是否可以被回收。可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连(就是从 GC Roots 到这个对象不可达)时,则证明此对象是不可用的。
- 会在cpu空闲的时候自动进行回收
- 在堆内存存储满了之后
- 主动调用System.gc()后尝试进行回收(不一定成功)
- 标记-清除算法:
标记
所有需要回收的对象,然后
清除
标记的对象
空间碎片
,资源浪费
- 复制算法
内存分为两块
,当使用的一块满了就将
存活对象
复制到另一块中,再将使用的那一块清空
- 标记-整理算法
标记
所有需要回收的对象,然后
清除
标记的对象,再将剩下的
存活对象整理
,避免了空间碎片的产生
- 分代收集算法
新生代、老年代、永久代
eden、survivorl0、survivor1
三个区域
大批对象死去
,只有少量存活,那就选用复制算法。只需要付出少量
存活对象
的复制成本就可以完成收集。
对象存活率高
、没有额外空间对他进行分配担保,就必须用标记
–
清除或者标记
–
整理
jvm
可以使用系统的内存。理论上取决于
32
位
/
64
位系统可虚拟的内存大小。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136666.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...