深入JVM
这篇文章目的是概要介绍Java 虚拟机(JVM)的内部架构。
jvm主要内部构件
线程独享
线程
栈
栈帧
局部变量数组
线程共享
堆
内存管理
方法区
类加载器
线程
Hotspot JVM(sun开发的java虚拟机) 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束,原生线程随之被回收。Hotspot JVM 后台运行的系统线程主要有下面几个:
虚拟机线程(VM thread)
周期性任务线程
GC 线程
编译器线程
信号分发线程
栈(Stack)
每个线程拥有自己的栈,栈包含每个方法执行的栈帧。栈是一个后进先出(LIFO)的数据结构,当前执行的方法在栈的顶部。每次方法调用时,一个新的栈帧创建并压栈。当方法返回或抛出异常时,栈帧就会出栈。
栈帧(Frame)
栈帧包含:
局部变量数组
返回值
操作数栈
类当前方法的运行时常量池引用
堆
堆被用来在运行时分配类实例、数组。对象总是存储在堆上以便在方法结束时不会被移除。对象只能由垃圾回收器移除。
为了支持垃圾回收机制,堆被分为了下面三个区域:
新生代
老年代
永久代
方法区
方法区存储了每个类的信息,比如:
Classloader 引用
运行时常量池
字段数据
方法数据
方法代码
所有线程共享同一个方法区
类加载器(classloader)
加载(Loading)是这样一个过程,找到代表这个类的 class 文件或根据特定的名字找到接口类型,然后读取到一个字节数组中。接着,这些字节会被解析检验它们是否代表一个 Class 对象并包含正确的 major、minor 版本信息。直接父类的类和接口也会被加载进来。这些操作一旦完成,类或者接口对象就从二进制表示中创建出来了。JVM 中有多个类加载器:
Bootstrap加载器 负责载入基础的Java API,比如包含rt.jar。
Extension加载器 加载了标准Java的扩展API,比如 security 的扩展函数。
System加载器 是应用的默认类加载器,比如从 classpath 中加载应用类。
用户自定义类加载器
JVM 启动时会用 bootstrap 类加载器加载一个初始化类。
加载器加载顺序
参考
http://blog.jamesdbloom.com/JVMInternals.html
http://www.importnew.com/17770.html