常见jvm问题整理

阿凡达2018-08-21 09:34
  1. 所有的new的新生对象,都会先分配在eden区
  2. 什么时候触发ygc:eden区空间不够的时候
  3. ygc发生了什么: 清空 eden + from 中所有 no ref的对象占用的内存 将 eden + from 中的所有存活对象copy到to中的这个过程中,一些对象将会晋升到old中
        -- to区放不下的
        -- 存活次数超过tenuring threshold的
    
    重新计算tenuring threshold的次数
  4. 什么情况下放到old区
    1. survivor区满
    2. survivor中的内容足够老
    3. 大对象直接进入老年代
    4. 动态判断对象年龄,如果survivor区中相同年龄的对象总大小大于survivor空间的一般,年龄大于或者等于该年龄的对象可以直接进入老年代
  5. 默认的GC算法: JDK1.6中对默认的GC 回收方式为:-XX:-UseParallelGC 年轻代为并行年老代为串行 而在JDK1.7中默认的GC回收方式则变成了-XX:-UseParallelOldGC -XX:+UseParallelGC 使用Paralle收集器 + 老年代串行 -XX:+UseParallelOldGC 使用Paralle收集器 + 老年代并行
  6. 什么时候触发full gc;
    1. 老生代空间不足
    2. 永久代Permanet Generation空间满
    3. CMS GC时出现promotion failed和concurrent mode failure
    4. 统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间
    5. System.gc()被显式调用
  7. 什么是Parallel Collector的悲观策略 在向Eden区申请空间时,如果Eden区不够,那么看当前申请空间是否大于Eden区的一半,如果大于则直接在old区分配,否则触发MinorGC,执行以下判断: 采用Parallel GC的情况下,当YGC触发时,会有两个检查:
        1、在YGC执行前,min(目前新生代已使用的大小,之前平均晋升到old的大小) > 旧生代剩余空间大小 ?不执行YGC,直接执行Full GC : 执行YGC;
        2、在YGC执行后,平均晋升到old的大小 > 旧生代剩余空间大小 ? 触发Full GC : 什么都不做。
    
  8. 观察到频繁full GC,怎么办?
    1. GC不掉:dump内存,使用MAT分析内存泄露在哪里?
    2. 可以GC掉,但是GC频繁
      1. old区增加过快
      2. old区太小,频繁 full gc
      


网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者侯本文授权发布。