JVM垃圾收集的一些参数用法

在JAVA中我们知道垃圾回收都是JVM自动去处理的,但有时候需要进行一些性能调优时,必须对JVM的垃圾收集有一定了解;

首先要知道JVM是如何在堆中分配对象,JVM是通过指针碰撞的方式寻找下一个存放地址,当如果下一个存放地址的大小不足以放下一个对象时,此时触发GC回收(正常情况是Minor GC);正常分配时在多线程环境中存在存储资源竞争,需要全局加锁,但是效率低下,所以JVM引入的TLAB(Thread Local  Allocation Buffer),线程本地缓冲,该空间指定年轻代的EDEN区默认占比1%,可通过-XX:TLABWasteTargetPercent参数设置占比,可用-XX:+PrintTLAB查看占比,因为大多数对象较小所以用该分配方式效率较高。

垃圾收集算法种类:

1、复制算法:开辟两块大小一样的空间,我们称为from区和to区,当进行垃圾收集时,会将存活的对象复制至to区,如果to区不够存放存活对象时,可采用分配担保机制将不够存放的对象直接放入老年代,然后在将from区和其他区域清除,from区和to区角色互换;优点是速度快,不易产生内存碎片,缺点是每次都要开辟两块大小一样的空间,有点浪费,见下图:


标记复制算法

2、标记清除算法:和复制不一样,当系统标记后之后,对所有不可用对象的空间直接清除,缺点是效率不高,容易产品内存碎片,见下图:

标记清除

3、标记整理算法:类似标记清除类似,只是整理算法在做清除的时候是将所有可用的对象将一端移动,然后清理端以后不可用的对象,见下图:

标记整理

可达性分析算法:

JVM中通过可达性分析来判断对象是否存活,当一个对象的引用没有执行GC roots时,那么我们认为该对象不可用,可以进行回收,见下图:

可达性分析算法

上面介绍了一些垃圾收集算法和判断对象可用的算法,下面来介绍具体的垃圾收集器;

1、Serial收集器:年轻代收集,单线程收集,采用复制算法,默认Client模式默认收集器,对于单核CPU和堆内存小使用效率比较好,缺点是Stop-the-world,收集垃圾时所有用户线程不可用,JVM参数中用-XX:+UseSerialGC开启;

2、SerialOld收集器:老年代收集,单线程,采用标记整理算法,缺点和Serial收集器类似,JVM参数中用-XX:+UseSerialOldGC开启;

3、ParNew收集器:年轻代收集,多线程,采用复制算法,好处是速度快,可开启多个垃圾线程收集,优点是可并行运行,缺点单核CPU下效率不比Serial收集器快,JVM参数下用-XX:+UseParNewGC开启;

4、Parallel Scavenge收集器:年轻代收集,采用复制算法,可并行多线程收集器,优点是注重吞吐量,缺点是停顿时间较长,用户体验不太好;停顿时间可用-XX:MaxGCPauseMillis参数设置,吞吐量大小-XX:GCTimeRatio参数设置;例如设置吞吐量19,那最大GC时间就占总时间5%;(1/(1+19)),默认值99;该收集器提供一个参数-XX:+UseAdaptiveSizePolicy,该参数属于自适应调节策略,JVM会根据运行情况收集性能监控信息,动态调整这些参数(年轻大小-Xmn,Eden和Survivor去的占比-XX),JVM参数中用-XX:+UseParallelGC开启;

5、Parallel Old收集器:老年代收集,多线程,采用标记整理算法,优缺点和Parallel Scavenge收集器一样,只是之前老年代收集只有Serial Old收集,所以Parallel Scavenge收集和Serial Old收集组合一起发挥不了吞吐量的优势,所以出现了该收集器,JVM参数中用-XX:+UseParallelOldGC开启;

6、CMS收集器:老年代收集,多线程,采用标记清除算法,优点是可并行并发处理,注重停顿时间,用户体验更快,缺点是产生浮动垃圾,内存碎片,吞吐量会下降,CMS收集分四个步骤,分别是初始标记==>并发标记==>重新标记==>并发清除,其中初始标记和重新标记会出现Stop the World,而并发标记和并发清除可与用户线程一同运行;什么是浮动垃圾,当在做并发清除是,用户线程也在运行,那么势必会有新的垃圾收集,由于已经处在清除阶段了,所以只能下一次去清理掉,CMS收集默认不是老年代填满进行收集,而是预留一定的空间供收集是的程序使用,如果预留空间不足,那么就会出现Concurrent Mode Failure错误,当出现这个错误时,JVM提供一个预案:临时启动Serial Old收集器,JVM提供一个参数来社会自百分比:-XX:CMSInitiatingOccupancyFraction来设置,此参数最好不要设置过大,如果过大则可能出现 Concurrent Mode Failure错误,性能会下降;由于CMS收集会产生内存碎片,所以JVM提供了一个参数:-XX:+UseCMSCompactAtFullCollection设置,当内存不足需要进行GC是,可先开启内存:缩;JVM参数中可用-XX:+UseConcMarkSweepGC开启;

7、G1收集器:年轻代和老年代共用,多线程处理,采用标记整理算法,优点是可并行并发处理、分代收集,空间整合、有点回收垃圾多的区域、可预测低停顿;G1收集分四个步骤:初始标记==>并发标记==>最终标记==>筛选回收;G1收集做法是将堆划分大小一样的Region区域,针对具体的区域回收,G1通过Remembered Set方式避免全堆扫描,每个Region都有对应的Remembered Set,每次Reference类型数据写操作时,JVM产生一个Write Barries进行终端,检查Reference引用的对象是否处于不同的Region之间,如果是,通过卡表把相关引用信息记录到被引用对象的Remembered Set中,那么进行可达性分析时加入Remembered set记性扫描;JVM参数中可用-XX:+UseG1GC开启;

注:Parallel Scavenge和Parallel Old注重吞吐量,而CMS收集器和G1收集注重低停顿;

针对上面出现的一些词语进行解释:

吞吐量:举个例子,假如JVM运行100分钟,垃圾回收用1分钟,那么吞吐量就是99%,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间);

并行:这个就是在垃圾收集是,可以有多个垃圾收集线程同时运行,此时用户线程正在暂停;

并发:这个意思就是用户线程与垃圾收集线程同时运行,也有可能交替执行,具体看CPU核数;

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

推荐阅读更多精彩内容

  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 5,932评论 2 31
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,316评论 17 311
  • 声明:原创文章,转载请注明出处。http://www.jianshu.com/u/e02df63eaa87 垃圾收...
    唐影若凡阅读 1,053评论 1 6
  • Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系...
    尹小凯阅读 1,675评论 0 10
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,511评论 3 83