JVM基础学习---2、总体机制中不重要的部分、方法区、虚拟机栈

news2025/1/19 23:26:36

1、总体机制中不重要的部分

1.1 本地接口 Native Interface

本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序。因为 Java 诞生的时候是 C/C++ 横行的时候,要想立足,必须有能力调用 C/C++。于是就在内存中专门开辟了一块区域处理标记为 native 的代码,它的具体做法是 Native Method Stack 中登记 native 方法,在Execution Engine 执行时加载 native libraies。

目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过 Java 程序驱动打印机或者 Java 系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间的通信很发达,比如可以使用 Socket 通信,也可以使用 Web Service 等等,不多做介绍。

1.2 本地方法栈 Native Method Stack

专门负责在本地方法运行时,提供栈空间,存放本地方法每一次执行时创建的栈帧。它的具体做法是在 Native Method Stack 中登记 native 方法,在 Execution Engine 执行时加载本地方法库。

native方法举例:

public static native void yield();

栈:stack
堆:heap
如果抛开JVM内存结构,单独来看栈和堆其实是没有区别的,都是只先进后出的数据结构。

1.3 程序计数器

也叫PC寄存器(Program Counter Register)。用于保存程序执行过程,下一条即将执行的指令的地址。也就是说能够保存程序当前已经执行到的位置。这个位置由执行引擎读取下一条指令,是一个非常小的内存空间,从内存空间使用优化这个角度来看:几乎可以忽略不记。

1.4 执行引擎 Execution Engine

在这里插入图片描述
作用:用于执行字节码文件中的指令。
执行指令的具体技术:

  • 解释执行:第一代JVM
  • 即时编译:JIT,第二代JVM。
  • 自适应优化:目前Sun的Hotspot JVM采用这种技术。吸取了第一代JVM和第二代JVM的经验,在一开始的时候对代码进行解释执行, 同时使用一个后台线程监控代码的执行。如果一段代码经常被调用,那么就对这段代码进行编译,编译为本地代码,并进行执行优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。
  • 芯片级直接执行:内嵌在芯片上,用本地方法执行Java字节码。

1.5 直接内存

在这里插入图片描述
1、作用
在特定场景提高性能
2、应用场景
直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的 I/O 方式,它可以使用native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆中来回复制数据。 本机直接内存的分配不会受到 Java 堆大小的限制,受到本机总内存大小限制。 配置虚拟机参数时,不要忽略直接内存防止出现 OutOfMemoryError 异常。
3、直接内存和堆内存比较
直接内存申请空间耗费更高的性能,当频繁申请到一定量时尤为明显。直接内存I/O读写的性能要优于普通的堆内存,在多次读写操作的情况下差异明显。

2、方法区

2.1 概念

  • 标准层面:方法区(Method Area)
  • 具体实现层面:
    • <=1.6 永久代(PermGen)
    • =1.7永久代依然存在,但是已经开始提出:去永久代。
    • =1.8元空间(Meta Space)。

2.2 概念的辨析

  • 从方法区角度来说
    • 方法区的具体实现:JDK<=1.7时,使用永久代作为方法区
    • 方法区的具体实现:JDK>=1.8时,使用元空间作为方法区。
  • 从堆空间角度来说
    • 新生代:从标准和实现层面都确定属于堆
    • 老年代:从标准和实现层面都确定属于堆。
    • 永久代
      • 名义上属于堆
      • 实现上不属于堆,它另外有一个名字:非堆(Non-heap)
        在这里插入图片描述

2.3 方法区存放内容

  • 类信息:类中定义的构造器、接口的定义
  • 静态变量(类变量):private static String some;
  • 常量:public static final String SYS_MEDDAGE=“hello”
  • 运行时常量池:“a”、“abc”
  • 类中静态方法的代码

2.4 类加载机制和方法区的关系

  • 类加载到JVM内存后,类的静态储存结构转化为方法区的运行时数据结构
  • 类加载后,会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区中这个类的各种数据的访问入口。
  • 类的字节码文件中有存放静态数据的常量池,类加载到内存后,字节码文件中的常量池会映射到方法区中的常量池。
    说明:即使多个线程执行的是同一个方法,也并不是都拥挤到方法区去找方法代码。而是取得一份方法中代码指令的拷贝。

3、虚拟机栈

3.1 总体结构

在这里插入图片描述

3.2 栈帧

方法的每一次调用都会产生一个栈帧,线程中每一次调用一个方法,就会在虚拟机栈中开辟一块空间保存栈帧。
方法本次执行完成,本次执行对应的栈帧就会被释放。
整个线程要调用的所以方法都执行完成,则整个线程空间释放。

