Java 执行过程中的内存模型
一、前言
本文的主要工作:尝试以时间顺序追踪一遍 Java 执行的整个过程,以及展示 JVM 中内存模型的相应变化。
本文的主要目的:希望能够通过 Java 执行过程的冰山一角,增进对编程语言工作原理的理解。
以下面这段代码为例,追踪它的执行过程:
public class Car {
private int speed;
public void setSpeed(int speed) {
this.speed = speed;
}
public void getSpeed() {
System.out.println(speed);
}
public static void main(String[] args) {
Car car = new Car();
car.setSpeed(3);
car.getSpeed();
}
}
二、执行过程
接下来是具体的执行过程,总共包含五个步骤:编译、加载、执行 main 方法、执行成员方法、方法返回。
Step1:编译
首先,在我们完成上述这段源码之后,要想让程序跑起来,我们需要将其编译成为字节码文件。字节码是一种跨平台的JVM机器语言,它能够被JVM所解析,而无关底层的操作系统。
Step2:加载
当代码需要被调用时,JVM 会加载目标字节码至方法区,并转化为方法区的运行时数据结构,这里的加载过程是通过类加载器完成的。然后内存中(不一定是堆)会生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据结构的访问入口。

Step3:执行 main 方法
main 方法可以通过 java.lang.Class 对象进行调用,参考如下代码:
Method method = targetClass.getDeclareMethod("main", String[].class);
method.invoke(null, (Object) new String[0]);
之后 PC 寄存器将会指向方法区中的 main 函数地址,线程栈中会生成对应的栈桢,其主要用于存放当前方法的局部变量表、操作栈、以及方法返回地址。接下来,PC 寄存器向后地址偏移,执行引擎开始执行 main 方法体。当语句 Car car = new Car() 执行完毕,栈桢与堆中的相应变化如下:

Step4:执行成员方法
对象 car 的 setSpeed 方法调用过程和 main 类似,通过索引 car 的成员方法地址,PC寄存器将指向方法区中的 setSpeed 函数地址,同时线程栈中将产生新的栈桢,其中的方法返回地址用于保存原有 PC 地址偏移。当赋值语句 this.speed = speed 执行完毕,栈桢与堆中发生的相应变化如下:

