Java虚拟机学习笔记(一)——class文件结构、类生命周期、内存分布

【STM32F042】使用NTC热敏电阻实现温度测量 1.NTC介绍 NTC是负温度系数的简写,全称是Negative temperature coefficient.意思是随着温度的升高,电阻值呈现下降趋势。常用作温度传感器。这里有一个式子表示负温度系数的电阻值: RT=R0*exp(B (1/T-1/T0)) RT为周围温度为T (K) 时的电阻值,R0是周围温度为T0(K) 时的电阻值,注意这里的温度是开... 阅读详情

Java虚拟机结构

在这里插入图片描述
java虚拟机包括运行时数据区域、执行引擎、本地接口和本地方法库。

类加载系统不属于Java虚拟机结构。

class文件结构

Java文件编译后生成了class文件,这种二进制文件不依赖于硬件和操作系统。
Class文件格式包含了很多关键的信息,其中的u4 u2 表示的事进本数据类型。
在这里插入图片描述

  • u1: 1字节,无符号类型
  • u2: 2字节,无符号类型
  • u4: 4字节,无符号类型
  • u8: 8字节,无符号类型

https://camo.githubusercontent.com/b500a94627f72a03fd9ce4063cea156512110ade/68747470733a2f2f6d792d626c6f672d746f2d7573652e6f73732d636e2d6265696a696e672e616c6979756e63732e636f6d2f323031392d362f2545372542312542422545362539362538372545342542422542362545352541442539372545382538412538322545372541302538312545372542422539332545362539452538342545372542422538342545372542422538372545372541342542412545362538342538462545352539422542452e706e67

类的生命周期

class文件加载至虚拟机内存到从内存中卸载称为类的声明周期。
类的声明周期阶段包括:加载、链接、初始化、使用和卸载。链接包括了三个阶段:验证、准备、解析。

  • 加载:查找并加载class文件
  • 链接:包括验证、准备、解析
    1. 验证:确保导入类型的正确性
    2. 准备:给类的静态字段分配字段,并初始化
    3. 解析:虚拟机将常量池内的符号引用替换为直接引用
  • 初始化:将类变量初始化为正确的初始值。

加载阶段主要做了三件事:

  • 根据类名查找二进制字节流
  • 将二进制字节流所代表的的静态存储结构转化为方法区的运行时数据结构
  • 在内存中生成一个代表这个类的Class对象,作为这方法区这个类的各种数据访问接口

类加载子系统

类加载子系统通过多种类查找Class文件加载到内存中。

Java虚拟机有两种类加载器:系统加载器和自定义加载器。

Bootstrap ClassLoader(引导类加载器)
用C/C++代码实现的类加载器,用于加载指定的JDK核心类库。

Extensions ClassLoader(扩展类加载器)
用于加载Java的扩展类

Application ClassLoader(应用程序类加载器)
又叫系统类加载器,用来加载当前应用程序Classpath目录、系统属性java.class.path指定的目录。
除了系统类加载器还有自定义加载器他是通过ClassLoader类来实现自己的类加载的。

运行时数据区域

Java内存区域划分为:

  • 程序计数器
  • Java虚拟机栈
  • 本地方法栈
  • Java堆
  • 方法区

JDK8 之前
在这里插入图片描述
JDK8
在这里插入图片描述

1. 程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。

为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

  • 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
  • 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。

2. Java虚拟机栈

  • 每一个Java虚拟机线程都一个线程私有的Java虚拟机栈。他的生命周期与线程相同。
  • Java虚拟机栈存储线程中Java方法调用的状态,包括局部变量、参数、返回值以及运算的中间结构等。
  • Java虚拟机栈包含多个栈帧,一个栈帧用来存储局部变量表、操作数栈、动态链接、方法出口等信息。当线程调用一个Java的方法时,虚拟机栈压入一个栈帧,该方法执行完后,这个栈帧就会弹出。

