jvm gc使用的算法配置和原理

jvm中gc一直在开发过程容易被忽略,就像内存的自动分配一样,很多人并不了解内存中的对象和实例是如何被回收的。以及出现问题应该如何定位,因此需要我们队gc的原理有一个比较深入的了解。
1、java提供的gc算法
2、根据jvm配置,gc算法的选择
3、查找gc的命令以及根据现象查找可能出现的问题
4、gc的其他相关问题

===============================================================

首先,
要了解一个概念,那些内存需要回收?引用计数器法和可达性分析法;引用计数法是通过判断对象的引用数量来判断是否可以被回收(0被回收)。可达性分析法是通过判断对象的引用链来判断是否被回收(不可达回收)。—-一般相互引用的计数器法无法解决,可达性是指对象实例到gc root不可达,一般可以作为gc root的有四中对象:a、虚拟机栈中引用的对象 b、方法区静态属性应用的对象 c、方法区常量引用的对象 d、本地方法栈native引用的对象
其次,
要了解什么时候去回收?
在新生代、老年代、永久代执行minigc,fullgc
在显示的调用system.gc会建议fullgc,不一定执行,当新生代、老年代达到一定比例时(可在jvm参数配置),执行gc。
第三,
需要了解,如何去回收也是本文的重点


stop-the-world在垃圾回收之前,一定会执行stop-the-world,两次标记则至少停止两次,stop-the-world时候,所有线程(除gc线程)会处于safe-region,等待gc任务完成。很多时候GC的优化就是指减少stop-the-world的时间使得系统能支持高并发、低停顿


1、常用的java gc算法
1)、复制算法
复制算法讲内存分为相等的两份,当一块用完了,就将还存活的对象复制到另外一块,然后清楚这块内容。特点:速度快、浪费资源。一般新生代使用此法。
2)、标记整理算法
一般适用于老年代,将活跃的对象向一侧移动,然后将边界外的对象清除掉
3)、标记清除算法
一般标记和清除的算法都不会太高,而且处理完后会产生很多的内存碎片。一旦大的对象无法申请到足够内存空间时,会触发新的一次gc。
4)、分代收集算法
根据不同的分代,采用不同的算法。
下面有一张很合适的的图:
这里写图片描述

2、不同的算法,会对应不同的垃圾回收器。
在jvm配置中,我们可以配置不同垃圾回器,也就是对应了不同算法。
用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器
* Serial回收器 (复制算法),最早使用,新生代单线程回收,标记和清理都是单线程。
* Serial Old(标记清理算法) ,单线程老年代回收
* PraNew(复制算法),新生代多线程并发执行,多核下一定会表现比Serial好。
* Parallel Scavenge(复制算法)新生代多线程并发执行,追求高吞吐量,会充分利用cpu,使用对应用交互要求不高的。要不然会影响正常业务。
* Parallel Old(标记清理算法)老年代多线程并发,搞吞吐。
* CMS (标记清除算法) 老年代,追求高并发高吞吐,低停顿
* G1 (标记清理算法)使用与新声带和老年代

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值