ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

深入JAVA虚拟机连载(二)

2021-10-09 20:30:43  阅读:213  来源: 互联网

标签:java 连载 虚拟机 装载 线程 test JAVA main


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文件外,还必须验证被导入的类的正确性,为类变量分配并初始化内存,以及帮助解析符号引用。

标签:java,连载,虚拟机,装载,线程,test,JAVA,main
来源: https://blog.csdn.net/liuyuan5363/article/details/120678528

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有