JVM总结(二)

89 阅读2分钟

01-对象的生命周期

  • 对象创建的流程:

    1. 常量池检查
    2. 分配内存空间
    3. 初始化零值
    4. 设置对象头内元数据信息
  • 内存分配方式:

    • 指针碰撞(Bump the Pointer)
    • 空闲列表(Free List)
  • 内存分配安全性问题及解决方案:

    • 本地线程分配缓冲TLAB
    • 乐观锁CAS
  • 新对象大多数默认进入新生代的Eden区

  • 对象何时进入老年代,主要有四种情况:

    1. 存活年龄太大,默认超过15次
    2. 动态年龄判断
    3. 大对象直接进入老年代
    4. MinorGC后存活对象太多无法放入Survivor
  • 空间担保机制:当新生代无法分配内存时,将新生代的老对象转移到老年代,然后将新对象放入腾空的新生代。

02-对象内存布局

  • 对象内存布局包括三个区域:
    1. 对象头(Header):对象头占8字节,数组则占12字节,包含标记字段MarkWord、类型指针KlassPoint、数组长度和对齐填充。
    2. 实例数据(Instance Data):生成对象时,对象的非静态成员变量也会存入堆空间。
    3. 对齐填充(Padding):JVM对象采用8字节对齐,不足8字节的会自动补齐。

03-如何访问一个对象

有两种方式:

  • 句柄
  • 直接指针

04-GC的基本原理

  • 为什么回收垃圾?如果不进行垃圾收集,内存数据很快就会被占满。

  • 什么是垃圾?在内存中,没有被引用的对象就是垃圾。

  • 如何找到垃圾?

    • 主要有两种方法:引用计数法和根可达算法。
  • 如何清除垃圾?

    • JVM提供三种方法清除垃圾对象:
      1. Mark-Sweep 标记清除算法:效率不高,产生空间碎片,主要回收老年代。
      2. Copying 拷贝算法:效率很好,浪费内存空间,主要回收年轻代。
      3. Mark-Compact 标记压缩算法:性能相对较低,主要回收老年代。
  • 用什么清除垃圾?

    • 有8种不同的垃圾回收器,它们分别用于不同分代的垃圾回收。
      • 新生代回收器:Serial、ParNew、Parallel Scavenge
      • 老年代回收器:Serial Old、Parallel Old、CMS
      • 整堆回收器:G1、ZGC
  • 对象引用类型:

    • 强引用
    • 软引用
    • 弱引用
    • 虚引用
    • 无引用

学习:Java 业务开发常见错误 100 例学习笔记