栈内存异常:

  • 线程分配的栈容量超过Java虚拟机所允许的最大容量,Java虚拟机会抛出StackOverflowError
  • 虚拟机栈可扩展,当扩展时无法再申请到足够的内存,会抛出OutOfMemoryError

3. 本地方法栈

他与本地方法栈类似,只不过本地方法栈是用于支撑native方法的。Java虚拟机不支持native方法,可以无需支持本地方法栈。类似的,本地方法栈也会抛出StackOverflowError和OutOfMemoryError

4. Java堆

Java堆是所有线程共享的内存区域,Java堆用来存放对象实例。几乎所有的对象实例以及数组都在这里分配内存。堆内存对象被垃圾回收器管理。

Java堆从内存回收分可以分为新生代和老年代。从内存分配可划分出多个线程私有的分配缓存区。

异常:当堆没有内存实例化,并且也无法扩展时,会抛出OutOfMemoryError。

5. 方法区

方法区是被所有线程共享的运行时内存区域,用来存储已经被Java虚拟机加载的类的结构信息,包括运行时常量池,字段和方法信息,静态变量等数据。方法区是Java堆的逻辑组成部分,他在物理上不需要连续,并且可以选择在方法区中不实现垃圾回收。

如果方法区内存空间不满足内存分配需求时,Java虚拟机会抛出OutOfMemoryError

6. 运行时常量池

运行时常量池不是运行时数据区域的其中一份子,而是方法区的一部分。

class文件不仅包含类的版本、接口、字段和方法等信息,还包含常量池,他用来存放编译时期生成的字面量和符号引用,这些内容会在类加载后存放在运行时常量池中。运行时常量池可以理解是类或接口的常量池运行时表现形式。

在这里插入图片描述

当创建类或接口时,如果运行时常量池所需的内存超过了方法区所能提供的最大值,Java虚拟机会抛出OutOfMemoryError异常。

JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。

《电磁兼容设计》专栏说明 本专栏自2024年1月起开始更新,仅设此一个电磁兼容相关知识专栏,并将一直持续更新下去,无期限 阅读详情

相关推荐

【实战解析】RTL8306MB交换芯片驱动开发中的RMII接口调试陷阱

本文深入剖析了RTL8306MB交换芯片驱动开发中RMII接口的典型调试陷阱。通过一个工业网关项目的实战案例,揭示了因硬件原理图设计疏忽导致TX_EN与CRS_DV信号线错接,从而引发网络“哑火”的根本原因。文章详细展示了使用示波器从时钟、数据到控制信号的系统性排查方法,并总结了关键的设计警示与自查清单,为嵌入式网络开发中的软硬件协同调试提供了宝贵经验。

qqq44的博客 1028

class文件结构详解

写在最前:学习class文件结构不像学习JVM内存结构、垃圾收集器那样,可以对我们写代码时有很多帮助,学习了JVM内存结构,我们在配置虚拟机参数时就会有更全面的考虑,写代码时就可以注意到代码的的优化空间,学习了垃圾收集器,让我们可以根据服务器的配置,更好的选择出适合程序最大吞吐量的收集器,更好的根据服务器硬件配置出合适的参数,学习class呢,则更多的是为了让我们知其然,也知其所以然,让我们知道我们写出的代码在JVM里面到底是怎么运行的,这部分内容会相对枯燥,白话多一些,这里主要分两个部分来详细讲述clas

初心不忘、始终方得 1549

用ESP32-S3和USB摄像头DIY一个无线图传监控(附完整代码和接线图)

本文详细介绍了如何利用ESP32-S3开发板和USB摄像头打造一套高性价比的无线图传监控系统。从硬件选型、接线图到代码实现,提供了完整的DIY方案,特别适合家庭监控、宠物看护等场景。通过优化WiFi传输和双核任务分配,实现了稳定的视频流传输,整套方案成本控制在200元以内。

weixin_33701251的博客 519

JVM第一步——静态存储结构class文件

