Java虚拟机的体系结构和内存模型是什么

发布时间:2022-01-10 11:22:56 作者:iii
来源:亿速云 阅读:138

这篇文章主要介绍“Java虚拟机的体系结构和内存模型是什么”,在日常操作中,相信很多人在Java虚拟机的体系结构和内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java虚拟机的体系结构和内存模型是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Java 虚拟机体系结构

Java虚拟机的体系结构和内存模型是什么

类装载子系统

Java虚拟机有两种类装载器,分别是启动类装载器和用户自定义装载器。

通类装载子系统通过类的全限定名(包名和类名,网络装载还包括 URL)将 Class  装载进运行时数据区。对于每一个被装载的类型,Java虚拟机都会创建一个java.lang.Class类的实例来代表该类型,该实例被放在内存中的堆 区,而装载的类型信息则位于方法区,这一点和所有其他对象都是一样的。

类装载子系统在装载一个类型前,除了要定位和导入对应的二进制class文件外,还要验证导入类的正确性,为类变量分配并初始化内存,以及解析符号引用为直接引用,这些动作严格按照以下顺序进行:

1)装载——查找并装载类型的二进制数据;

2)连接——执行验证,准备以及解析(可选)

3)验证 确保被导入类型的正确性

4)准备 为类变量分配内存,并将其初始化为默认值

5)解析 把类型中的符号引用转换为直接应用

方法区

对于每一个被类装载子系统装载的类型,虚拟机都会保存下列数据到方法区:

除了上述基本类型信息,还将保存如下信息:

一个到类ClassLoader的引用

//返回的就是刚才保存的ClassLoader引用  
String.class.getClassLoader();

一个到Class类的引用

//将返回刚才保存的Class类的引用  
String.class;

注意,方法区也是可以被垃圾回收器回收的。

Java程序在运行时创建的所有类实例或数组都放在同一个堆中,而每一个Java虚拟机也是有一个对空间,所有线程共享一个堆(这就是一个多线程的Java程序会产生对象访问的同步问题的原因了)。

由于每一种Java虚拟机都有对虚拟机规范的不同实现,所以我们可能不知道每一种Java虚拟机在堆中是以何种形式表示对象实例的,不过我们可以通过下面这可能的实现来一窥端倪:

Java虚拟机的体系结构和内存模型是什么

程序计数器

对于运行中的Java程序而言,每一个线程都有自己的PC(程序计数器)寄存器,它是在该线程启动时创建的,大小为一个字长,用来保存需要被执行的下一行代码的位置。

Java栈

每一个线程都有一个Java栈,以栈帧为单位保存线程的运行状态。虚拟机对Java栈的操作有两种:压栈和出栈,二者都已帧为单位。栈帧保存了传入参数、局部变量、中间运算结果等数据,在方法完成时被弹出,然后释放。

看一下两个局部变量相加时栈帧的内存快照

Java虚拟机的体系结构和内存模型是什么

本地方法栈

这是 Java 调用操作系统本地库的地方,用来实现 JNI(Java Native Interface,Java 本地接口)

执行引擎

Java虚拟机的核心,控制装入 Java 字节码并解析;对于运行中的Java程序而言,每一个线程都是一个独立的虚拟机执行引擎的实例,从线程生命周期的开始到结束,他要么在执行字节码,要么在执行本地方法。

本地接口

连接了本地方法栈和操作系统库。

注:文中所有提到”Java虚拟机”的地方都是指”JavaEE和JavaSE平台的Java虚拟机规范”。

到此,关于“Java虚拟机的体系结构和内存模型是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. tomcat和java虚拟机是什么
  2. Java虚拟机体系结构

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:怎么合理利用DNSLOG进行无回显安全测试

下一篇:怎样实现Kali-OpenVAS 扫描

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》