Java虚拟机

来源:互联网 发布:业主名录采集软件 编辑:程序博客网 时间:2024/04/30 11:05

前序

Java虚拟机可能指三个不同的东西:

1、抽象的规范

2、一个具体的实现

3、一个运行中的虚拟机实例

抽象的规范,是sun公司对Java虚拟机的抽象规范;一个具体的实现,不同公司或机构基于抽象规范实现各自的虚拟机,如官方sun公司的Java 虚拟机HotSpotVM,这是大家使用最多的,当然还有其他公司,如IBM的J9VM;一个运行的虚拟机实现,当你启动了一个Java程序时,一个虚拟机实例也就诞生了,虚拟机实现是通过某一个类的main方法来运行一个Java程序的,当然各个Java程序运行在自己的虚拟机实例中,当程序关闭退出时,虚拟机实例也随之消亡。


 

方法区和堆

 

 每个Java虚拟机的实例都有一个方法区和堆,方法区和堆是所有线程共享的。当类装载子系统装载一个 class文件时,它会从class文件包含的二进制数据中解析类型信息,然后把类型信息放到方法区去,此外,类(静态)变量也保存在方法区中。当程序运行时,虚拟机会把所有该程序在运行时创建的对象放到堆中。

方法区也可以被垃圾收集,因为虚拟机允许通过用户定义的类装载器来动态扩展Java程序,因此一些类也会成为程序“不再引用”的类。当某个类变为不再被引用的类时,Java虚拟机可以卸载这个类(垃圾收集),从而使方法区占据的内存保持最小。

 

PC寄存器、Java栈和本地方法栈

 

当每创建一个新线程时,线程都得到自己的PC寄存器(程序计数器)以及一个Java栈。线程正在执行一个Java方法(不是本地方法),PC寄存器的值总是指向下一条将被执行的指令,而Java栈则总是存储线程在Java方法调用的状态--包括它的局部变量、被调用时传进来的参数、方法的返回值,以及计算的中间结果等等。而本地方法调用的状态,则以某种依赖于具体实现的方式存储在本地方法栈中,也可能是在寄存器或者其他与特定实现相关的内存区中。

Java栈是由很多栈帧(stack frame)或者帧(frame)组成的,一个栈帧包含Java方法调用的状态,线程调用Java方法时,虚拟机压入一个新的帧到Java栈中,当该Java方法返回时,这个帧也就从Java栈中弹出并抛弃。
0 0
原创粉丝点击