JVM学习系列

JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇

JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇作为一个使用Java语言开发的程序员,我们都知道,要想运行Java程序至少需要安装JRE(安装JDK也没问题)。我们也知道我们Java程序员编写的程序代码文件是*.java的,而JRE运行的是*.class的文件。所以,我们需要将java文件编译成class文件然后才可以。那么,你有没有想过,一个java文件是怎么运行起来的呢?中间都经历

JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇

作为一个使用Java语言开发的程序员,我们都知道,要想运行Java程序至少需要安装JRE(安装JDK也没问题)。我们也知道我们Java程序员编写的程序代码文件是*.java的,而JRE运行的是*.class的文件。所以,我们需要将java文件编译成class文件然后才可以。那么,你有没有想过,一个java文件是怎么运行起来的呢?中间都经历了哪些环节呢?我们都知道JVM是Java虚拟机,那么,有没有思考过JVM的内存模型是什么呢?我们new出来的对象,声明不同类型的变量又是存放在JVM哪个位置呢?

本文是凯哥(凯哥Java:kaigejava)学习JVM系列教程第一篇。欢迎大家一起学习

本文目标:

通过本文学习后,希望大家对JVM类加载过程有个了解。

0dc56608de62186fc4a21157255e5978.png

上面程序很简单。那么,有没有想过上面代码怎么运行的呢?

选中main方法,然后ruan as...,编译后,运行输出。这个流程我想大家都很熟悉的。那么对应的流程应该是什么样的呢?如下图:

3d99cf3b96db759238fbcff2d612cc0a.png

在Run的时候,先将.java文件编译成.class文件。然后,在通过类加载器,将class文件加载到JVM中,然后在运行。输出结果。

那么为什么编译好的AppTest.class可以加载到JVM中呢?可以被JVM识别呢?

一个java类的一生都会经历哪些步骤呢?

如下图:

fb77dc8b840434f5f4f561550f0bacf6.png

在我们run的时候,AppTest.java类先经过编译后,编译成了AppTest.class文件。JVM把class文件加载到内存后需要经历:加载-验证-准备-解析-初始化-使用-卸载这七个阶段。

第一个问题:JVM在什么时候会加载一个类呢?起始也就是在什么时候会加载.class字节码文件到JVM的内存中去呢?上面我们写的,当我们run的时候,才执行的。所以答案就很明确了,就是在你代码中需要使用到这个类的时候,就去加载的。

具体每一步:

加载

加载阶段是将class文件从磁盘或者jar等读到JVM内存中,并为其创建一个Class对象。任何一个类被使用时候系统都会为其创建一个Class对象的。

加载的同时将加载的这些数据转换成方法区中运行时数据(运行时候数据区:静态变量、静态代码块、常量池等),作为方法区数据的访问入口

这个很好理解的。我要想使用你,需要先得到你,是不是。结合上面我们自己写的AppTest类。在此阶段应该是:

519da5e3306c7e0b8cfc8bfc8f6d23f6.png

扩展:

在类加载阶段JVM都做了什么?获取class文件方式都有哪些?

1.1:在类加载的时候JVM完成了以下:

  • 根据类的全路径(全限定名)来获取到该类的二进制字节流

(我们知道,在电脑的世界中,什么都是二进制形式存在的)

  • 将加载的字节流中所代表的静态存储结构转换成方法区运行时数据结构

(这个话具体怎么理解,有哪位能留言教教凯哥)

  • 将加载的对象在内存中生成一个代表了该类的jvaa.lang.Class对象。这个Class对象作为加载进来对象在方法区各种数据的访问入口。

(要想在内存中访问AppTest这个字节码类中的属性或者方法的时候,可以在内存中方法区找到对应的Class对象。这个Class就是入口)

关于方法区在后面文章中,凯哥会详细讲讲。

1.2:获取class文件的方式

  • 可以直接从本地的磁盘文件获取

  • 可以从忘了下载class文件

  • 可以从ZIP或者jar等文件中

原创不易,完成人机校验,阅读全文

相关推荐