本文知识点
-
STW(Stop the world)的概念
-
安全点的概念
-
GCRoots 的概念
-
Remember Set (记忆集)
本篇内容以概念为主,先了解概念,知道有哪些名词,东西, 再实战看里面的东西去加深理解
GC 总述
java 在运行时,生成的对象都在堆里存放着,有些对象的生命周期很短,只几行代码运行完就没用了.没用了之后不能放任他在堆里, 要进行回收,把空间空出来,给后面的对象.
我们常用收拾屋子来比喻 jvm 清理堆.这里, 我们不仅仅有个房子, 我们还可以想得再大胆一些,天降一女侠当老婆,是家里的一把手,掌管整个家. 不久,又天降一大胖小子, 小子性格独立,也有自己的一块小空间.然后小刀就要开始打扫卫生,收拾房子了!
GC 相关概念
STW(Stop the world)
于生活中, 就是我要开始打扫卫生了, 大家先别动,让我看看哪些东西是现在女侠和小子没有在用的,又散落在外面占用空间, 当然我也不敢让她们停太长时间, 所以趁他们停下来的时候,赶紧扫一眼,先把他们手上没有用到的东西记下来, 然后赶紧让她们继续玩乐.
于 JVM 中,就是应用先停下来,然后 GC 工作线程,赶紧扫描一遍,看看哪些对象是还有用,哪些是没用的
安全点
这里其实是两个概念, 一个是安全点, 一个是安全区域. 都是描述 STW 发生的时机, 要让 STW 发生的时候,系统的对象引用关系不会改变.
在我要喊停女侠和小子的时候, 如果我一喊相当于按了定时器,把她们都定住了,然后我发现女侠还在倒水, 不太好, 只先解锁女侠的锁定, 让她倒完水再停. 这是抢先式中断现在生活中, 很少有这样的.
更多的场景是, 她们的耳朵一直听着我有没有说话(轮询状态), 我一喊停. 然后她们赶紧把手里面的活停下来,或者去沙发坐着,或者去床上躺着等自己最近的安全点上主动停下.
安全区域: 如果我喊停的时候, 小子刚好在睡觉(线程在休眠,或者阻塞). 虽然没有听到我喊的停,但也是安全的.
GCRoots
有句话说是, 擒贼先擒王,要抓住事物的主要矛盾! 当家里的东西很乱的时候, 要问问女侠和小子是怎么回事, 过去一看, 好家伙, 原来女侠在教小子识物学字. 学一个字,找一个对应的物品. 这时候, 本扫地的只要拿着那个小本子看一看, 就能顺着找到哪些是要用的 ,哪些是已经没用的了.
在 JVM 中, 有一个根对象的概念, 就是堆里面的东西和他们有关系的就是要用的, 没有关系的,就是可以回收的了.我们来这样分类记忆
先是和类相关的:
- 类静类属性引用的对象
然后是和实例相关的:
-
虚拟栈中使用到的参数,局部变量,临时变量
-
JNI 中引用的对象
然后是 JVM 层面的:
-
常量引用的对象,如字符串常量池里的引用
-
所有被 synchronized 持有的对象
-
虚拟机内部的引用,如 Class 对象, 常驻内存的异常对象,系统类加载器等等
RemberSet 记忆集
纵观现在对大数据量的处理,大都是分而治之, 划区而治. 那区与区之间不可能为了查 A 区的某条信息,把整个 B 区都查一遍.
如小刀我现在在上海工作, 女侠在成都.那么在上海就会有个记忆集,里面存着, 有成都某某区某某街(精确度有不同的实现)到小刀的一条引用关系.
那哪一天上海要统计人员的时候, 来找到小刀了, 我说我在成都哪里哪里还有人, 那统计人员就到那个区域查一查, 看我有没有说慌. 如确实有引用关系, 好,那小刀还有人关心着, 让他继续工作吧. 要是一查,发现没有这个引用关系, 得了, 没人要的小刀, 可以关进小黑屋喽~!
总结
本篇是纯理论知识,但理论也是从生活中总结出来的. 因此在学习时,还是要多多联系实际, 概念记不住,我们就记生活场景! 加油!!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于