jvm
jvm
ruoxijunClassLoader(类加载器)
加载过程:
- 加载:通过类全名,获取类二进制流。将字节流代表的静态存储结构转化为方法区的数据结构。在堆中生成这个类的 Class 对象。
- 启动类加载器(BootStrap ClassLoader):使用
c/c++
实现的类,加载 java 核心库(包名为 java,javax,sun 开头的类)。 - 扩展类加载器(Extension ClassLoader):继承至 ClassLoader 抽象类,加载系统变量
Djava.ext.dir
指定指定目录的类库或 jdk 中 jre/lib/ext 目录下的类库。 - 系统类加载器(AppClassLoader):继承至 ClassLoader 程序默认的加载器,一般加载自定义类。
- 启动类加载器(BootStrap ClassLoader):使用
- 连接:
- 验证:查看字节流是否符合 Class 文件规范,符合则加载到方法区存储。语句检查。
- 准备:静态常量(static final)直接赋值,为类(static)变量分配内存并设置默认初始值。
- 解析:虚拟机将常量池内的符号引用替换为直接引用的过程
- 初始化:执行 jvm 的
<clinit>()
类构造器方法,初始化静态变量和静态块中的数据。数据初始化按代码中的顺序执行。- 类的构造器方法在 jvm 中是
<init>()
方法,<clinit>()
类构造器方法也会先执行父类的类构造器方法。
- 类的构造器方法在 jvm 中是
Runtime Data Areas(运行时数据区)
线程共享 (且在虚拟机启动时创建) :
- 方法区:存放类信息,常量池,静态变量,方法编译后的二进制形式的机器指令集。
- 堆:存放
new
的对象实例和数组,在此分配内存。从内存回收角度堆还可分为新生代和老年代。
线程私有 (生命周期与线程共存) :
- 虚拟机栈:存放栈帧,每一个栈帧表示一个方法,栈帧的入栈和出栈都表示了方法的调用和执行完成。
- 栈帧:存放局部变量表(基本类型的变量和对象指向堆上的地址)、操作数帧、方法返回值、动态链接。
- 本地方法栈:作用与虚拟机栈相同,只是服务的对象不同。
- 虚拟机栈为 java 方法服务,本地方法栈为虚拟机使用到的 Native(本地)方法服务。
- 程序计数器:存储当前线程所执行代码的字节码文件的行号。当前线程中断至线程恢复时的代码继续执行,依靠记录的内存地址(代码行号)。
执行引擎
本地方法接口
Comment
匿名评论隐私政策
TwikooWaline
✅ 你无需删除空行,直接评论以获取最佳展示效果