加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长资讯 > 动态 > 正文

带你明白JVM 运行时数据区

发布时间:2022-03-19 17:35:51 所属栏目:动态 来源:互联网
导读:众所周知,Java程序的执行需要依赖于JVM(Java 虚拟机)。JVM 会将Java源代码编译成字节码文件,然后使用类加载器将其加载到运行时数据区中执行,垃圾收集器也会针对运行时数据区进行对象回收的工作。今天就来说说JVM的运行时数据区。 运行时数据区概述 在
  众所周知,Java程序的执行需要依赖于JVM(Java 虚拟机)。JVM 会将Java源代码编译成字节码文件,然后使用类加载器将其加载到运行时数据区中执行,垃圾收集器也会针对运行时数据区进行对象回收的工作。今天就来说说JVM的运行时数据区。
 
  运行时数据区概述
 
  在计算机世界中,内存是十分重要的系统资源,它承载着操作系统和应用程序实时运行的责任。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,从而保证了JVM的高效稳定运行。
 
  Java虚拟机在执行Java程序的过程中,会将涉及到的数据划分到不同的内存区域去管理,在这些数据区域,有些是随着虚拟机启动而创建,虚拟机关闭而销毁。还有一部分是随着线程生命周期创建销毁的。这部分区域就是接下来要讲的Java虚拟机的运行时数据区。
 
  
  图1中标注为黄色的方法区和堆是线程间共享的,也就是说它们会随着虚拟机启动而创建,随着虚拟机退出而销毁。橙色部分为每个线程单独享有的,即它们与线程是一一对应的,会随着线程开始和结束而创建和销毁。在HotSpot JVM中,每个线程都与操作系统的本地线程直接映射,例如:有一个Java线程准备好执行时,就有一个操作系统的本地线程被创建并且与Java 线程对应,当Java线程执行终止后,本地线程也会被回收。同时操作系统负责线程调度,及分配对应的CPU执行线程,一旦操作系统的本地线程初始化成功,它就会调用Java线程中的的run()方法去执行Java线程。
 
  褐色部分的执行引擎就负责读取指令并且交由CPU执行,它包括解释器、JIT(即时编译器),GC(垃圾回收器)。而另外一个褐色的本地库接口会提供Java程序调用的native方法。
 
  另外,运行时数据区的划分也随着JDK的发展不断变迁,如图2 所示, JDK 1.6、JDK 1.7、JDK 1.8 的内存划分都会有所不同。
 
  
  每个Java线程都会对应一个虚拟机栈,换句话说多个线程就对应多个虚拟机栈。上面讲过了虚拟机栈是线程私有,虚拟机栈中包含多个栈帧(Stack Frame),每一个栈帧是为方法执行而创建的,栈帧中描述的是Java方法执行的内存模型。每个方法从调用开始直到完成的全过程都对应着一个栈帧。栈帧是用来管理Java程序的运行,并保存方法的局部变量、部分结果、并参与方法的调用与返回。
 
  在活动线程中,只有一个栈帧是处于活跃状态的,也就是说只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法。执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。
 
  如图3 所示,每个Java 方法都会对应一个栈帧,左边的四个方法就对应了四个栈帧,从下往上依次是方法调用的顺序,最终方法1 会调用方法4, 此时正在执行方法4 ,它对应的栈帧4 就是“当前栈帧”,就是出于活跃状态的,其包含了局部变量表、操作数栈、动态链接以及返回地址等信息。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读