首页 > 代码库 > JVM-垃圾收集器与内存分配策略

JVM-垃圾收集器与内存分配策略

  • 判断对象是否存活
    1. 引用计数法:强引用->软引用(内存溢出异常前第二次回收)->弱引用->虚引用
    2. 可达性分析算法:一个对象到GC Roots没有任何引用链(Reference Chain),则证明此对象不可用
  • 无用的类标准
    1. 该类所有的实例都已回收
    2. 加载该类的ClassLoader已被回收
    3. Class没有在任何地方被引用,及反射
  • 垃圾收集算法:标记-清除算法(CMS)、复制算法(新生代)、标记整理算法
  • HotSpot算法
    1. 枚举根节点:通过一组OopMap,在类加载完成的时候,把对象内什么偏移量是什么类型的数据计算出来,也会在特定位置记录下栈和寄存器中哪些位置是引用
    2. 安全点:
      • 没有为所有指令都生成OopMap,程序并发所有地方都能停下来执行GC,只有到了安全点才能暂停
      • 主动式中断:GC需要中断线程时,设置一个标志,线程执行时主动去轮询这个标志,再中断挂起
  • 垃圾收集器
    1. Young generation:Serial、ParNew、Parallel Scavenge
    2. Tenured generation:CMS、Serial Old、Parallel Old
    3. Serial在Client模式下是很好的选择
    4. ParNew:-XX:ParallelGCThreads来限制垃圾收集的线程数
    5. Parallel Scavenge:达到一定可控制的吞吐量。-XX:GCTimeRatio
    6. Serial Old:在并发收集发生Concurrent Mode Failure时使用
    7. 停顿时间组合:ParNew+CMS
    8. 吞吐量优先:Parallel Scavenge+Parallel Old
    9. CMS:a、默认线程数(CPU数量+3)/4;b、运行期间内存无法满足程序要求会出现Concurrent Mode Failure;c、碎片压缩与频度可以设置
  • 常用参数

    -XX:+PringGCDetails:打印内存回收日志
    -XX:MaxTenuringThreshold=1:晋升到老年代的年龄
    -XX:PretenureSizeThreshold:直接晋升到老年代的对象大小
    -XX:+HandlePromotionFailure:空间分配担保,避免Full GC过于频繁
    -XX:+HeapDumpOnOutOfMemoryError

JVM-垃圾收集器与内存分配策略