# Java 程序是怎样在 JVM 中执行的?我们都知道 Java 程序是运行在 JVM 中的但你可能不知道一个 Java 程序在 JVM 中是怎样执行的今天,就和大家来一探究竟首先,来看一下 JVM 的运行时数据区域划分:。
程序计数器:字节码执行指示器,实时记录字节码执行的行号,线程私有虚拟机栈:也是线程私有的,它主要用来为方法提供服务一个方法被执行的时候,会创建一个栈帧,用来存放局部变量表、方法出口等信息方法被调用时栈帧入栈,执行结束时栈帧出栈。
本地方法栈:与虚拟机栈类似,只不过它的服务对象是本地(Native)方法堆:堆可谓是与程序员打交道最多的一块区域了,也是 JVM 中最大的一块内存区域了它里面主要用来存放的就是对象,垃圾回收主要就是针对这个区域。
对于程序员来说,堆和栈(虚拟机栈)是与我们关系最紧密的部分面向对象的核心成员就是对象和对象的行为(也就是方法),而堆和栈刚好是管着两块儿的让我们回到标题中提出的问题:Java 程序在 JVM 中是怎样执行的呢?先看一段很简单的代码:。
publicclassExample {publicstaticvoidmain(String[] args){ a(); } publicstaticvoida(){
int a = 1; b(); } publicstaticvoidb(){ User b = new User(); } }> 代码很简单,一个类,main() 方法调用 a() 方法,a() 方法中定义了一个 int 变量 a,然后调用 b() 方法,b() 方法中 new 了一个 User 对象 b。
想要弄明白这个问题,你需要一丢丢的前置知识:- 栈中的局部变量表用于存放 Java 的基本类型和引用类型- 实例对象存放在堆内,栈中有对应的引用类型指向该实例的内存地址OK,下面用一个动画来展示一下上面那段代码是如何在 JVM 中运行的:
重播播放00:00/00:00直播00:00进入全屏50点击按住可拖动视频可以结合下面的文字说明一起来看:程序运行main() 方法入栈a() 方法被调用,入栈基本类型 a 变量在栈中被创建b() 方法被调用,入栈
引用类型 b 在栈中被创建User 类型的实例在堆中被创建将 User 实例的内存地址指向引用类型 bb() 方法执行结束,b 变量销毁,断开对 User 实- 例的引用,出栈a() 方法执行结束,a 变量销毁,出栈
垃圾回收将不再被引用的 User 实例回收掉main() 方法执行结束,出栈程序执行结束打完收工。技术聊完了,下面我们聊点正事儿!
咳咳,趁着现在粉丝还不是太多,给早期关注的读者送点福利,关注「做个开发者」。在公众号文章下方留言,获赞最多的三位读者每人送一本我的新书《Spring Boot趣味实战课》。
七月三十一号开奖另外,这次活动是双管齐下,公众号和微博同步进行且两个活动可以累加,如果你都参加,那么中奖几率直接翻倍并且支持定制签名(如果不嫌我字丑,哈哈)微博上的活动也很简单,关注「@水镜不酷」并转发下图中的微博即可。
对了,如果你真的中了两本,可以将其中一本兑换成现金,按照目前京东促销价折算为 60 微信红包(目前京东到手 57.8 元)。行了,别的不多说了大家帮忙转发一下吧。
亲爱的读者们,感谢您花时间阅读本文。如果您对本文有任何疑问或建议,请随时联系我。我非常乐意与您交流。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。