Step5:方法返回
随着 setSpeed 方法的执行结束,Stack 中的相应栈桢出栈,栈顶指针重新指向 main 栈桢。同时 PC 寄存器将根据方法返回地址进行还原,从而继续执行 main 的方法体。当 main 方法也执行完毕出栈后,主线程与虚拟机实例销亡,程序结束。
三、杂谈
虚拟机或某一门程序语言,作为一种底层实现,可以满足上层用户的绝大部分需求,但是需求是与时俱进的,总有一天用户需要编写自己的底层实现,比如组件、框架、一门新语言。这时需要打开原有的规范,先破坏它,再重建它,从而定义自己的规范。这也许是我们需要探究底层的缘由之一吧。
参考链接
[1] <<深入理解Java虚拟机>>
[2] https://www.cnblogs.com/zzzz76/p/9282981.html
[3] https://www.cnblogs.com/zzzz76/p/8150862.html
[4] https://www.cnblogs.com/zzzz76/p/8076536.html
Java 执行过程中的内存模型的更多相关文章
- java中的内存模型
概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发Jav ...
- Java实例化对象过程中的内存分配
Java实例化对象过程中的内存分配: https://blog.csdn.net/qq_36934826/article/details/82685791 问题引入这里先定义一个很不标准的“书”类,这 ...
- java中子类实例化过程中的内存分配
知识点: 子类继承父类之后,实例化子类时,内存中子类是如何分配内存的呢? 下面,自己会结合一个例子,解释一下,一个子类实例化过程中,内存是如何分配的 参考博客:http://www.cnblogs.c ...
- 深入理解java虚拟机(6)---内存模型与线程 & Volatile
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...
- (转载)JVM中的内存模型与垃圾回收
转载自微信公众号:Java高级架构(Java-jiagou)-----看完这篇文章,我奶奶都知道JVM中的内存模型与垃圾回收了! 六.内存模型 6.1 内存模型与运行时数据区 Java虚拟机在执行J ...
- Java虚拟机解析篇之---内存模型
今天闲来无事来,看一下Java中的内存模型和垃圾回收机制的原理.关于这个方面的知识,网上已经有非常多现成的资料能够供我们參考,可是知识还是比較杂的,在这部分知识点中有一本书不得不推荐:<深入理解 ...
- 详解JVM中的内存模型是什么?
强烈推荐 不管是找工作还是提升水平,都建议读一下<深入理解Java虚拟机>这本书,详细讲解了JVM中的内存管理.类加载过程.垃圾回收以及最重要的性能调优实战. 本博客也是参考了这本书,有不 ...
- 转:Oracle中SQL语句执行过程中
Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...
- SQL SERVER 2008:内部查询处理器错误: 查询处理器在执行过程中遇到意外错误
今天一个同事突然告诉我,以前跑得很正常的一个SQL语句,执行时突然报如下错误: 消息1222,级别16,状态18,第1 行 已超过了锁请求超时时段. ...
随机推荐
- 【C】C语言位域(位段)详解
作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14215449.html 目录 一.位域是什么? 二.位域的存储 2.1 相邻成员的类型相同 2.2 相邻成员的类 ...
- 什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
内容传送网络或内容分发网络(CDN)是部署在因特网上的多个数据中心的大型分布式服务器系统.CDN的目标是为具有高可 用性和高性能的最终用户提供内容. 有3个流行的jQuery CDN:谷歌,微软jQu ...
- linkedhashmap中关于LRU算法的实现
//LinkedHashMap的一个构造函数,当参数accessOrder为true时,即会按照访问顺序排序,最近访问的放在最前,最早访问的放在后面 public LinkedHashMap(int ...
- 关于.NET中的控制反转(二)- 依赖注入之 MEF
一.MEF是什么 Managed Extensibility Framework (MEF) 是用于创建可扩展的轻量级应用程序的库. 它让应用程序开发人员得以发现和使用扩展且无需配置. 它还让扩展开发 ...
- 单细胞分析实录(8): 展示marker基因的4种图形(一)
今天的内容讲讲单细胞文章中经常出现的展示细胞marker的图:tsne/umap图.热图.堆叠小提琴图.气泡图,每个图我都会用两种方法绘制. 使用的数据来自文献:Single-cell transcr ...
- Solon rpc 之 SocketD 协议
1. 简介 SocketD 是一种二进制的点对点通信协议,是一种新的网络通信第七层协议.旨在用于分布式应用程序中.从这个意义上讲,SocketD可以是RSocket等其他类似协议的替代方案.它的消息协 ...
- 分享一个的c++写的,模仿awk的框架类CAwkDoc
这是我好多年前,模仿awk写的. awk大家都比较熟悉,使用awk处理文件,读取文件,分割字段这些工作awk自己帮你实现了. 程序员只要编写业务逻辑代码,并且awk还提供了很多常用的字符串操作函数,可 ...
- vs code编写java
不知不觉中vs code变得非常强大了,今天小编就分享一下vs code编写java语言.其实除了java语言,还支持很多语言. 首先看下vs code欢迎页面支持哪些语言: 好家伙,支持的东西还真不 ...
- Linux SSH , SCP 建立信任关系(免密传输)
最近有个需求,Jenkins需要将war传输到各个项目节点中,所以需要远程执行各个节点的shell脚本.但是中间有个输入密码的过程,在自动化部署中是行不通的,故需要增加免密登录.具体如下: 如果想在 ...
- SpringCloud Alibaba Nacos服务注册与配置管理
Nacos SpringCloud Alibaba Nacos是一个狗抑郁构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos:Dynamic Naming and Configurat ...