You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1.7 KiB
1.7 KiB
title | tags | categories | abbrlink | date | keywords | description | cover |
---|---|---|---|---|---|---|---|
java程序启动时都发生了什么 | Java技术 | 技术随笔 | 1818557386 | 2024-03-06 14:22:05 | <nil> | <nil> | <nil> |
本文主要介绍在我们执行java -jar xxx.jar时都发生了什么,附框图。
当我们执行这个命令时:
- java命令会去调用jvm.dll来创建java虚拟机
- java虚拟机创建一个引导类加载器,并使用它加载sun.misc.Launcher类
- Launcher类创建一些其他的类加载器,比如appclassloader,随后appclassloader会去加载Main.class类。 其中main class是从jar包中的MANIFEST.MF文件找到的。
加载的过程如下:
- 首先把类从硬盘加载到jvm内存,具体是在方法区
- 然后对类进行验证,主要是验证这个类的字节码是否符合Java的规范,比如某个字节放Java的主版本,次版本,某个字节放类的常量个数等。
- 之后进行准备,主要是对类内的静态变量分配内存并赋予默认值.
- 随后进行解析,把类内部的符号变量替换为一些静态地址.
- 最后进行初始化,对静态变量赋予初始值。
个人理解: 类加载过程就是读取.class文件到内存中,将其放在方法区内,然后在Java堆区创建一个java.lang.Class对象,通过Class对象来访问方法区中类的数据结构。类加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。