JVM 结构小结

来源:互联网 发布:移动4g 网络 编辑:程序博客网 时间:2024/06/11 04:49

JVM的内存模型和.Net CLR的内存模型有很多相似的地方。《.Net CLR 内存模型小结》

 



1 类加载器(ClassLoader)

1.1 Class Loader 的分类

  • 启动类加载器(BootStrap Class Loader):加载 rt.java (Java基础类库)。
  • 扩展类加载器(Extension Class Loader):加载扩展功能 jar 包。
  • 系统类加载器(System Class Loader):即 AppClassLoader。加载启动参数 classpath 中的 jar 包,包括用户自己写的类。
  • 用户自定义类加载器(User Defined Class Loader):供用户自己手动控制加载过程。

 

1.2 Class Loader 的工作过程

1.2.1 装载

  • 装载 .class 文件。
  • 双亲委派模型(Parent Delegation Model)。Parent Class Loader 无法加载时再有自己加载类。保证安全加载,防止恶意冒充核心包。

 

1.2.2 链接

  • 校验 .class 文件是否符合规范,是否符合当前 JVM。
  • 把类型信息合并到 JVM 运行时中(方法区)。
  • 为类分配内存(如,类的静态字段)。

 

1.2.3 初始化

  • 只有类第一次被访问到,才会做初始化。
  • 初始化静态变量,执行静态代码,静态构造函数。

 

2 运行时数据区(Runtime Data Area)

2.1 方法区(Method Area)(线程共享)

  • 存储类型信息。SUN JDK 中对应 持久代(Permanent Generation)。
  • 为加快速度,通常为每个非抽象类创建私有方法表。利于多态的实现。

 

2.2 堆(Heap)(线程共享)

2.2.1 新生代区(Yong Area)

  • 存放新生的对象;频繁收集。
  • 1个 Eden Space:
    • 新创建的对象进入 Eden Space。
    • Eden Space 中的 Thread Local Allocation Buffer (TLAB)
      • 默认占 Eden Space 的 1%,线程私有。
      • 为提高效率,针对不存在线程共享,同时适合被快速GC的小对象,会优先被分配到 TLAB。
  • 2个相同大小的 Survivor Space:
    • 用于 Minor GC 时的对象复制。主要目的是用空间换时间,从而提高 GC 的速度。

 

2.2.2 老年代区(Old Area)

存放生命周期较长的对象;较少收集。

 

2.2.3 GC 原理(类似 .Net CLR 中的 GC)

GC 监控对象地址、大小、使用情况等,(用有向图)记录和管理堆中的对象,以确定哪些对象可达,哪些对象不可达。当对象不可达时,GC有责任回收其内存空间。程序员可以主动调用 System.gc(),通知GC运行,但Java语言规范不保证GC一定会执行。

 

2.2.4 两种 GC 模式

  • GC (Minor GC):收集 Yong Area。
  • Full GC (Major GC):收集 Yong + Old

 

2.2.5 并不是所有的对象都在堆上分配

  • 一种是上述 TLAB 的情况(虽然TLAB属于堆,但它是线程私有的,与一般意义上线程共享的堆不同)。
  • 另一种是在线程栈上分配。JVM 在 Server 模式下可开启“逃逸分析”,如果分析出某个对象永远只在某个方法、线程的范围内,这个对象就可以在线程栈上分配。

 

2.2.6 OutOfMemoryError (OOM)的两种类型

  • Java Heap Space:调整参数 -Xms(初始堆大小)和 -Xmx(最大堆大小)
  • PermGen Space:调整参数 -XX:PermSize(初始Perm堆大小)和 -XX:MaxPermSize(最大Perm堆大小)

 

2.3 Java 栈(Java Stack)(线程私有)

  • 分为 局部变量区、操作数栈、帧数据区。存储方法参数、局部变量、中间运算结果、提供其它模块(PC Register)所需数据。
  • 一个栈帧对应一个方法的调用。调用方法时入栈,方法返回时出栈。
  • 局部变量区:以字长为单位(32bit)。byte,short,char 会被转换为 int;long,double 占2个字长(64bit)。

 

2.4 本地方法栈(Native Method Stack)(线程私有)

类似 Java Stack,针对本地方法。SUN JDK 中就是 Java Stack。

 

2.5 PC 寄存器(Program Counter Register)(线程私有)

保存线程当前指令所在位置。

 

3 执行引擎(Execution Engine)

  • 包括 解释执行、编译执行、自适应优化执行、硬件芯片执行。
  • 编译执行:JIT(Just-In-Time)运行时将字节码编译为机器码,重复利用。
  • 自适应优化执行:如HotSpot VM,将热点代码编译为本地代码提供效率,热点消退后又取消这部分编译后的本地代码。
  • SUN JDK 编译模式
    • Client:轻量级,占用内存少。
    • Server:占用内存多。可开启对象“逃逸分析”。 

4 本地方法接口(Native Interface)