当前位置: 首页 > news >正文

Java Virtual Machine的结构 3

1 Run-Time Data Areas

1.1 The pc Register

1.2 Java Virtual Machine Stacks

1.3 Heap

1.4 Method Area

JVM方法区是在JVM所有线程中共享的内存区域,在编程语言中方法区是用于存储编译的代码、在操作系统进程中方法区是用于存储文本段,在JVM中方法区用于存储每个类的结构,其中包括运行时常量池、作用域数据、方法数据、方法的代码、构造函数的代码、类与接口初始化方法、实例初始化方法。

JVM方法区是在JVM启动的时候被创建,是属于JVM堆区一个逻辑的部分,其支持设置固定的大小、根据运行时的计算所需扩展或者压缩,由于JVM方法区是逻辑的内存空间,不一定需要连续的物理空间。JVM方法区在以下的条件下将发生异常:

  • 假如JVM方法区申请或扩展时所需的内存空间不足,则JVM抛出OutOfMemoryError的异常

1.5 Run-Time Constant Pool

JMV运行时常量池是对应每个类或者每个接口的来自class类文件中constant_pool常量表的表示,其包括多种类型的常量,包括编译时生成的字面数字、在运行时才能处理的引用常量,JVM常量池类似于常用编程语言的符号表,但是其覆盖的数据范围更广。每个运行时常量池是在JVM方法区中申请,JVM在每个类或者接口被创建的时候构造其对应的常量池。JVM在构建每个类或者接口的常量池的时候,在以下的条件下将发生异常:

  • 假如JVM常量池申请或扩展时所需的内存空间不足,则JVM抛出OutOfMemoryError的异常

1.6 Native Method Stacks

JVM的实现使用类似于C语言的常用栈,支持native本地方法的(非Java语言实现的方法,例如,使用C语言实现的方法),native本地方法栈是在每个线程创建的时候构建。

JVM的native本地方法栈支持固定大小或者动态扩展,栈空间可以根据需要计算压缩,如果栈空间是固定大小,则在栈被创建的时候需要单独选择地址空间。JVM在实现上能为程序员或者用户提供控制JVM栈的初始化大小、动态扩展以及压缩、设置JVM栈的最大值以及最小值,JVM栈在以下的条件下将发生异常:

  • 假如一个线程在计算时所需要的栈空间大于JVM栈所允许的值,则JVM抛出一个StackOverflowError的异常

  • 假如JVM栈能动态扩展,当栈扩展时所需的内存空间不足、当创建一个线程时所需的内存空间不足,则JVM抛出OutOfMemoryError的异常

2 Frames

每个框是用于存储数据以及部分结果、用于执行动态链接、为方法返回结果、分发异常,每个新框是在每次一个方法被调用的时候创建,当该方法调用完成的时候框被销毁,frames框是由线程从JVM栈中申请而创建,每个frame框包括对应方法的本地变量的数组、方法的操作数栈、方法对应的类的运行时常量池的引用。

本地变量数组的大小以及操作数栈是在编译时确定以及跟随着与frrame框架对应的方法代码,因此这些结构的内存空间可以在方法被调用的时候创建。

一个线程在执行的过程中,同一个时间点只能有一个正在执行的方法对应的frame框是活跃的,该frame框被称之为当前frame框,则与之对应的方法被称之为当前方法,则当前方法对应的类被称之为当前类,对本地变量或者操作数栈的操作一般是指当前frame框。

一个线程在执行的过程中,当一个当前方法被调用完成或者一个当前方法调用另外的方法,则该当前方法不再是当前的,当前一个新的方法被调用,则一个新frame框被创建而成为当前方法,线程控制到新当前方法中。当前方法返回,当前frame框也返回调用结果,到之前的frame框,之前的frame框将成为当前框。被一个线程创建的frame框是本地的,不能被其他框引用。

2.1 Local Variables

(未完待续)

http://www.lryc.cn/news/40550.html

相关文章:

  • linux ubuntu22 安装neo4j
  • 模型实战(7)之YOLOv8推理+训练自己的数据集详解
  • 火车进出栈问题 题解
  • Unity学习日记12(导航走路相关、动作完成度返回参数)
  • 基于bearpi的智能小车--Qt上位机设计
  • 汇编语言与微机原理(1)基础知识
  • ASEMI代理瑞萨TW8825-LA1-CR汽车芯片
  • 什么是 .com 域名?含义和用途又是什么?
  • VueX快速入门(适合后端,无脑入门!!!)
  • 前列腺癌论文笔记
  • Python+Yolov5道路障碍物识别
  • 全新升级,EasyV 3D高德地图组件全新上线
  • 从管理到变革,优秀管理者的进阶之路
  • 安装Anaconda3
  • HTTPS,SSL(对称加密和非对称加密详解)
  • 【数据结构】还不懂算法复杂度?一文带你速解
  • 案例描述:update中,MySQL inner join 和 left join的区别,小结果集驱动大结果集
  • CF1784D Wooden Spoon
  • 【数据结构】栈
  • C++单继承和多继承
  • 金三银四,今年企业招聘如何?
  • 数字信号处理:滤波、频谱
  • C#等高级语言运行过程
  • 如何优雅的用POI导入Excel文件
  • 【AI 工具】文心一言内测记录
  • Github的使用
  • 抽丝剥茧还原真相,记一次神奇的崩溃
  • 学习笔记八:docker资源配额
  • 小米10s格机修复 nv报错案例解析 关于基带分区的一些常识
  • 【3.17】MySQL索引整理、回溯(分割、子集问题)