Java Virtual Machine 02


GC概述

  • 引用计数法

  • 根搜索算法(虚拟机基本采用这个方法)

引用分类

  • 强引用: Object a = new A() 不会被回收

  • 软引用:还有用但不是必须的对象,可以被回收,用softReference实现,回收掉弱引用后内存还不够就回收软引用

  • 弱引用:非必须对象,比软引用还要弱,垃圾回收第一批

  • 虚引用:最弱引用,一定会被回收

跨代引用

记忆集合和卡表

记忆集可以缩小GC时扫描的对象

主要使用卡精度,卡表是使用卡精度的记忆集的具体实现方式

垃圾回收步骤

  1. 跟搜索算法判断不可用

  2. 看是否有必要执行finalize

  3. 两个步骤执行完后对象仍然没人用就属于垃圾

使用finalize进行自救

GC类型

  • Minor/YoungGC:发生在新生代的收集动作
  • Major/OldGc:发生在老年代的GC,目前只有CMS收集器有这个行为
  • MixedGC: 收集整个新生代和部分老年代,只有G1收集器有这个行为
  • FullGC:收集整个java堆和方法区的GC

STW

无用类的定义

  • JVM中该类所有实例都已经被回收了
  • 加载该类的classLoader被回收了
  • 没有任何地方引用这个类的对象
  • 无法在任何地方通过反射访问这个类

GC算法

  • 新生代使用复制算法
  • 老年代使用标记整理法

标记清除法

GC后会产生很多内存碎片

复制算法

标记整理法

垃圾收集器

  • 串行收集:GC单线程内存回收,暂停所有用户线程 如:Serial

  • 并行收集: 多个GC线程并发工作,用户线程暂停 如:Parallel

  • 并发收集:用户线程和GC线程同时执行,不暂停用户线程 如:CMS

仅针对hotspot虚拟机

串行收集器

  • Serial和Serial old, 是一个单线程的收集器,GC时一定会发生STW

  • 只启用一个GC线程,并且暂停用户线程

并行收集器

  • ParNew/ParOld在老年代要配合CMS收集器

特点:

Parallel Scavenge和ParNew对比:

CMS收集器

特点:

指令:

image-20221215172916799


A u t h o r: Joe
P o l i c y: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Joe !
Leave Your Comment Here
  TOC