Java 核心技术 0 —— Class加载 和 运行时数据区域

news2024/11/27 18:48:24

在这里插入图片描述

         JVM 是 字节码的运行环境,负责装载class到JVM内部,解释编译为对应平台的机器码指令进行执行,对于JVM设计有权威的定义规范,了解 JVM 类加载各部的主要功能 和 运行时数据区域组成 很有意义。

        磁盘上有一个.java文件,通过编译器的javac 命令又变成了一个平台无关的.class 文件,相信大家都看过,其本质就是一个本地机器码变成字节码的过程。当变成.class File之后的Java技术体系,就即将展开一个关于JVM运行的新世界了。

        首先,就要聊到JVM的类加载机制了。

  1. 加载loading过程:将类的文件,网络等其他方式生成的字节流 注入JVM内存中,同时将Klass 类模板信息 放到方法区中,并创建一个指向 该Klass 的 java.lang.Class对象放到堆中。
  2. 链接Linking:
    1.  Verification 校验阶段 : 校验当前由class文件变成的字节流是否正确的符合规范,一般有格式验证(这一步是配合加载阶段完成的)、语义验证、符号引用验证等 。
    2. Preparation 准备阶段: 为属于类域的静态变量分配存储空间并赋一个初始零值 。基本类型设置对应初始值,引用类型设置null,基本类型常量跟字符串字面量(final static修饰)设置为具体的值。
    3. Resolution 解析阶段:把类中的符号引用转换为直接引用,如果不理解符号引用跟直接引用可以参考知乎文章
  3. Initialization 初始化,调用类构造< clinit >()方法,对类变量及静态代码块进行赋值。

program counter register 程序计数器寄存器

        内存较小,它是当前线程所执行的class文件上的字节码byte code 行号的指示器。在JVM设计的概念模型,字节码解释器在工作的时候,需要改变这个计数器的值来选取下一条需要执行的字节码指令,Java的 if分支,forwhile循环,break跳转,trycatch异常,线程切换 等程序控制流的基础功能实现都需要这个计数器来实现。每一个线程都会有一个program counter register ,否则它就无法恢复到它能正确执行的位置。场景举例:你开辟了99个线程来帮你办事,就要99个程序计数器。各个线程间的计数器互不影响,独立存储,这类内存区域就是线程私有的内存。

JVM Stack 虚拟机栈       

        是程序执行字节码即运行方法时必须的一片空间,也是线程私有,即 99个线程进入这个方法时,每个方法都会来一片这样的内存空间。在进入一个方法前,需要多少槽数的局部变量表(基础数据类型+引用指针+线程切换恢复的地址位置returnAddress)是确定的(64位的数据 long,double 需要2个变量槽,其他1个槽就够了)。出现栈深度不够会抛出StackOverflowError和栈扩展失败会抛出 OOM OutOfMemeryError。

      program counter register 中的值 就是当前指令所在的内存地址,这类内存地址,returnAddress就是线程切换后的能恢复的地址位置。 

在这里插入图片描述

Native Method Stacks 本地方法栈

        JVM使用本地方法时需要的空间,也是线程私有的。和JVMStack一样,出现栈深度不够会抛出StackOverflowError和栈扩展失败会抛出 OOM OutOfMemeryError。

Java Heap 堆

        在JVM设计规范中,所有的对象和数组都应当在堆上分配空间,所以这块内存是JVM最大的内存空间。属于所有线程共有的内存区域,因为大家都会使用这个操场,那么这个区域的内存管理就GC机制尤为重要,也是GC大显身手的地方。

        当前Java堆大部分都被设计为大小可扩展的,可通过 -Xmx 和 -Xms 来设定 最大或最小范围。如果堆内存空间不足满足实例分配就会出现OOM。

Method Area 方法区

        各线程共享,它用于存储被JVM加载的class信息,常量,静态变量,JIT compile 之后的 code cache 代码缓存数据。《Java JVM规范》把Method Area 看作为 Heap的一个逻辑部分,所以Method Area 内存分配不足时也会抛出OOM异常。

Method Area 中有一部分叫做 Runtime Constant Pool 运行时常量池 ,  Class文件 中除了有类版本信息,字段,方法,接口 的描述外,还有一个存放编译期间生成的各种字面量和符号引用,这部分内容 在class load 后,存放在Method Area 的    运行时常量池中。

