前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 程序在 JVM 中是怎样执行的?(一定要看到最后)

Java 程序在 JVM 中是怎样执行的?(一定要看到最后)

作者头像
刘水镜
发布2022-07-29 13:29:51
3630
发布2022-07-29 13:29:51
举报
文章被收录于专栏:做个开发者

我们都知道 Java 程序是运行在 JVM 中的。但你可能不知道一个 Java 程序在 JVM 中是怎样执行的。今天,就和大家来一探究竟。

首先,来看一下 JVM 的运行时数据区域划分:

程序计数器:字节码执行指示器,实时记录字节码执行的行号,线程私有。

虚拟机栈:也是线程私有的,它主要用来为方法提供服务。一个方法被执行的时候,会创建一个栈帧,用来存放局部变量表、方法出口等信息。方法被调用时栈帧入栈,执行结束时栈帧出栈。

本地方法栈:与虚拟机栈类似,只不过它的服务对象是本地(Native)方法。

堆:堆可谓是与程序员打交道最多的一块区域了,也是 JVM 中最大的一块内存区域了。它里面主要用来存放的就是对象,垃圾回收主要就是针对这个区域。

对于程序员来说,堆和栈(虚拟机栈)是与我们关系最紧密的部分。面向对象的核心成员就是对象和对象的行为(也就是方法),而堆和栈刚好是管着两块儿的。

让我们回到标题中提出的问题:Java 程序在 JVM 中是怎样执行的呢?先看一段很简单的代码:

代码语言:javascript
复制
public class Example {
    public static void main(String[] args) {
        a();
    }

    public static void a() {
        int a = 1;
        b();
    }

    public static void b() {
        User b = new User();
    }
}

代码很简单,一个类,main() 方法调用 a() 方法,a() 方法中定义了一个 int 变量 a,然后调用 b() 方法,b() 方法中 new 了一个 User 对象 b。

想要弄明白这个问题,你需要一丢丢的前置知识:

  • 栈中的局部变量表用于存放 Java 的基本类型和引用类型
  • 实例对象存放在堆内,栈中有对应的引用类型指向该实例的内存地址

OK,下面用一个动画来展示一下上面那段代码是如何在 JVM 中运行的:

http://mpvideo.qpic.cn/0bc3fqaaaaaa4aacaawmf5rfalgdaawaaaaa.f10002.mp4?

可以结合下面的文字说明一起来看:

  • 程序运行
  • main() 方法入栈
  • a() 方法被调用,入栈
  • 基本类型 a 变量在栈中被创建
  • b() 方法被调用,入栈
  • 引用类型 b 在栈中被创建
  • User 类型的实例在堆中被创建
  • 将 User 实例的内存地址指向引用类型 b
  • b() 方法执行结束,b 变量销毁,断开对 User 实例的引用,出栈
  • a() 方法执行结束,a 变量销毁,出栈
  • 垃圾回收将不再被引用的 User 实例回收掉
  • main() 方法执行结束,出栈
  • 程序执行结束

打完收工。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 做个开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档