前言
结合类加载与对象创建来梳理一下JVM内存模型的功能
JVM内存模型

图片来自 (https://www.cnblogs.com/zhou-yuan/p/14252272.html)
随着JDK的升级,方法区最后被淘汰,常见面试题主要以JDK1.7的模型为主
淘汰原因是对方法区的GC不好控制,内存也不好管理,容易OOM
功能
以JDK1.7为例
- 绿色为线程共享,蓝色为线程独占
- 程序计数器:记录线程执行到哪里,便于线程被唤醒后能够继续接着执行
- 虚拟机栈:执行java方法的栈区,其由多个栈帧组成,每调一个方法就会生成一个栈帧,栈帧中会存储执行方法需要的临时局部变量以及一些引用·
- 本地方法栈:执行本地方法的栈区,线程除了会执行对象的java方法,也会执行本地方法,对应在本地方法栈中运行
- 堆:存放对象具体内容,包括对象的成员变量等,以及字符串常量池
- 方法区:存放类信息,比如编译好的.class文件内容,其中包括方法,变量名等,.class文件中会区分静态与非静态,方法区也会有对应的静态区与非静态区
了解完概念,往往还是不容易记住,因为不知道这模型实际上是怎么运行的,因此,接下来结合类加载与对象创建过程,我们看看怎么利用JVM的
对象创建与类加载
这部分参考了 (https://www.cnblogs.com/study-everyday/p/6752715.html)
- 启动JVM,执行main方法
- 执行到 new Child()时,试图创建Child对象,由于Child继承了Parent,因此也试图创建Parent对象
- 此时会先去
JVM的方法区中查找,是否有Chid.class 和 Parent.class,如果没有,则进行类加载 - 类加载过程包括加载、连接、初始化
- 在加载这一步,JVM会扫描Chid.class、Parent.class,并将其内容读入
JVM方法区,其中静态内容读入方法区的静态区,非静态在非静态区中,并生成一个class对象 - 注意了这里的初始化指的是类初始化,而不是对象初始化,类初始化对应的是字节码文件的
<clinit>方法,而对象初始化是<init>方法
- 在加载这一步,JVM会扫描Chid.class、Parent.class,并将其内容读入
- 类加载好后,就能从方法区中获取到class对应的信息,完成对象创建了
- 创建对象时,在
JVM的堆内存中为其分配内存 - 当线程要执行对象方法时,会根据对象找到
JVM方法区中对应的class结构信息,从而找到方法对应的代码块,拿入JVM的虚拟机栈中进行执行
上述过程涉及了JVM大部分区的使用,虽然比较简单,但能够加强对JVM的理解了
本文介绍了JVM内存模型,重点讲解了JDK1.7版本的内存区域划分及其功能,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。通过类加载与对象创建的过程,帮助理解JVM内存模型的实际应用。

532

被折叠的 条评论
为什么被折叠?