Direct Memory 直接内存

  • Direct Memory 并不是虚拟机运行时数据区的一部分;
  • 由于在 JDK 1.4 中引入了 NIO 机制,为此实现了一种通过 native 函数直接分配对外内存的,而这一切是通过以下两个概念实现的:
    • 通道(Channel);
    • 缓冲区(Buffer);
  • 通过存储在 Java 堆里面的 DirectByteBuffer 对象对这块内存的引用进行操作;
  • 因避免了 Java 堆和 Native 堆(native heap)中来回复制数据,所以在一些场景中显著提高了性能;
  • 直接内存出现 OutOfMemoryError 异常的原因是物理机器的内存是受限的,但是我们通常会忘记需要为直接内存在物理机中预留相关内存空间;

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

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

相关文章

【目标检测】swin-transformer训练自己的数据集

文章目录1. 数据集的制作1.1. Labelme制作数据集1.2 COCO数据集格式2. 配置swin-transformer3. 训练自己的数据集4. 训练5.参考链接1. 数据集的制作 1.1. Labelme制作数据集 pip install labelme然后在桌面搜索框中找到labelme&#xff0c;然后打开&#xff0c;或者直接在命令…

Python 工匠 第一章 变量与注释

1.1 基础知识 1.1.1 变量常见用法 Python 是一门动态类型的语言&#xff0c;因此无须提前声明变量类型&#xff1b;并且由于其是弱类型语言&#xff0c;即可以更改其变量类型。动态类型语言/弱类型语言 a 10 # 不需要提前声明变量类型 a "a" # 可以更改其变量类…

【架构师】解决方案架构师常用的5种类型架构图

0. 背景 在给不同部门的同学讲解系统时&#xff0c;如果用手势解释解决方案&#xff0c;还有很多“这块和这块通过...”在解释复杂的概念时&#xff0c;大部分人都会晕。我们需要一个视觉效果。有人说一个架构图不就行了吗&#xff1f;但架构图不是一个“放之四海而皆准”的解决…

一、springcloud-eureka服务注册与发现

SpringCloud简介 Spring Cloud 为开发者提供了工具来快速构建分布式系统中的一些常见模式&#xff08;例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话&#xff0c;集群状态&#xff09;。分布式系统的协调导致了样板…

04 Vue属性配置

1、ref属性 App.vue代码&#xff1a; <template><div><h1 v-text"msg" ref"myTitle"></h1><button click"showDom">点我输出上方的DOM元素</button><school ref"school" id"sch"/&…

Node.js | Express+MongoDB 实现简易用户管理系统(一)(项目搭建 | RESTful API架构 | 前后端交互)

&#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f5a5;️ TypeScript知识总结&…

【javaEE】多线程进阶(Part1 锁策略、CAS、synchronized )

目录前言/补充4. 描述一下线程池的执行流程和拒绝策略有哪些&#xff1f;【面试题&#xff01;】一、常见锁策略一&#xff09;乐观锁VS悲观锁二&#xff09;读写锁VS普通互斥锁三&#xff09;重量级锁VS轻量级锁四&#xff09;自旋锁VS挂起等待锁五&#xff09;公平锁VS非公平…

Vue框架背后的故事

文章目录前言Vue萌芽Vue名字的由来因着Vue免试进入MeteorVue逐步完善Taylor推荐VueVue因受质疑发布1.0LinusBorg加入萌生全职做Vue想法Vue在恰到好处的时机出现探索经济来源Serah Drasner加入全职投入Vue建设Vue引入国内Vue受拥国内Vue在决策背景方面的独有优势总结本期推荐前言…

JVM垃圾回收系列之垃圾收集器二

随笔 最近两个星期因为要忙公司项目上线的事情以至于发表的文章会显得碌碌庸流&#xff0c;在此以示歉意 引言 本文将介绍HotSpot中的G1GC 参考书籍&#xff1a;“深入理解Java虚拟机” 个人java知识分享项目——gitee地址 个人java知识分享项目——github地址 G1GC 介…

双向链表的操作

