1、HelloWorld
小七作为一个半路出家的程序员,以前对JVM根本不敢有非分之想,但是癞蛤蟆只要坚持也会有吃到天鹅肉的那一天,所以小七从今天开始准备系统学习,并且记录下JVM相关知识。一句话:JVM?干就完了!
回想起和JVM见面的那一天,小七和JVM说得第一句话就是“hello world”。所以,咱们先准备一个HelloWorld.java的文件。
内容如下:
class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world");
}
}
打开终端 执行命令:
会发现目录下多了个HelloWorld.class文件
然后继续执行命令
输出结果
总结起来,程序的运行步骤如下:
1、首先把“.java”代码文件编译成“.class”字节码文件;
2、然后类加载器把“.class”字节码文件中的类给加载到JVM中 ;
3、接着是JVM执行类中的代码。
流程图为:
2、类的加载
三个步骤
提到类的加载,就离不开一个问题——JVM什么情况下会加载一个类呢?答案是使用这个类的时候。那什么时候会使用到这个类呢?一个是程序的入口main函数,一个是实例化这个对象的时候。从下面这一段代码,我们分析一下这个过程:
public class Test {
public static void main(String[] args){
UpDownloaderFactory factory = new UpDownloaderFactory();
}
}
(1)JVM进程启动之后,会加载Test.class到内存里;
(2)如果有“main()”方法,则从此入口开始执行程序;
(3)执行程序时,发现需要使用UpDownloaderFactory去实例化对象,所以得把UpDownloaderFactory.class加载到内存里面来。
四个环节
类的加载大概就是这样一个情况,当然在进行加载的过程中,我们有4个概念需要大概了解下。
(1)验证
这个环节主要是确定JVM加载的.class文件是符合规范的,就好比男人去男厕所,女人去女厕所,符合JVM规范的才能进入到JVM。
(2)准备
这个环节主要是给类以及类变量分配内存空间。
(3)解析
这个环节主要是把符号引用替换为直接引用。
(4)初始化
这个环节主要主要做的是赋值。
注:针对初始化有一个重要的规则,就是如果初始化一个类的时候,发现他的父类还没初始化,那么必须先初始化他的父类。
以上总结为一张图如下:
双亲委派机制
所谓的双亲委派机制,就像儿子和爸爸一样。儿子遇事,先让爸爸去解决,爸爸解决不了,就又交给儿子去解决。