JVM垃圾回收(新手推荐)

提到JVM垃圾回收,总觉得离我们程序员有一定的距离。在JAVA中,那是系统自己干的事,我们关心那个干嘛?也就是说我们为什么要学习这个东西,大家开开心心地敲代码不好吗?

还真的不好,一方面我觉得我们可以学习下JAVA语言设计上的一些思想,另一方面,在我们以后从事一些较为高级一点的开发,尤其是性能调优之类的,知道这些基础知识就显得很必要了。我打算从以下几个方面开始进行简单地说明。

GC如何知道哪些对象是垃圾对象?

GC不可能随便指派说哪个对象是垃圾,要有一定的依据。常用的标记垃圾的算法有两个:

引用计数算法

引用计数算法,就是每个对象有一个引用计数器,当该对象被引用的时候计数器加1,当引用失效的时候,计数器减1。

那么这么做有什么缺点吗?

那就是当两个对象相互引用的时候,这两个对象都会无法释放。

根搜索算法

从根对象开始,所有能被触及的对象都可以认为是“存活的”对象,换句话说,就是“仍然使用的”对象。不能被触及的对象,就会被认为是垃圾,需要回收。

根搜索算法(图片来自于网络)
根搜索算法(图片来自于网络)

那么什么对象可作为GC Roots呢?

  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象;
  2. 方法区中类静态属性的引用;
  3. 方法区中常量引用的对象;
  4. 本地方法栈中JNI(Native方法)引用的对象。

什么是虚拟机栈?

虚拟机栈为Java方法服务。说的简单点,就是我们平时所写的Java方法,没调用一个Java方法,就是入栈的过程,退出方法就是出栈的过程。每个Java方法对应于虚拟机栈中的一个栈帧。

什么是本地方法栈?

本地方法栈为native方法服务。

方法区是什么呢?

方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。可以看做堆的一个逻辑部分。

常用的垃圾回收算法有哪些?

看下图,整幢大楼灯火通明,其中不排除一些办公室没人但还是灯亮着的情况,为了节约资源,我们需要关掉那些办公室没人的灯。那么怎么办呢?

内存啊
内存啊

标记——清除算法

我从顶楼开始到一楼,一块一块办公区域看,对没人的区域进行关灯。将整个大楼看成内存,灯亮着的区域表示有对象存在,灯灭着的表示空闲区域。我们一块一块区域检查的这个过程就是标记的过程,关灯的操作就是清除的过程。这就是标记——清除算法。

标记——清除算法(图片来自于网络)
标记——清除算法(图片来自于网络)

弊端:

  1. 那就是费时费力,效率太低。
  2. 不连续,不美观(内存碎片严重)。

复制回收算法

老板说了,浪费太严重了,到了晚上,我们对需要加班的同事进行统一安排。假设大楼共10层,只能使用15层或者610层(毕竟晚上加班的人不多)。比如现在使用的就是15楼,到了晚上要用灯了,需要加班的同事自己去610楼找位置,保安一听乐了,再也不用一块一块区域关灯了,有需要的人都去610楼了,剩下的即便是灯亮着的办公区域那也是没人,让我分别去15楼拉个总闸先(回收的过程)。

复制回收算法(图片来自于网络)
复制回收算法(图片来自于网络)

可以看到,在任意时刻只用到了内存的一半。

弊端:

  1. 有需要的同事搬到6~10楼的过程,太麻烦。特别是需要加班的同事比较多的时候。(需要对有用的对象进行复制)。
  2. 整栋大楼只能用一半,哎(内存使用率降低)。

优点:

从外面看,我知道哪些地方有人,哪些地方没人,方便了管理(内存无碎片)。

标记——整理算法

下班后,保安大哥将空的办公区域依次统计出来(标记的过程),需要加班的同事按照统计结果,依次搬到空闲的办公区域。保安大哥知道,我只需要找到最后一个有人的区域,那么这块区域之后肯定不会有人了,不用挨个检查了,去拉后面的闸。

标记——整理算法(图片来自于网络)
标记——整理算法(图片来自于网络)

优点:

  1. 内存无碎片。
  2. 同时避免了当有用对象比较多的时候,复制回收算法的麻烦。

分代回收算法

JVM划分
JVM划分

新生代:

刚创建的对象都在新生代,新生代采用复制回收算法。新生代分为三个区,一个Eden区,一般两个Survivor区。大部分对象在Eden区生成,当Eden区域满时,将还存活的对象复制到其中一个Survivor区域,当这个Survivor区域满时,将其中还存活的对象复制到第二个Survivor区域。那么当第二个Survivor区域满时该怎么办呢?那就是将第二个Survivor区域中由第一个Survivor区域复制过来的对象,复制到“老年代”中。

这个过程是有点绕,但是可以想象成面试过程中层层选拔的过程,能力越强的可以想象成生命周期越长的对象。

老年代:

这个区域中的对象都是在新生代中经历了层层回收后仍然存活的对象,这个区域采用标记整理的算法进行垃圾回收。

持久代:

持久代中用于存放一些静态文件,static常亮,常量池等。这块区域对垃圾回收没有显著影响。

什么时候会进行垃圾回收?

GC有两种类型:Minor GC和Full GC。

Minor GC

当新对象生成,并且在Eden申请空间失败时,就会触发Minor GC,对Eden区域进行GC,清理非存活对象。

Full GC

对整个堆进行整理,所以比Minor要慢,所以尽可能地减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:

  1. 老年代被写满;
  2. 持久代被写满;
  3. System.gc()被显式调用。

参考资料:《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,286评论 17 311
  • 作者:一字马胡 转载标志 【2017-11-12】 更新日志 日期更新内容备注 2017-11-12新建文章初版 ...
    beneke阅读 2,183评论 0 7
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,619评论 0 7
  • 1.一些概念 1.1.数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始...
    落落落落大大方方阅读 4,502评论 4 86
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 5,927评论 2 31