JVM初步认识(二)

一.垃圾回收机制

1.如何判断是否是垃圾

使用可达性分析算法,不使用引用计数法

  • 引用计数法:有一个地方引用对象,计数加一,当计数为零时表示可以回收;
    缺点是难以解决对象之间的循环引用问题
  • 可达性分析算法:
    必须找到一个肯定不会被回收的对象(GC ROOT 对象),这个对象为起点,看是否能够沿着引用链找到该对象,找不到表示可以回收
    GC ROOT对象:包括栈帧中的局部变量,方法区的静态变量,方法区中的常量,本地方法栈中JNI引用的对象。
public class test{
	private static Map<String,Object> map=new HashMap<>;
	public static void main(String [] args) throws InterruptedException{
		map.put("s1",new Student());
		Student s1=new Student();
}

2.垃圾回收的算法

一般来说,JVM 垃圾回收是指对堆内存进行垃圾回收

  • 『标记 - 清除算法』(Mark Sweep):第一遍标记,第二遍收集。缺点是会产生内存碎片,碎片过多的话,连续空间会减少
    在这里插入图片描述
  • 『标记 - 整理算法』(Mark Compact):第一遍标记,第二遍整理,整理是指存活对象向一端移动来减少内存碎片,相对效率较低
    在这里插入图片描述
  • 『复制算法』:开辟两份大小相等空间,一份空间始终空着,垃圾回收时,将存活对象拷贝进入空闲空间,优点是不会有内存碎片,缺点是占用空间多
    在这里插入图片描述
  • JVM 次采用的是『分代收集』:根据对象的特点分代(分区域)来进行,分为新生代和老年代,新生代对象一般很少存活,采用『复制算法』,老年代对象生存时间长,回收频率比较低,适合采用『标记 - 清除算法』或『标记 - 整理算法』

3.垃圾回收器

  • Serial:工作在新生代的单线程垃圾回收器,采用「复制算法」,垃圾回收发生时,会暂停所有用户线程。
  • SerialOld:工作在老年代的单线程收集器,采用「标记 - 整理算法」,垃圾回收发生时,会暂停所有用户线程
  • ParNew工作在新生代的多线程收集器,采用「复制算法」,垃圾回收发生时,会暂停所有用户线程,多个CPU下才能充分发挥性能。
  • CMS(Concurrent Mark Sweep)工作在老年代,基于多线程和「标记 - 清除算法」,用在重视响应速度,停顿时间最短的场合。特点是在标记和清理的某些阶段不必暂停用户线程,也需要在多个CPU下才能充分发挥性能。
  • Parallel Scavenge工作在新生代的多线程收集器,采用「复制算法」,垃圾回收发生时,会暂停所有用户线程单核cpu并不能工作地比Serial好,它的特点是一个以吞吐量优先的回收器
  • Parallel Old工作在老年代的多线程收集器,采用「标记 - 整理算法」,垃圾回收发生时,会暂停所有用户线程,也是以吞吐量优先的回收器
  • CMS(Concurrent Mark Sweep)用在重视响应速度,停顿时间最短的场合。工作在老年代,基于多线程和“标记 - 清除算法”,特点是在标记和清理的某些阶段不必暂停用户线程。最早就是使用CMS进行垃圾回收,不过因为容易产生内存碎片,Java 11用的是G1。
  • G1(垃圾前)把整个内存区域划分为大小相等的若干区域(区域),分为Eden,Survivor,Old,Humongous四种类型,G1优先回收其中垃圾最多的区域。采用它的算法的英文Mark-Copy不会产生大量内存碎片,它的优势在于可预测的停顿时间

注:
响应时间优先:每一次的响应时间最小。
吞吐量优先:总的垃圾回收时间占比较小,而停顿时间优先,是每次垃圾收集的暂停时间更短,但垃圾收集发生的次数相对更为频繁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值