1、栈帧储存的数据
方法在本次执行过程中所用到的局部变量、动态链接、方法出口等信息。栈帧中主要保存三类数据:

  • 本地变量(Local Variables):也叫局部变量,输入参数和输出参数以及方法内的变量。
  • 栈操作(Operate Stack):记录出栈、入栈操作
  • 栈帧数据(Frame Data):包括类文件、方法等等
    2、栈帧的结构
    局部变量表:方法执行时的参数、方法体内声明的局部变量
    操作数栈:存储中间运算结果,是一个临时储存空间。
    栈数据区:保存访问常量池指针,异常处理表

3、栈帧工作机制

当一个方法 A 被调用时就产生了一个栈帧 F1,并被压入到栈中,

A 方法又调用了 B 方法,于是产生栈帧 F2 也被压入栈,

B 方法又调用了 C 方法,于是产生栈帧 F3 也被压入栈,

……

C 方法执行完毕后,弹出 F3 栈帧;

B 方法执行完毕后,弹出 F2 栈帧;

A 方法执行完毕后,弹出 F1栈帧;
……
遵循“先进后出”的原则
在这里插入图片描述
图示在一个栈中有两个栈帧:

栈帧 2 是最先被调用的方法,先入栈,

然后方法 2 又调用了方法 1,栈帧 1 处于栈顶的位置,

栈帧 2 处于栈底,执行完毕后,依次弹出栈帧 1 和栈帧 2,

线程结束,栈释放。

每执行一个方法都会产生一个栈帧,保存到栈的顶部,顶部栈就是当前方法,该方法执行完毕后会自动将此栈帧出栈。

两组配套概念:
①串行,同步操作,按顺序执行,前一个操作不执行完后面操作就要等待
②并行,异步操作,由操作系统和CPU调度,不同操作之间不需要互相等待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCB~电磁干扰

电磁辐射 • 两个主要的电磁来源 • 电流穿过一个金属会产生一个磁场 • 在磁场中放置一个磁场会产生感应电流 • 导体的形状会影响流经它的电流所产生的磁场强度&#xff0c;反之变然 EMI&#xff1a;电磁干扰 • EMI:Electro-Magnetic Interference • EMI代表的是一个设…

自动构建之CMake

CMake 链接: 自动构建之MakeFile CMake也是一种用于自动化构建软件项目的工具。Cmake可以自动输出MakeFile文件&#xff0c;并且CMake是一个跨平台的构建系统&#xff0c;对于复杂的、跨平台的项目&#xff0c;CMake可能是一个更好的解决方案。 CMake的脚本文件是在CMakeLis…

chatgpt赋能Python-python_can

Python-CAN: 一个用于控制CAN总线通信的Python工具 什么是CAN总线&#xff1f; Controller Area Network&#xff08;CAN&#xff09;是用于控制器之间通信的一种通信协议。它经常用于汽车、工业自动化和机器人等领域。CAN总线可以连接多个设备&#xff0c;这些设备可以通过总…

离谱,入职比亚迪一个月,我算是开眼了..

去年校招寒冬很多人都收到BYD的offer&#xff0c;看多了把BYD当爷爷拜的分享了&#xff0c;这里我就做个坏人来泼盆冷水。 以下情况仅仅适用于我从同部门同事和室友了解到的&#xff0c;至于这种情况适不适用于整个厂&#xff0c;就看各位怎么理解了。 当然也不是硬黑硬洗&am…

力扣sql中等篇练习(二十四)

力扣sql中等篇练习(二十四) 1 商店中每个成员的级别 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 SELECT m.member_id,m.name,case when t.r is null then Bronzewhen t.r>0 AND t.r<50 then …

使用CMake+vcpkg生成VS2022工程——以开源库openMVS为例

使用CMakevcpkg生成VS2022工程——以开源库openMVS为例 背景 想在openMVS应用的基础上做一些改造&#xff0c;于是下载了其开源代码。为了改造它&#xff0c;首先要了解程序执行流程&#xff0c;要是能在VS里以debug模式来运行就好了&#xff01; 过去接触的开源软件/库的编译…

Codeforces Round 835 (Div. 4) Tutorial (zh)

题目链接 A. Medium Number 题意&#xff1a; 给三个数 a , b , c a,b,c a,b,c&#xff0c;找出中间的那个数 eg. a ≤ b ≤ c a \leq b \leq c a≤b≤c 输出 b b b Example input 9 5 2 6 14 3 4 20 2 1 1 2 3 11 19 12 10 8 20 6 20 3 4 1 3 19 8 4output 5 4 2 2 12 10 …

[Nacos] Nacos Client获取调用服务的提供者列表 (四)

