一步一步学java_一步一步学习Java虚拟机(三) Java进程的执行

Java字节码文档被装载进Java虚拟机后,如何执行呢?Java虚拟机总是开始于一个main()方法,这个方法必须是公有、返回void、直接受一个字符串数组。在进程执行时,你必须给Java虚拟机指明这个包换main()方法的类名。 Main()方法是进程的起点,他被执行的线程初始化为进程的初始线程。进程中其他的线程都由他来启动。

运行时数据区

进程计数器

进程计数器是线程私有,所以当一个新的线程创建时,进程计数器也会创建。由于Java是支持多线程,Java中的进程计数器用来记录当前线程中正在执行的命令。如果当前正在执行的方法是本地方法,那么此刻进程计数器的值为undefined。

在汇编语言中,进程计数器是指CPU中的寄存器,它保存的是进程当前执行的命令的地址。当CPU需要执行命令时,需要从进程计数器中得到当前需要执行的命令所在存储单元的地址,然后根据得到的地址获取到命令,在得到命令之后,进程计数器便自动加1或者根据转移指针得到下一条命令的地址,如此循环,直至执行完所有的命令。

虽然JVM中的进程计数器并不像汇编语言中的进程计数器一样是物理概念上的CPU寄存器,但是JVM中的进程计数器的功能跟汇编语言中的进程计数器的功能在逻辑上是等同的,也就是说是用来指示 执行哪条命令的。

方法被调用时,会创建一个栈帧,栈帧内存放者方法中的局部变量表、操作数栈、指向运行时常量池的引用、方法返回地址等数据。JVM栈只对栈帧进行存储,压栈和出栈操作。栈内存的大小可以有两种设置,固定值和根据线程需要动态增长。局部变量表用来存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参),对于基本数据类型的变量,则直接存储它的值,对于引用类型的变量,则存的是指向对象的引用。局部变量表的大小在编译器就可以确定其大小了,因此在进程执行期间局部变量表的大小是不会改变的。

操作数栈,栈最典型的一个应用就是用来对表达式求值。想想一个线程执行方法的过程中,实际上就是不断执行语句的过程,而归根到底就是进行计算的过程。因此可以这么说,进程中的所有计算过程都是在借助于操作数栈来完成的。

指向运行时常量池的引用,因为在方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用指向运行时常量。

方法返回地址,当一个方法执行完毕之后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址。

堆数据区是用来存放对象和数组(特殊的对象)。堆内存由多个线程共享。堆内存随着JVM启动而创建。众所周知,Java中有一个很好的特性就是自动垃圾回收。垃圾回收就操作这个数据区来回收对象进而释放内存。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值