什么是双向链表&#xff1f; 指针域&#xff1a;用于指向当前节点的直接前驱节点&#xff1b; 数据域&#xff1a;用于存储数据元素。 指针域&#xff1a;用于指向当前节点的直接后继节点&#xff1b; typedef struct line{struct line * prior; //指向直接前趋&#xff0c;结…

超级简单的机器学习入门

超级简单的机器学习入门 文章目录超级简单的机器学习入门0.写在前面1.机器学习基本概念2.机器学习算法的类型2.1 监督学习2.2 无监督学习2.3 监督学习和无监督学习的对比2.4 强化学习3.机器学习的三个基本要素3.1 模型3.2 学习准则3.2.1 损失函数3.2.2 欠拟合和过拟合&#xff…

MySQL数据库 || 增删改查操作详解

目录 前言&#xff1a; 插入数据 查询数据 全列查询 指定列查询 带表达式查询 去重查询 查询结果排序 条件查询 比较运算符 逻辑运算符 示例 模糊查询 示例 空值比较 分页查询 修改数据 删除数据 注意&#xff1a; 前言&#xff1a; &#x1f388;增删改查…

Flutter——常用布局

Flutter—常用布局效果图widget 树形图左布局Text评分条提示内容右布局应用Stack布局效果图释示例效果图释电影封面电影信息电影演员电影简介应用效果图 widget 树形图 整个界面由一行组成&#xff0c;分为两列&#xff1b;左列包括电影介绍&#xff0c;由上到下垂直排列&…

java计算机毕业设计ssm+jsp线上授课系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习线上授课的相关知识以及网络提供的技术应用教程&#xff0c;以线上授课的实际应用需要出发&#xff0c;架构系统来改善现线上授课工作流程繁琐等问题。不仅如此以操作者的角度来说&#xf…

【JavaSE】关于数组

文章目录数组的创建与初始化数组的初始化静态初始化动态初始化数组的存储null打印数组的三种方式循环遍历打印foreach打印Arrays.toString()打印数组的练习冒泡排序常用的API数组拷贝Arrays.copyOf()数组排序Arrays.sort()数组的快速初始化Arrays.fill()二维数组数组的创建与初…

mysql之MHA的高可用

一、MHA概述 1.什么是 MHA&#xff1a; MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点故障的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作…

1分钟完成在线测试部署便捷收集班级同学文件的web管理系统

最近CSDN推出了一个新功能【云IDE】&#xff0c;个人对这个新功能(比赛奖金 )挺感兴趣的&#x1f92d;&#xff0c;于是瞬速地拿之前自己搞的一个便捷收集班级同学文件的web管理系统&#xff08;下面简称该项目为cfile&#xff09;体验了一下&#xff0c;发现功能还是挺好用的&…

Node.js 实战 第1章 欢迎进入Node.js 的世界 1.5 三种主流的Node 程序 1.6 总结

Node.js 实战 文章目录Node.js 实战第1章 欢迎进入Node.js 的世界1.5 三种主流的Node 程序1.5.1 Web 应用程序1.5.2 命令行工具和后台程序1.5.3 桌面程序1.5.4 使用Node 的应用程序1.6 总结第1章 欢迎进入Node.js 的世界 1.5 三种主流的Node 程序 Node 程序主要可以分成三种类…

某网站视频播放花屏解密

某网站视频播放花屏解密样例网址&#xff1a;aHR0cHM6Ly90di5jY3R2LmNvbS8yMDIyLzA5LzMwL1ZJREVnZ0ZRYmZ6NmlMeXZjN0F4d0NlZjIyMDkzMC5zaHRtbA 站内之前也曾经发过相关的问题 1.CCTV视频m3u8视频下载&#xff0c;下载下来时长正确&#xff0c;有声音&#xff0c;但是画面是马…

聚沙成塔【45天玩转uni-app】初探uni-app

文章目录写在前面DCloud当下跨平台开发存在的问题为什么选择uni-app写在最后写在前面 聚沙成塔——每天进步一点点&#xff0c;大家好我是几何心凉&#xff0c;不难发现越来越多的前端招聘JD中都加入了uni-app 这一项&#xff0c;它也已经成为前端开发者不可或缺的一项技能了&…