我们平时看到的运行java程序实际上经历了几次转换。 文章目录引导阅读储备不容有错class文件中的类型class文件中的内容魔数-咖啡宝贝class文件版本号常量池 class文件的资源仓库访问标志(u2类型)确认继承关系的字段表集合 描述接口或者类中声明的变量,不包括方法中声明的变量方法表集合属性表集合 引导 ​ java 能成为跨平台语言得益于它增加了一层中间码—字节码。 我们知道操作系...

silencewmy的博客 1820

在WinXP操作系统上安装Tornado2.2详细教程

使用VxWorks的人都想在自己的电脑中装VxWorks的编译器Tornado,然而Win10操作系统对于Tornado并不友好,根本装不成功。而对于Win7操作系统,之前在实验室一台Win7上装Tornado成功过,并且一直在上面进行vx开发,但是过一段时间在其他Win7上装Tornado时又不能成功,由此说明Tornado对于Win7操作系统对Tornado的兼容也不是很好,所以想要长久使用T...

weixin_43822311的博客 4480

新能源知识库(62)组串式、集中式和高压直挂式

因需多台PCS及独立监控设备,单位功率成本比集中式高15%–20%。高压直挂式因省去变压器,大容量项目成本更低(>5MW时优势显著)。组串式储能、集中式储能和高压直挂式储能是当前主流的三类技术路线,其核心差异源于系统架构和控制逻辑的设计差异。组串式交流侧需变压器升压至10kV/35kV,高压直挂式可直接输出6kV/35kV电压,减少转换损耗。多台小功率PCS并联(每簇独立管理)单台大功率PCS(多簇直流侧并联)环流导致容量衰减(损失5%–8%)无变压器损耗(效率>99%)高压直挂电站(≥10MW)

竹君子之家 1515

虚拟机的内存布局和class文件结构和类加载

虚拟机的内存布局 1.分为五部分:线程私有的:程序计数器、本地方法栈、虚拟机栈。线程共享的:堆、方法区。 2.除了程序计数器,其他的内存区域都会出现OutOfMemoryError。 3.采用分代理论来实现垃圾收集器:堆被分为新生代和老年代,方法区被称为永久代,新生代又分为一个Eden和两个survior空间。 4.所有的对象和数组都应该在堆上分配。 5.方法区存储的是加载的类型数据、常量、静态变量。 6.程序计数器存储的是所执行的字节码的行号。 方法区的演变 对象的访问定位 1.一个对象由三部分组成:对

weixin_44141974的博客 224

深入解析GEM5 McPAT NoC功耗模型:从arbiter电容计算到微架构关联

本文深入解析GEM5 McPAT NoC功耗模型,重点探讨arbiter电容计算与微架构的关联。通过拆解动态功耗公式和四类电容的物理本质,揭示能量与功率的转换关系,并提供参数调试和模型精度优化的实战技巧,帮助开发者更准确地预测和优化NoC功耗。

weixin_29305313的博客 201

Class类文件结构

计算机只能执行机器码,而机器码是一系列0和1的组合。直接编写机器码肯定不行,为了简化开发就有了汇编语言,由汇编语言翻译成机器码。汇编开发也复杂,就有了C语言,由C语言翻译成汇编语言。后来就由C写出了Java。在各种IDE平台上写的程序都是.java文件,经过编译器编译为.class文件,然后JVM拿到这些.class文件经过解释器生成可执行的机器码。各种不同平台的虚拟机和所有平台都统一使用的程序存储格式—字节码,是构成平台无关性的基石。.class文件就是存储字节码的,不同平台产生的Class格式是统一的。

二豪码字 249

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

struggle2025的博客 1749

量子化学仿真软件:VASP_(7).表面与界面性质模拟

在量子化学仿真软件领域,表面与界面性质的模拟是研究多相催化、表面反应、材料科学等领域的关键工具。VASP(Vienna Ab Initio Simulation Package)作为一种广泛使用的密度泛函理论(DFT)计算软件,提供了强大的功能来模拟表面与界面的性质。本节将详细介绍如何使用VASP进行表面与界面性质的模拟,包括模型构建、输入文件准备、计算设置、结果分析等步骤。

