本文知识点

  • STW(Stop the world)的概念

  • 安全点的概念

  • GCRoots的概念

  • Remember Set (记忆集)

本篇内容以概念为主,先了解概念,知道有哪些名词,东西, 再实战看里面的东西去加深理解

GC总述

java在运行时,生成的对象都在堆里存放着,有些对象的生命周期很短,只几行代码运行完就没用了.没用了之后不能放任他在堆里, 要进行回收,把空间空出来,给后面的对象.

我们常用收拾屋子来比喻jvm清理堆.这里, 我们不仅仅有个房子, 我们还可以想得再大胆一些,天降一女侠当老婆,是家里的一把手,掌管整个家. 不久,又天降一大胖小子, 小子性格独立,也有自己的一块小空间.然后小刀就要开始打扫卫生,收拾房子了!

GC相关概念

STW(Stop the world)

于生活中, 就是我要开始打扫卫生了, 大家先别动,让我看看哪些东西是现在女侠和小子没有在用的,又散落在外面占用空间, 当然我也不敢让她们停太长时间, 所以趁他们停下来的时候,赶紧扫一眼,先把他们手上没有用到的东西记下来, 然后赶紧让她们继续玩乐.

于JVM中,就是应用先停下来,然后GC工作线程,赶紧扫描一遍,看看哪些对象是还有用,哪些是没用的

 

安全点

这里其实是两个概念, 一个是安全点, 一个是安全区域. 都是描述STW发生的时机, 要让STW发生的时候,系统的对象引用关系不会改变.

在我要喊停女侠和小子的时候, 如果我一喊相当于按了定时器,把她们都定住了,然后我发现女侠还在倒水, 不太好, 只先解锁女侠的锁定, 让她倒完水再停. 这是抢先式中断现在生活中, 很少有这样的.

更多的场景是, 她们的耳朵一直听着我有没有说话(轮询状态), 我一喊停. 然后她们赶紧把手里面的活停下来,或者去沙发坐着,或者去床上躺着等自己最近的安全点上主动停下.

安全区域: 如果我喊停的时候, 小子刚好在睡觉(线程在休眠,或者阻塞). 虽然没有听到我喊的停,但也是安全的.

 

GCRoots

有句话说是, 擒贼先擒王,要抓住事物的主要矛盾! 当家里的东西很乱的时候, 要问问女侠和小子是怎么回事, 过去一看, 好家伙, 原来女侠在教小子识物学字. 学一个字,找一个对应的物品. 这时候, 本扫地的只要拿着那个小本子看一看, 就能顺着找到哪些是要用的 ,哪些是已经没用的了.

在JVM中, 有一个根对象的概念, 就是堆里面的东西和他们有关系的就是要用的, 没有关系的,就是可以回收的了.我们来这样分类记忆

先是和类相关的:

  1. 类静类属性引用的对象

然后是和实例相关的:

  1. 虚拟栈中使用到的参数,局部变量,临时变量

  2. JNI中引用的对象

然后是JVM层面的:

  1. 常量引用的对象,如字符串常量池里的引用

  2. 所有被synchronized 持有的对象

  3. 虚拟机内部的引用,如Class对象, 常驻内存的异常对象,系统类加载器等等