Jvm 的垃圾回收

垃圾回收的 3 个问题

1、如何判定对象为垃圾

2、如何回收

3、何时回收

如何判定对象为垃圾对象

  •     引用计数法

  • 在对象中添加引用计数器,当有对象引用该对象,该值加 1,引用失效,减 1

  • 不适用的原因是,对象相互关联,并没有被栈帧引用

  •     可达性分析

  • GCRoot 算法

  • 可作为 gcroot 的对象,虚拟机栈,本地方法区,方法区类属性所引用的对象,方法区中常量应用的对象

打印垃圾回收信息

    -verbose:gc

    -XX:+PrintGCDetail

如何回收

  •     回收策略

  • 标记清除

  • 效率存在问题

  • 空间存在问题

  • 复制

  • 标记 - 清除 - 整理

  • 全部往一个内存方向移动

  • 分代

  • 根据不同的代选择不同的算法

  •     常见的垃圾收集器

  • serial

  • 历史悠久,单线程使用

  • parnew 新生代收集器,多线程收集器,比 serial 多多线程

  • parallel scavenge 新生代收集器,多线程收集器,目的在于可控制的吞吐量  吞吐量 =Cpu 运行用户代码时间 /cpu 消耗的总时间   

  • 如何控制  -XX:MaxGCPauseMillis 垃圾收集器停顿时间

  • -XX:GCTimeRatio 吞吐量大小

  • cms

  • concurrent Mark Sweep(标记清除)  只能和 pairNew 协同工作

  • 回收老年代内存,实现打扫卫生和回收同时

  • g1 垃圾回收器

  • 并行与并发

  • 分代收集

  • 空间整合

  • 可预测的停顿

  
    展开阅读全文