kkchenjj的博客 948

Class文件解析

1. Class文件的介绍 1.1 本质 Class 文件是一组以一个字节为基础单位的二进制流。 任何一个 Class 文件都对应着唯一一个类或接口的定义信息 1.2 格式 Class 文件格式采用一种类似于 C 语言结构体的方式进行数据存储,这种结构中只有两种数据类型:无符号数和表 无符号数属于基本的数据类型,以 u1、u2、u4、u8 来分别代表 1 个字节、2 个字节、4 个字节、8 个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照 UTF-8 编码构成字符串值。 表是由多

Aur_ora的博客 2225

智能Agent如何重塑企业流程

在当今数字化时代,企业流程的效率和敏捷性至关重要。传统企业流程往往受限于人工操作,效率低下、成本高昂,难以适应快速变化的市场环境。智能Agent作为一种新兴技术,凭借其强大的智能化能力,正在逐渐改变企业流程的运作模式,为企业带来新的机遇和挑战。智能Agent是一种能够感知环境、自主决策、执行任务的软件实体。它可以模拟人类的智能行为,例如学习、推理、规划和沟通。通过将智能Agent嵌入到企业流程中,可以实现流程的自动化、优化和智能化,从而提高效率、降低成本、提升客户体验。8.1 研究成果总结。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 873

《深入理解Java虚拟机:Java Class 文件结构》

重要性存储与执行基础:Class文件是Java程序在Java虚拟机上运行的基本存储格式,它包含了Java程序的类和接口的定义信息,是Java虚拟机执行引擎的输入。平台无关性保障:Java虚拟机通过读取Class文件来执行Java程序,而Class文件的平台无关性使得Java程序可以在不同的操作系统和硬件平台上运行,实现了“一次编写,到处运行”的目标。无关性特点语言无关性。

weixin_51105979的博客 718

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JVM虚拟机——Class文件结构

魔数Class文件版本常量池访问标志类索引,父亲索引,接口索引集合字段表集合方法表集合属性表集合。

2401_85441188的博客 1804

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Java虚拟机系列】- Class字节码文件结构

Class文件是一组以8字节为基础单位的二进制流,内无分隔符无空隙,对于需占用8字节以上空间的数据项,按照高位在前的方式分割为若干8字节进行存储(高位在前指高位字节在地址最低位来存储数据,SPARC、PowerPC大端存储,而x86小端存储)字节码是一种中间代码,由高级语言编译器编译而成,需要由特定虚拟机进一步编译为机器码,同样的字节码可以在支持相应虚拟机的任何平台运行,即平台无关性。常量池相当于Class文件里的资源仓库,是Class文件中与其他项目关联最多,占用Class文件空间最大的数据项目。

m0_68383079的博客 735

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java中的class文件结构

Java中的.class文件结构是Java源代码经过编译后生成的二进制文件结构,它包含了Java类的结构和信息。以下是对Java中.class文件结构的详细解析综上所述,Java中的.class文件结构是一个复杂但有序的二进制流,它包含了Java类的结构和信息。通过对.class文件结构的解析,我们可以了解Java类的内部结构、字段、方法以及它们之间的关系等信息。

sutingStart的博客 1063

【JVM进阶之路】十一:Class文件结构

JVM进阶之路十一篇,了解Java无关性的基石——Class字节码文件。

三分恶的博客 1720

Java虚拟机(8)Class文件结构

无关性 Oracle公司以及其他虚拟机发行商发布过许多可以运行在各种不同硬件平台和操作系统上的Java虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的“一次编写,到处运行”的平台无关性。 实现语言无关性的基础仍然是虚拟机和字节码存储格式,Java虚拟机不与任何程序语言(包括Java)绑定,它只与“Class文件”这种特定的二进制文件格式所关联。Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。基于安全方面的考虑,《Java虚拟机规范》中要求在Class文件必须

