深入JAVA虚拟机连载(二)

java虚拟机是什么

要理解java虚拟机,需要意识以下三种不同的东西:

1、抽象规范

2、一个具体的实现

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

        java虚拟机抽象规范,仅仅是个概念,而该规范的具体实现,可能来自多个提供商,

并存于多个平台上。当运行一个java程序时,也就运行在了一个虚拟机的实例上。

java虚拟机的生命周期

        一个运行的java虚拟机的职责就是:负责运行一个java程序。如果一台计算机上同时运行三个java程序,将得到三个java虚拟机实例。

        java虚拟机内部有两种线程,守护线程和非守护线程。守护线程通常是由虚拟机自己使用的,比如执行垃圾收集任务的线程。但是,java程序可以把它任何创建的线程标记为守护线程。而java程序的初始线程,就是始于main()的线程,是非守护线程。

        只要还有任何非守护线程在运行,那么虚拟机就会仍然存活。当该程序的所有非守护线程都终止时,虚拟机实例将自动退出。

java虚拟机的体系结构

        每一个java虚拟机都有一个类装载器子系统,它根据给定的全限定名来装入类型(类或接口),同样,每个java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令。

        当java虚拟机运行一个程序时,它需要内存来存储许多东西,例如,字节码,从已装载的class文件中得到其他信息,程序创建的对象,传递给方法的参数,返回值,局部变量,一级运算的中间结果等等。java虚拟机把这些东西都组织到几个“运行时数据区”中,以便于管理。

        某些运行时数据区是由程序中所有线程共享的,还有一些只能由一个线程拥有。每个java虚拟机实例都有一个方法区以及一个堆,它们是由该虚拟机实例中所有线程共享的。当虚拟机装载一个class文件时,它会从这个class文件中包含的二进制数据中解析类型信息,然后它把这些信息放到方法区中。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。

        当每一个新线程被创建时,它都将得到它自己的PC寄存器(程序计数器)以及一个java栈。

 

        图5-3描绘了java虚拟机为每一个线程创建的内存区,这些内存区域是私有的,任何线程都不能访问另一个线程的PC寄存器或者java栈。java栈先进后出,比如我们有如下的代码:

public static void main(String [] args){

        xx.test();

}

public void test(){

}

}

        上的示例代码和简单,一个main()方法内调用一个test()方法,当运行程序时,会把main()方法的栈桢压入栈底部,接着执行test()方法,会把test()方法的栈桢压入栈中,在main()方法的栈桢之上,执行完test()方法,则test()方法的栈桢出栈,接着继续执行main(),main()方法执行完后,main()方法的栈桢出栈。

数据类型

        java虚拟机是通过某些数据类型来执行计算的,数据类型可以分为两种类型:基本类型和引用类型。java虚拟机的引用类型被统称为"引用"(reference),有三种引用类型:类类型、接口类型以及数组类型,它的值都是动态创建对象的引用。

类装载器子系统

        java虚拟机有两种类装载器:启动类装载器和自定义装载器。和所有其他对象一样,用户自定义类装载器以及class类的实例都放在内存的堆区,而装载的类型信息则放在方法区。

装载连接以及初始化类装载子系统除了要定位和导入二进制class文件外,还必须验证被导入的类的正确性,为类变量分配并初始化内存,以及帮助解析符号引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值