• -W.LI-
    2019-07-30
    年轻代设置过大:
    1.生命周期长的对象会长时间停留在年轻代,在S0和S1来回复制,增加复制开销。
    2.年轻代太大会增加YGC每次停顿的时间,不过通过根节点遍历,OopMap,old scan等优化手段这一部分的开销其实比较少。
    3.浪费内存。内存也是钱啊虽然现在租的很便宜
    老年代设置过大:
    1.降低FGC频率,有些堆外内存比如直接内存,需要靠FGC辅佐回收的,就会无法释放。万一剩余的堆外内存不够程序也会宕机的吧
    2.单次FGC时间变长,如果在夜深人静的时候主动触发FGC内啥影响,如果白天业务繁忙的时候就凉凉
    3.增加YGC的时间,old scan阶段会扫描老年代,而且这个阶段耗时在YGC总比重很大。

    最好别让太多老年代对象引用年轻代对象,这个坑很痛。
    展开
    
     17
  • -W.LI-
    2019-07-30
    李老师好!感觉老师今天偷懒了,CMS负责老年代回收,年轻代一般配合parNew使用。
    大概啥情况下使用G1比较好啊?之前看见网上说,大堆多核,jdk9以及以上可以使用G1,jdk8的话除非cms满足不了需求不然不建议使用G1。
    G1不太了解老师能推荐下资料么?
    我觉得工具,可以提高效率,初学者优先搞清楚原理扎实基础比较好。

    作者回复: g1实现很复杂,有人专门写了本书来讲,原理入门可以看看这篇文章:https://yq.aliyun.com/articles/444436

     1
     7
  • 新世界
    2019-07-30
    设置过大,回收频率会降低,导致单次回收时间过长,因为需要回收的对象更多,导致GC stop the world时间过长,卡顿明显,导致请求无法及时处理

    作者回复: 对的,主要是会引起gc停顿时间过长

     2
     5
  • 业余草
    2019-07-30
    需要实际操作一遍,光看是记不住的,过一段时间就忘记了。
    
     4
  • QQ怪
    2019-07-30
    设置过大回收频率降低,单次回收的对象量大,回收stw时间过长,设置大也不好,过小也不好,设置适合的才是最好的
    
     2
  • 小唐
    2019-08-13
    老师可以把code分享到github吗?我想自己执行一遍加深印象,这样我们就不用自己配置了,多谢老师!
    
     1
  • nightmare
    2019-07-30
    分情况,如果是G1大年轻代和大老年代没什么问题 如果是cms parnew的话 也需要看情况 如果你的并发比较大并且很快占满eden区 或者 用jstat监控 supervisor区占比一直高于百分之70这个时候 这个时候加大新生代就没有什么问题 如果要很久才占满eden区 或者supervisor区占比比较小 这个时候就要把 新生代 设置小一点 减少新生代回收时间 老年代也要看年轻代晋升到老年代平均占多大 如果晋升很快并且对象占比较大 大一点没问题 否则就需要减少老年代
    
     1
  • 靠人品去赢
    2019-11-28
    之前觉得用到JDK8就够了,据说是XXX维护的最后一个版本。老师讲完G1收集器,突然有兴趣,怪不得人家IDEA新的直接自带JDK11,技术越新越有惊喜啊。
    
    
  • Geek_8c4282
    2019-11-15
    老师,我不太明白,为什么你调大堆内存后堆的大小会频繁震荡,没有发生minorgc和fullgc为什么堆的大小会上下变化,请老师告知下,谢谢
    
    
  • Geek_ebda96
    2019-08-03
    老师您好,请问对于新生代的内存,supervisor和eden区域,大小比例怎样设置合理,这个比例是否对GC性能有影响呢?
    
    
  • CN8818
    2019-08-01

    执行命令:java -Xmx2048m -Xss256k -verbosegc -Xlog:gc*,gc+ref=debug,gc+heap=debug,gc+age=trace:file=gc-%p-%t.log:tags,uptime,time,level:filecount=2,filesize=100m -jar target/demo-0.0.1-SNAPSHOT.jar
    java -Xmx2048m -Xss256k -verbosegc -Xlog:gc*,gc+ref=debug,gc+heap=debug,gc+age=trace:file=gc-%p-%t.log:tags,uptime,time,level:filecount=2,filesize=100m -jar target/demo-0.0.1-SNAPSHOT.jar
    报错:
    Unrecognized option: -Xlog:gc*,gc+ref=debug,gc+heap=debug,gc+age=trace:file=gc-%p-%t.log:tags,uptime,time,level:filecount=2,filesize=100m
    展开

    作者回复: 要采用最新jvm版本12

    
    
  • 月如钩
    2019-08-01
    实操很重要呀,朋友们,纸上谈兵很容易忘
    
    
  • xj_zh
    2019-07-31
    老师,可以讲一讲undertow吗,为什么spring boot 2.0 选择undertow做为默认WEB容器。
    
    
  • 双月鸟
    2019-07-30
    CMS默认开启-XX:+UseAdaptiveSizePolicy,所以G1收集器会根据算法动态决定年轻和年老代的大小不能成为G1的优势
     1
    
  • 弃
    2019-07-30
    谢谢老师。
    
    
  • 许童童
    2019-07-30
    老师讲得好啊,虽然工作中没有用到Java,但读了这篇文章也基本懂了!
    
    
  • 锦
    2019-07-30
    对于CMS来说,设置很大的堆内存,在导致单次STW时间长,会导致服务不可用,定时器出问题?对响应敏感的系统来说不太友好,但堆内存设置太小又会导致频道GC,所以需要综合评估。那么如何使用超大机器内存呢?可以使用集群方式部署,单个应用设置较小的堆内存。
    对于G1来说,文中有提到可以设置较大内存,因为G1是局部收集,但极端情况下,区域之间的对象引用关系非常多,也会导致大面积回收,STW时间会较长。
    目前Java8使用CMS的较多,那么G1普及可能还需要时间吗?

    作者回复: 随着java9 普及开,就默认用g1了

     2
    
  • 弃
    2019-07-30
    老师,我想问个问题:在docker中运行的springboot(使用默认的tomcat容器),如何查看tomcat的gc日志?

    作者回复: 可以登到容器内去看,不过一般会把容器的日志目录mount到主机的某个目录

    
    
  • a、
    2019-07-30
    年老代如果设置过大,会导致full gc时间过长,full gc需要stop-the-world,程序会出现长时间停顿。如果年轻代设置过大,因为年轻代用的是标记-复制算法,所以会出现需要复制大量数据的情况,也需要stop-the-world,所以也会出现长时间停顿
     1
    
我们在线,来聊聊吧