文章目录 1.Nacos Client获取调用服务的提供者列表1.1 从Ribbon的负载均衡入手到Nacos Client获取调用服务的提高者列表1.2 getServers方法返回分析1.3 通过selectInstances方法查找Instances实例1.4 获取到要调用服务的serviceInfo Nacos Client 从Ribbon负载均衡调用服务。 …

无公网IP,SSH远程连接Linux CentOS

转载自cpolar内网穿透的文章&#xff1a;无公网IP&#xff0c;SSH远程连接Linux CentOS【内网穿透】 本次教程我们来实现如何在外公网环境下&#xff0c;SSH远程连接家里/公司的Linux CentOS服务器&#xff0c;无需公网IP&#xff0c;也不需要设置路由器。 视频教程 【SSH远程…

汇编十二、定时/计数器

1、功能 定时器/计数器的核心部件是一个加法(也有减法)的计数器&#xff0c;其本质是对脉冲进行计数。只是计数脉冲来源不同&#xff1a;如果计数脉冲来自系统时钟&#xff0c;则为定时方式&#xff0c;此时定时器/计数器每12个时钟周期或者每6个时钟周期得到一个计数脉冲&…

Sentinel简介和安装

1.Sentinel简介 官方Github 官方中文文档Github 官方文档 1.1.Sentinel 是什么&#xff1f; 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 …

HTB-Agile

HTB-Agile 信息收集80端口漫长的兔子洞之旅 立足www-data -> corumcorum -> edwardsedwards -> root 信息收集 80端口 漫长的兔子洞之旅 我注意到系统为我分配了一个session&#xff0c;是以eyj开头的。 拿去jwt.io看看。 额&#xff0c;可能后面会用先留在这&#…

实验5 单选多选、进度条、图像显示等组件使用

实验内容和步骤 以下习题需要自己设计界面内容&#xff0c;尽量丰富&#xff0c;并且突出创新和亮点&#xff0c;不可简单仿照例题。 1.设计并实现音乐播放器的进度条界面。 2.设计并实现含有多选控件的界面。 3.设计并实现含有单选控件的界面。 4.设计并实现含有图像显示的界…

华为OD机试真题 Java 实现【去除多余空格】【2023Q1 200分】

一、题目描述 去除文本多余空格&#xff0c;但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标&#xff0c;去除多余空格后刷新关键词的起始和结束下标。 条件约束&#xff1a; 不考虑关键词起始和结束位置为空格的场景&#xff1b;单词的的开始和结束下标保证…

springboot项目:瑞吉外卖 前后端 代码、思路 详细分析 part6

part1 part2 part3 part4 part5 part6(本页) 7. 菜品展示、购物车、下单 功能开发 7.1 导入用户地址簿相关功能代码 7.2 菜品展示 7.3 购物车 7.4 下单 7.1 导入用户地址簿相关功能代码 7.1.1 整体分析 需求分析 数据模型需要开发的模块&#xff1a;新增收获地址、设置默认…

【Mysql】初识 Mysql

文章目录 【Mysql】初识 Mysql数据库初识主流关系型数据库理解数据库mysql基本操作连接服务器理解服务器&#xff0c;数据库&#xff0c;表关系小案例数据逻辑存储 mysql架构sql分类存储引擎 【Mysql】初识 Mysql 数据库初识 数据库概念 数据库是“按照数据结构来组织、存储和…

v-model使用及原理

关于v-model&#xff0c;vue2与vue3用法不一致&#xff0c;本文学习采用了vue3官网文档。与vue2区别写在本文末尾。一、为什么使用v-model&#xff1f; v-model指令可以在表单input、textarea以及select元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素…

马哈鱼SQLFLow直接数据流介绍

直接数据流介绍 本文将介绍一些生成直接数据流的SQL元素&#xff0c;这些元素是生产数据流的主要原型。 1、Select 示例语句&#xff1a; SELECT a.empName "eName" FROM scott.emp a Where sal > 1000目标列“eName”的数据来自scott.emp.empName列&#xff…

【安卓源码】安卓app应用进程启动原理

目录 0. 应用app 调用 startActivity 1. AMS 调用 startActivity 方法 2. zygote socket 通信,通知 zygote 创建应用进程 1-1&#xff09; 去fork 一个子进程 Zygote.forkAndSpecialize 1-2&#xff09;执行子进程方法 handleChildProc 1-3&#xff09;执行父进程方法 ha…

用户管理 ---MySQL总结(七)

用户管理 对于MySQL的用户也是需要进行管理&#xff0c;这里的东西类似与Linux的多用户管理&#xff0c;基本相同 用户属性 MySQL的用户都是储存在数据库mysql的user之中。 这里使用desc table_name;查看user表的属性。 desc user;//下面的就是输出的结果host:登陆限制 user…