千家信息网

JVM体系结构是怎么样的

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍JVM体系结构是怎么样的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!先上一张JVM体系结构图:1)运行时数据区:经过编译生成的字节码文件(class文件),由
千家信息网最后更新 2025年01月23日JVM体系结构是怎么样的

这篇文章主要介绍JVM体系结构是怎么样的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

先上一张JVM体系结构图:


1)运行时数据区:经过编译生成的字节码文件(class文件),由class loader(类加载子系统)加载后交给执行引擎执行。在执行引擎执行的过程中产生的数据会存储在一块内存区域。这块内存区域就是运行时区域

2)程序计数器:用于记录当前线程的正在执行的字节码指令位置。由于虚拟机的多线程是切换线程并分配cpu执行时间的方式实现的,不同线程的执行位置都需要记录下来,因此程序计数器是线程私有的

3)虚拟机栈:虚拟机栈是java方法执行的内存结构,虚拟机会在每个java方法执行时创建一个"栈桢",用于存储局部变量表,操作数栈,动态链接,方法出口等信息。当方法执行完毕时,该栈桢会从虚拟机栈中出栈。其中局部变量表包含基本数据类型和对象引用;

  在java虚拟机规范中,对这个区域规定了两种异常状态:如果线程请求的栈的深度大于虚拟机允许的深度,将抛出StackOverFlowError异常(栈溢出),如果虚拟机栈可以动态扩展(现在大部分java虚拟机都可以动态扩展,只不过java虚拟机规范中也允许固定长度的java虚拟机栈),如果扩展时无法申请到足够的内存空间,就会抛出OutOfmMemoryError异常(没有足够的内存)

4)本地方法栈:类似java方法的执行有虚拟机栈,本地方法的执行则对应有本地方法栈

5)方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。线程共享(看存储的数据就知道了)

java虚拟机规范对方法区的限制非常宽松,除了和java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。相对而言,垃圾收集在这个区域是比较少出现的,但并非数据进入了方法区就如永久代的名字一样永久存在了。

这区域的内存回收目标重要是针对常量池的回收和类型的卸载,一般来说这个内存区域的回收'成绩'比较难以令人满意。尤其是类型的卸载条件非常苛刻,但是这部分的回收确实是必要的。在sun公司的bug列表中,曾出现过的若干个严重的bug就是由于低版本的HotSpot虚拟机对此区域未完成回收导致的内存溢出。

6)java堆(java Heap):堆的主要作用是存放程序运行过程中创建的对象实例,因为要存放的对象实例有可能会极多,因此也是虚拟机内存管理中最大的一块。并且由于硬件条件有限,所以需要不断回收已"无用"的实例对象来腾出空间给新生成的实例对象;因此java的垃圾回收主要是针对堆进行回收的(还有方法区的常量池),java堆很多时候也被称为GC堆(Garbage Collected Heap)。

7)类加载机制(Class Loader):类加载子系统是根据一个类的全限定名来加载该类的二进制流到内存中,在JVM中将形成一份描述Class结构的元信息对象(方法区),通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。

好!说了这么多关键字,再拿例子来讲解一下这些关键字:

A.图1是我们写的HelloWorld.java,通过IDE或命令:javac HelloWorld 编译生成16进制的HelloWorld.class(字节码文件,见图3),想读懂16进制字节可参考:一文让你明白java字节码 ;但一般IDE会自动转译成图2的指令;或者通过命令:javap -verbose HelloWorld 进行转译。

(图1)HelloWorld.java

(图2)HelloWorld.class

(图3)16进制的字节码:

B.接着,当我们通过IDE或者命令:java HelloWorld 运行这个class文件时,字节码文件(class文件)通过类加载机制加载完毕交付给执行引擎执行;类加载机制把HelloWrold类的信息、静态变量(例子中没加)、常量(例子中没加,常量会加载到方法区的常量池,这和静态变量不一样)等加载到方法区中,接下来如果需要创建该类的对象,需要通过new后面带的参数到方法区进行查找类相关信息。

C.类加载完后,虚拟机会检查程序的入口,虚拟机中程序的执行入口为main函数,如HelloWorld.class中,,执行引擎找到main函数开始执行指令,并生成一个"桢栈"入栈至虚拟机栈的栈顶;我们可以看到(图2)在main方法下面的命令:0 new java.lang.StringBuilder [16] 表示创建一个String对象,创建的String对象实例会在java堆(Heap)中分配内存存储(Java对象在JVM中的创建过程可以看这篇文章:Java对象是怎么创建的(通过对象的创建,了解JVM内存结构)),并把该指令位置"0"记录到当前线程的程序计数器中;3 dup 然后把该对象的引用压入虚拟机栈中,并把该指令位置"3"记录到当前线程的程序计数器中;4 ldc [18] 从字符串常量池(从jdk1.7开始,字符串常量池被移动到java堆)加载字符串常量Hello,并更新指令位置到程序计数器;...如果执行过程中有本地方法的指令,则会在本地方法栈中进行出入栈;这里有个点注意一下,请看main函数指令16的位置: 16 new java.lang.StringBuilder [31] 这里创建了一个StringBuilder对象,自jdk5开始已对这种类型的字符串拼接进行了优化,具体自行谷歌补充。

D.执行引擎执行指令过程中,按需调用本地库接口以执行本地库方法,如new指令、输出屏幕等操作

以上是"JVM体系结构是怎么样的"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

方法 对象 内存 指令 常量 线程 区域 程序 结构 信息 字节 位置 数据 文件 变量 实例 引擎 程序计数器 计数器 过程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全宣传进校园心得 sql数据库使用界面操作 校园网络安全讲座新闻报道 我的世界梦想斗罗服务器下载 办公室多人共用一台服务器 烽火r2200服务器管理口 代号探戈服务器访问 方舟为何搜索不到服务器 什么样的企业对软件开发有利 行情价格服务器频道 国家网络安全学院考研 软件开发有没有价值 腾讯回应服务器挂了ig 榆树智能网络技术诚信经营 网络安全培训班出来一般工资多少 税控服务器管理系统忘记密码 数据库在表中添加新字段 怎样运行网络安全向导 延安市软件开发服务商 叁叁玖厦门互联网科技有限公司 云计算培训 真正网络安全 做软件开发被带到公安局 软件开发试用期工资8折 数据库系统的缩写是dbms 服务器上打不出数字按哪个键 linux服务器太卡怎么排查 未连接到官方任意服务器 马鞍山证券软件开发公司 服务器群控软件免费版 软件开发盈利方式
0