Java内存回收

来源:互联网 发布:淘宝粉丝红包 编辑:程序博客网 时间:2024/06/06 04:37

判断对象是否已死

判断算法

  1. 引用计数法
  2. 可达性分析算法

Java的四种引用

  • 强引用
  • 软引用(还有用但并非必需,二次回收的目标)
  • 弱引用(非必需对象,垃圾回收目标)
  • 虚引用(垃圾回收时收到系统通知)

finalize方法作用

对象被第一次标记时,系统判断其是否需要执行finalize方法,如果对象没有实现finalize方法,或者finalize方法已经执行过,则系统判断为不需要执行。
如果需要执行finalize方法,则开始执行,第二次标记和筛选时判断对象是否成功拯救自己,如果成功拯救,则将其在回收集合中移除,否则进行回收。

垃圾回收算法

  1. 标记-清除算法
  2. 复制算法
    • Eden区 8
    • Survivor区 1
  3. 标记-整理算法
  4. 分代收集算法

垃圾收集器

  1. ParNew参数
    • -XX:SurvivorRatio(Eden:Survivor)
    • -XX:PretenureSizeThreshold 直接晋升老年代的大小
    • -XX:HandlePromotionFailure 是否允许担保失败
    • -XX:+UseConcMarkSweepGC(默认使用ParNew)
    • -XX:+UseParNewGC(强制指定)
  2. Parallel Savenge参数
    • -XX:GCTimeRatio 设置吞吐量大小
    • -XX:MaxGCPauseMillis 设置停顿时间
    • -XX:+UseAdaptiveSizeolicy GC自适应调节策略
  3. CMS回收过程
    初始标记->并发标记->重新标记->并发清除
  4. G1回收过程
    初始标记->并发标记->最终标记->筛选回收
  5. 垃圾回收器参数总结
    • UseXXXGC(使用XXX回收算法)
    • SurvivorRatio
    • MaxTenuringThreshold:晋升老年代的年龄
垃圾回收器 工作地点 线程数 使用算法 特点 Serial 新生代 单线程 复制 简单高效,stop the worle ParNew 新生代 多线程 复制 Serial的多线程版本 Parallel Savenge 新生代 多线程 复制算法 关注吞吐量 Serial Old 老年代 单线程 标记-整理 Parallel Old 老年代 多线程 标记-整理 吞吐量优先 CMS 老年代 标记-清除 多线程 缩短回收停顿,产生空间碎片 G1 整体:标记-整理,局部:复制 多线程 面向服务器

内存分配与回收策略

  1. 对象优先在Eden区分配
    • 空间不够则发起Minor GC
  2. 大对象直接进入老年代
  3. 长期存活的对象将进入老年代
  4. 动态对象年龄判定
    • 如果在Survivor空间中相同年龄所有对象的大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。
  5. 空间分配担保
0 0