nianlun1的博客 401

.class文件转换.java_Java虚拟机:深入了解class文件结构

对于有一定工作年限的同学来说,要想往更高层次发展,须得了解虚拟机一些技术特性的运行原理,而class文件结构则是里面重要的一环,这部分内容是了解虚拟机的重要基础之一。 如果想深入地了解虚拟机,那么这部分是不能不接触的。我们知道IOC和AOP是Spring的两大基石功能,那么不知道各位同学有没有了解过AOP的实现原理呢?在Spring里,AOP功能是利用代理实现的,对于实现了接口的类,Spring使...

weixin_39607240的博客 101

Class文件结构

在Java语言中,要重载(Overload)一个方法,除了要与原方法具有相同的简单名称之外,还要求必须拥有一个与原方法不同的特征签名,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,也就是因为返回值不会包含在特征签名之中,因此Java语言里无法仅仅依靠返回值的不同来对一个已有方法进行重载。在interfaces[]中,各成员所表示的接口顺序和对应的源代码中给定的接口顺序(从左至右)一样,即interfaces[0]对应的是源代码中最左边的接口。常量池中的每一项都具备相同的特征。

qq_27352081的博客 782

深入理解Java虚拟机——Class文件结构——第九章——中篇

深入理解Java虚拟机——Java虚拟机介绍——第一章 深入理解Java虚拟机——类加载子系统——第二章 深入理解Java虚拟机——运行时数据区和本地方法接口——详细篇——第三章 深入理解Java虚拟机——对象的实例化内存布局与访问定位——超级详细篇——第四章 深入理解Java虚拟机——直接内存——超级详细篇——第五章 深入理解Java虚拟机——执行引擎——超级详细篇——第六章 深入理解Java虚拟机——StringTable——超级详细篇——第七章 深入理解Java虚拟机——Java垃圾回收器——史上最烂

qq_44891295的博客 973

实例分析JAVA CLASS的文件结构

今天把之前在Evernote中的笔记重新整理了一下,发上来供对java class 文件结构的有兴趣的同学参考一下。 学习Java的朋友应该都知道Java从刚开始的时候就打着平台无关性的旗号,说“一次编写,到处运行”,其实说到无关性,Java平台还有另外一个无关 性那就是语言无关性,要实现语言无关性,那么Java体系中的class的文件结构或者说是字节码就显得相当重要了,其实Java从刚开始的时...

GarfieldEr007的专栏 702

class文件结构详细解析

之前一直好奇java文件经过编译后生成的class文件,到底存储了什么信息?是如何被jvm识别并执行的?我们可不可以通过外部力量修改class文件内容,以致可以修改程序的运行?于是我带着种种疑问,开始研究class文件。参考《深入理解Java虚拟机》(周志鹏著) 在深入分析class文件之前,我们先来探讨class文件存在原因: 无关性的基石:Java刚开始诞生时的宣传口号“一次编写,到处运行”,开发者早就料想到,各种不用的硬件体系结构、各种不同的操作系统将来肯定会长期并存发展,实现跨平台的基础就是实现在操

weixin_43483947的博客 2737

java项目class文件结构_一文弄懂class文件结构

原标题:一文弄懂class文件结构Java把规范拆分成了《Java语言规范》、《Java虚拟机规范》,Java语言规范对应Java代码规范,Java虚拟机规范则对应Class文件。平台无关性各种不同平台的Java虚拟机,以及所有平台都统一支持的程序存储格式——字节码(Byte Code) 是构成平台无关性的基石。这种实现使得Java虚拟机规范通过只对Class文件这种特定的二进制文件负责,实现了J...

weixin_35480430的博客 697

JVM学习-Class文件结构

JVM-Class文件结构

疼了也不哭的博客 1229
上一篇: OkHttp——复用连接池源码剖析总结
下一篇: 计算机网络——传输层(二)
PdKingLiu
博客等级 码龄9年 89粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值