JVM(3)垃圾收集器与内存分配策略

垃圾收集器与内存分配策略

垃圾回收需要解决的核心问题:哪些内存需要回收?什么时候回收?如何回收?
下面我们针对这三个问题进行分析。

堆空间回收

引用计数法

给对象添加一个引用计数器,当有一个地方引用它时,计数器+1,当失效时-1。任何时候计数器为0的对象就是不可再被使用的。
引用计数法在很多地方被使用到,但是主流的虚拟机并没有使用这一算法,主要原因是它很难解决对象间的相互循环引用。例如,定义两个对象,他们相互引用对方,按照引用计数法就不能被回收。

可达性分析算法

主流的商用语言通过可达性算法来判断对象是否存活。
通过一系列称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连,则证明此对象是不可用的。
GC Roots的对象包括:
1、虚拟机栈(栈帧中的本地变量表)中引用的对象。
2、方法区中类静态属性引用的对象。
3、方法区中常量引用的对象。
4、本地方法栈中(Native方法)引用的对象。

finalize方法

经过引用计数法或者可达性分析算法被标记为需要进行垃圾回收的对象也并不是一定会被垃圾回收的。如果方法被finalize修饰,且finalize方法未被执行,则对象仍然存活。需要注意的是,finalize方法只执行一次。

方法区回收

方法区主要回收两方面内容:废弃常量和无用的类。
方法区的回收条件比较苛刻,满足垃圾回收的条件,同时需要设置参数支持。

垃圾收集算法

1、标记-清除算法:缺点是效率不高,而且造成内存空间的碎片化。
2、复制算法:适用于新生代、解决了空间碎片的问题,但是空间利用率不高。HotSpot默认的Eden和Survivor大小比例是8:1:1。当Survivor空间不够时,需要依赖老年代进行分配担保。
3、标记-整理算法:整理即移动,将存活的对象向一端移动,避免了复制浪费内存,适合老年代。

HotSpot的算法实现

1、枚举根节点(OopMap)
在类加载完成的时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来,在JIT编译过程中,也会在特定的位置记录下栈和寄存器中哪些位置是引用。这样GC在扫描的时候就可以直接知道这些信息了。
2、安全点
HotSpot并没有为所有的指令都生成OopMap,这样会浪费大量的额外空间。只是在特定的位置记录了这些信息,这些特定的位置叫做“安全点”。即程序执行时并没有在所有地方都能停顿下来执行GC,只有到达安全点才执行。
3、安全区域
安全区域是指在一段代码中,引用关系都不会发生变化,在这个区域中任意地方开始GC都是安全的。我们可以把安全区域看成扩展了的安全点。

垃圾收集器

垃圾收集器
1、Serial收集器:新生代垃圾收集器,是运行在Client模式下的默认新生代收集器。单线程。执行垃圾收集时必须暂停其他所有的工作线程。
2、ParNew收集器:ParNew收集器其实就是Serial收集器的多线程版本。是运行在Server模式下虚拟机的首选新生代收集器,因为只有他能与CMS配合使用,达到并发效果,减少了停顿时间,提高用户体验。
3、Parallel Scavenge收集器:关注吞吐量,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。适用于在后台运算而不需要太多交互的任务。
4、Serial Old收集器:是Serial收集器的老年代版本。
5、CMS收集器:是以获取最短回收停顿时间为目标的收集器。基于标记-清除算法。
6、G1收集器:最新的收集器,关注低停顿。

垃圾收集器参数总结

此部分转自垃圾收集器参数总结

内存分配与回收策略

1、对象优先在Eden中分配
2、大对象直接进入老年代
3、长期存活的对象进入老年代(默认15岁)
4、动态对象年龄判定:如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象就可以直接进入老年代,无需等到最大年龄。
5、空间分配担保

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值