少年帮|JVM内幕:Java虚拟机详解( 三 )


  • 新生代
    • 经常被分为 Eden 和 Survivor
  • 老年代
  • 永久代
内存管理对象和数组永远不会显式回收 , 而是由垃圾回收器自动回收 。 通常 , 过程是这样的:
  1. 新的对象和数组被创建并放入老年代 。
  2. Minor垃圾回收将发生在新生代 。 依旧存活的对象将从 eden 区移到 survivor 区 。
  3. Major垃圾回收一般会导致应用进程暂停 , 它将在三个区内移动对象 。 仍然存活的对象将被从新生代移动到老年代 。
  4. 每次进行老年代回收时也会进行永久代回收 。 它们之中任何一个变满时 , 都会进行回收 。
非堆内存非堆内存指的是那些逻辑上属于 JVM 一部分对象 , 但实际上不在堆上创建 。
非堆内存包括:
  • 永久代 , 包括:
    • 方法区
    • 驻留字符串(interned strings)
  • 代码缓存(Code Cache):用于编译和存储那些被 JIT 编译器编译成原生代码的方法 。
即时编译(JIT)Java 字节码是解释执行的 , 但是没有直接在 JVM 宿主执行原生代码快 。 为了提高性能 , Oracle Hotspot 虚拟机会找到执行最频繁的字节码片段并把它们编译成原生机器码 。 编译出的原生机器码被存储在非堆内存的代码缓存中 。 通过这种方法 , Hotspot 虚拟机将权衡下面两种时间消耗:将字节码编译成本地代码需要的额外时间和解释执行字节码消耗更多的时间 。
方法区方法区存储了每个类的信息 , 比如:
  • Classloader 引用
  • 运行时常量池
    • 数值型常量
    • 字段引用
    • 方法引用
    • 属性
  • 字段数据
    • 字段名
    • 类型
    • 修饰符
    • 属性(Attribute)
    • 针对每个字段的信息
  • 方法数据
    • 方法名
    • 返回值类型
    • 参数类型(按顺序)
    • 修饰符
    • 属性
    • 每个方法
  • 方法代码
    • 字节码
    • 操作数栈大小
    • 局部变量大小
    • 局部变量表
    • 异常表
    • 每个异常处理器
    • 开始点
    • 结束点
    • 异常处理代码的程序计数器(PC)偏移量
    • 被捕获的异常类对应的常量池下标
    • 每个方法
所有线程共享同一个方法区 , 因此访问方法区数据的和动态链接的进程必须线程安全 。 如果两个线程试图访问一个还未加载的类的字段或方法 , 必须只加载一次 , 而且两个线程必须等它加载完毕才能继续执行 。
类文件结构一个编译后的类文件包含下面的结构:
【少年帮|JVM内幕:Java虚拟机详解】ClassFile {u4magic;u2minor_version;u2major_version;u2constant_pool_count;cp_infocontant_pool[constant_pool_count – 1];u2access_flags;u2this_class;u2super_class;u2interfaces_count;u2interfaces[interfaces_count];u2fields_count;field_infofields[fields_count];u2methods_count;method_infomethods[methods_count];u2attributes_count;attribute_infoattributes[attributes_count];}magic, minor_version, major_version类文件的版本信息和用于编译这个类的 JDK 版本 。 constant_pool类似于符号表 , 尽管它包含更多数据 。 下面有更多的详细描述 。 access_flags提供这个类的描述符列表 。 this_class提供这个类全名的常量池(constant_pool)索引 , 比如org/jamesdbloom/foo/Bar 。 super_class提供这个类的父类符号引用的常量池索引 。 interfaces指向常量池的索引数组 , 提供那些被实现的接口的符号引用 。 fields提供每个字段完整描述的常量池索引数组 。 methods指向constant_pool的索引数组 , 用于表示每个方法签名的完整描述 。 如果这个方法不是抽象方法也不是 native 方法 , 那么就会显示这个函数的字节码 。 attributes不同值的数组 , 表示这个类的附加信息 , 包括 RetentionPolicy.CLASS 和 RetentionPolicy.RUNTIME 注解 。