JVM结构基础(一)

STM32+A4988控制步进电机 基于A4988芯片驱动42步进电机,在STM32F1上进行测试,最高可以实现16细分。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> JVM结构基础 前段时间由于研究原来广为传播的String和StringBuffer的性能问题,自己做了几个小实验并得出一些结论,但是从网友的反应来看那个研究并没有起到应有的目的,而且网友也很中肯的提出了自己的意见并对实验中的一些内容指出了其缺陷,针对他们的反应我又反编译了代码来进行对比,但是几位网友仍然不是很信服,而且上次实验的结果和反编译得到的结论并不能完全吻合,因为反编译代码的对比基本上是基于语句的多少,因此这个这个对比也确实不能使人信服,但是这给我的下一步行动指引了方向:研究JVM指令和JVM结构,在对反编译后的代码有完全的理解才能给出可能使人信服的结论。 本文以及以后将要写的一些文章就是我研究JVM规范的一些心得,我希望在和大家共同理解的基础上进行我们下一轮的深入研究。 好,闲话少说,开始我们的正文。 JVM执行的对象就是大家非常熟悉的class文件,我们也称为类文件,JVM规范定义的这个编译完成的代码文件(虽然并非强制要求是实际的文件)的格式非常的详实,但是我们这里只说一些宏观的内容,以后有机会再研究细节的内容吧。JVM要求的类文件的格式是和硬件和操作系统无关的一种二进制格式,它精确定义了类或者接口的表示,它甚至包含了字节顺序这样的细节,而字节顺序在特定平台的目标文件格式中一般都是固定的,不会进行说明。 JVM所支持的数据类型和Java语言规范中定义的几乎一样,请注意是几乎一样!也就是原始类型和引用类型,他们可以被存储在变量表中,也可以作为参数传递、被方法返回,更通常的就是成为操作的对象。为什么和Java语言规范中定义的不完全一样呢?因为JVM中有一种Java语言所没有的原始类型:返回地址类型(returnAddress type)。该类型是jsr, ret以及jsr_w指令需要使用到的,它的值是JVM指令的操作码的指针,并且它的值是不能被运行中的程序所修改的。 另外需要提到的就是布尔类型的值,虽然在Java语言中它是完全独立的值,但是在JVM中只提供了对它的有限支持,表现在: 没有单独的操作布尔类型的指令,源代码中的布尔类型的操作在编译以后是作为int类型的值进行操作的。 JVM直接支持布尔数组,newarray指令可以创建布尔数组,而它的访问和修改操作却是使用byte类型的数组的操作指令进行的:baload,bastore。(在JDK1.0,1,1以及1.2中,布尔数组被编码为byte数组,每个元素是8位) JVM用1代表true,用0代表false,编译器将源代码中的布尔类型映射为JVM中的int类型,而且必须和JVM的要求一致。 另外JVM规范中对于浮点类型的数据有大段的说明,我没有怎么看,主要是讨论JVM的浮点型和IEEE 754的关系的。 关于类型的另外一个需要提一下的是类型检查。JVM期望几乎所有的类型检查已经在运行之前完成了(通常是由编译器进行检查的)而不用JVM自己来检查。原始类型的值不需要被标记或者在运行时被检查以确定他们的类型,同样他们也不用和引用类型的值进行区分,区分工作是由JVM的指令集来完成的,JVM的指令集使用不同指令来区分它要操作的值的类型,例如iadd, ladd, fadd以及dadd是用于将两个数字相加并产生数字类型结果的所有JVM指令,但是每个指令都是针对特定类型的,分别对应int, long, float以及double。 JVM包含对对象的显式支持。类是动态分配的类实例或者是一个数组,JVM中的引用类型就是对一个对象的引用,引用类型的值可以想象为对象的指针,一个对象同时可能存在多个对它的引用,对象总是通过引用被操作、传递或者测试的。 对于引用类型,需要提及的一点就是关于null,它最初是没有运行时类型的,但是它可以被转换为任何类型,而且对于null,JVM并没有要求任何具体的值与之对应。 说完上面这些,我们就开始进入我学习JVM时最想了解的部分了,大家可要打起精神哦。 JVM为运行一个程序定义了几种数据区(Data Area),包括:pc寄存器、JVM堆栈、堆、方法区(Method Area)、运行时常量池(Runtime Constant Pool)以及本机方法堆栈(Native Method Stacks),这些数据区根据其生存期可以分为两种,一种就是和JVM的生存期相同(包括堆和方法区),一种和线程的生存期相同(其它的),和JVM生存期相同的数据区在JVM启动的时候被创建并在JVM退出的时候被销毁,而和线程生存期相同的数据区是每个线程一个的,他们在线程创建的时候被创建,在线程被销毁的时候被销毁。 由于JVM可以同时支持运行多个线程,因此每个线程必然需要各自的PC(program counter)寄存器,无论从什么角度讲,每个JVM线程只能在一个时间只能执行一个方法,该方法也就是线程的当前方法,如果该方法不是本机方法,那么PC寄存器保存的就是当前指令(JVM的指令)的地址,如果是当前方法是本机方法,PC寄存器的值就没有被定义。JVM的PC寄存器的大小足够大,可以容纳一个returnAddress类型或者特定平台的本机指针。 每个JVM线程还拥有一个私有的JVM堆栈,它存储帧(下一篇文章会讲到)。JVM堆栈和像C这样的传统编程语言中的堆栈是类似的,它保存局部变量和部分结果,并且在方法调用和返回中也担任一些职责。因为除了对帧的压入和弹出操作外,对JVM堆栈不能直接进行操作,因此帧可能是在堆上分配的。如果一个线程中计算所需的JVM堆栈大于允许的大小,JVM会抛出StackOverflowError错误,如果JVM堆栈是可以动态伸缩的,如果需要扩展,但是又没有足够的内存可用或者没有足够的内存为一个新线程创建JVM堆栈,JVM会抛出OutOfMemoryError错误。 JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的。堆所存储的对象被一个自动存储管理系统回收(也就是我们所熟知的垃圾收集器(gc))。对象不能被显式的释放,JVM假设没有特定类型的自动存储管理系统,存储管理技术可以根据实现者的系统需求进行选择。如果计算所需的内存堆大于自动存储管理系统可以使用的大小,JVM会抛出OutOfMemoryError错误。 JVM只有一个为所有的线程所共享的方法区,方法区类似传统语言的已编译代码的存储区或者UNIX进程的“文本”段。它存储类结构,例如运行时常量池,成员和方法数据以及方法、构造方法的代码(包括用于类和实例的初始化以及接口类型初始化的特定方法(这些特定方法以后会讲到))。虽然从逻辑上讲方法区是堆的一部分,但是JVM的简单实现可以选择不对方法区进行垃圾收集或者压缩(以笔者的理解就是类不能进行卸载)。最新版本(第二版)的JVM规范没有要求方法区的位置或者管理已编译代码的策略。如果方法区的内存不能满足一个分配请求,JVM会抛出OutOfMemoryError。 运行时常量池是类文件中的常量池表的运行时表示,它包含几种常量,范围从编译时就已知的数字常量到运行时必须进行解析的方法和成员引用。运行时常量池扮演的功能类似于传统编程语言中的符号表(symbol table),但是它所包含的数据比典型的符号表更多。 每个运行时常量池时从JVM的方法区中分配的,对于特定方法或者接口的运行时常量池是JVM在创建类或者接口的时候创建的。 当创建一个类或者接口时,如果创建运行时常量池需要的内存比方法区中的可用内容更多的内存,JVM会抛出OutOfMemoryError。 关于常量池创建的更多内容以后可能会更详细的讲解。 JVM的实现可能使用传统的堆栈(更通常的讲就是C栈)以支持本机方法(不是使用JAVA语言编写的方法),本机方法堆栈也可以用于在像C语言这样的语言中为JVM指令集实现解析器,对于不能加载本机方法以及自身不依赖传统堆栈的JVM实现而言,它可以不提供本机方法堆栈,如果提供,本机方法堆栈通常在线程创建的时候为每个线程分配(以笔者的理解应该是需要使用本机方法的线程)。如果线程计算所需的内存比本机方法堆栈所允许的大,JVM会抛出StackOverflowError错误,如果本机方法堆栈可以动态伸缩,而当需要扩展的时候又没有足够的内存时,或者没有足够的内容用于创建一个本机方法堆栈,JVM会抛出OutOfMemoryError。 对于上面的这些数据区,JVM规范允许它们的大小是固定尺寸的,也可以是根据计算的需要动态伸缩的,如果是固定尺寸的,其尺寸可以在创建时自主选择。JVM的实现可以给程序员或者用户提供控制JVM堆栈的初始大小的方法,同样,在动态伸缩的情况下可以控制最大大小和最小大小,并且它们所使用的内存空间可以不是连续的。
视觉Transformer实战 | Transformer详解与实现 本文系统介绍了 Transformer 架构的核心原理与实现。相比传统 RNN 和 CNN,Transformer 凭借自注意力机制有效捕捉序列中的长距离依赖关系,支持并行训练,显著提升效率。其核心创新在于通过查询、键、值向量计算注意力权重,理解单词间的语义关联。架构包含编码器-解码器结构:编码器通过多头自注意力和前馈网络提取输入特征;解码器利用掩码自注意力和交叉注意力生成输出。本文使用 PyTorch 实现了缩放点积注意力、位置编码、层归一化等关键模块,并构建了完整的 Transformer 模型。 阅读详情

相关推荐

WD西部数据2TB,2.5寸移动硬盘,因为磁头坏了,长时间通电导致划片划伤,维修过程通过反复更换磁头

WD西部数据2TB,2.5寸移动硬盘,因为磁头坏了,长时间通电导致划片划伤,维修过程通过反复更换磁头,才能利用专业设备,里面找到,镜像,把内容数据恢复出来。 1.说一下经历,借用的别人移动硬盘,去帮别人维修,拷数据出来,别人的文件,数据比较多,且复杂,而且是在PE系统,接口什么的是2.0,没有很好的思考就全选复制拷贝了; 2,拷贝的过程,极其慢,文件多,且文件有损坏,移动硬盘一直处于通电的状态,大概从下午,两点多开始100多G的数据,一直卡住,到,晚上7 。8点拷完还是没拷完。打开的时候就已经,就一直

weixin_43766920的博客 4303

jvm基本结构介绍

类加载子系统作业类加载器子系统负责从文件系统或看网络中加载class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。

m0_65778338的博客 710

(P2)PALM软件的基本使用流程

上一篇介绍了PALM在Ubuntu系统上的下载安装及安装后的目录文件结构,这一篇以自带的案例介绍软件的基本操作流程。(请转至example_cbl项目) 输入 声明:官网均有各个变量的说明,以下代码来自软件自带案例 palm的最小输入文件是p3d文件,以下是example_cbl_p3d的详细说明。(文件语言格式Fortran,请自行先学习下语言的基本语法。笔者也是新学者,有非常多的问题,很多参数也不能准确的说出是什么意思,还请不吝赐教,谢谢!!!) !几点说明 !1、该运行文件基本由三大块组成:1)in

ysqzhatian的博客 3260

详细解读JVM(一)——JVM结构

写在前面: 你好,欢迎你的阅读! 我热爱技术,热爱分享,热爱生活, 我始终相信:技术是开源的,知识是共享的! 博客里面的内容大部分均为原创,是自己日常的学习记录和总结,便于自己在后面的时间里回顾,当然也是希望可以分享自己的知识。目前的内容几乎是基础知识和技术入门,如果你觉得还可以的话不妨关注一下,我们共同进步! 除了分享博客之外,也喜欢看书,写一点日常杂文和心情分享,如果你感兴趣,也可以...

在路上 1646

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2165

CTF密码学奇技淫巧:当Base64遇到ROT13与Atbash

本文深入解析CTF竞赛中Base64、ROT13与Atbash的复合编码技术,提供Python实现与CyberChef可视化处理方案,帮助选手掌握密码学题目的解题技巧。通过NewStarCTF2025实战案例,对比脚本化与可视化工具的优劣,提升Web安全竞赛中的编码处理能力。

weixin_29001683的博客 509

整理:JVM基本结构

名词解释: 字面量,符号引用,直接引用 字面量 百度百科解释: 在计算机科学中, 字面量(literal)是用于表达源代码中一个固定值的表示法(notation). 几乎所有计算机编程语言都具有对基本值的字面量表示, 诸如: 整数, 浮点数以及字符串; 而有很多也对布尔类型和字符类型的值也支持字面量表示; 还有一些甚至对枚举类型的元素以及像数组, 记录和对象等复合类型的值也支持字面量表示法. 很抽象, 举个例子就明白了. int i = 1; String s = "abc"; 把整数1赋值给int

qq_34705828的博客 2105

coze 怎么读取excel文件,使用循环,数据库完成LLM问答并存储

本文介绍了如何在Coze平台实现"Excel读取+循环处理+LLM问答+数据库存储"的工作流。主要分为三个步骤:1)使用代码节点解析Excel文件为问答对数组;2)通过循环节点遍历问答对,调用LLM节点生成回答;3)利用数据库节点将问答结果存储到Coze内置数据库中。文中提供了代码示例和节点配置说明,并强调了注意事项如Excel格式要求、LLM调用频率控制等。该工作流适用于批量构建知识库问答系统并持久化存储结果。

ZhangJiqun&191cm&85kg 1798

JVM8基础结构图理解

目录 1 理解DOS里面的java命令 2 JVM内存 2.1 JVM主要组成部分 2.2JVM内存(运行时数据区域) 2.2.1 虚拟机内存与本地内存区别 2.2.2JVM内存(运行时数据区域)中的JVM内存​ 2.2.3 程序计数器(Program Counter Register) 2.2.4虚拟机栈(JVM Stacks) 2.2.5 本地方法栈(Native Method Stacks) 2.2.6Java堆(Java Heap) 2.2.7 方法区(Method A....

上善若泪 3493

气象水文资料预处理:缺测数据插补延长等

简介气象水文资料预处理

WW、forever的博客 3773

使用CubeMX配置STM32H7的FreeRTOS

本文将介绍如何使用CubeMX配置STM32H7的FreeRTOS,并提供相应的源代码示例。通过使用CubeMX,你可以轻松地配置FreeRTOS和系统资源,并生成相应的初始化代码和配置文件。在"FreeRTOS"选项卡的"Tasks"部分,可以配置系统中的任务。首先,打开CubeMX软件。在"FreeRTOS"选项卡的"Resources"部分,你可以配置FreeRTOS使用的资源,例如,堆内存和信号量。例如,我们可以创建两个简单的任务,一个任务将在循环中切换LED的状态,另一个任务将通过串口打印消息。

JeeVue的博客 712

JVM基本结构

1.JVM 基本架构 2.区域作用 tips: *Jdk1.6及之前:有永久代,常量池1.6在方法区 *Jdk1.7:有永久代,但已经逐步“去永久代”,常量池1.7在堆 *Jdk1.8及之后:无永久代,常量池1.8在元空间 3.堆内存分代基本结构 新生成的对象首先放到年轻代Eden区,当Eden空间满了,触发Minor GC,存活下来的对象移动到Survivor From区,Surviv...

weixin_43840862的博客 461

【华为OD机试真题】18、喊7的次数重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。   编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当将要喊出来的数字是7的倍数或者数字本身含有7的话,不能把这个数字直接喊出来,而是要喊”过”。   假定玩这个游戏的N个人都没有失误地在正确的时机喊了”过”,当喊到数字K时,可以统计每个人喊”过”的次数。   现给定一个长度为N的数组,存储了打乱顺序的每个人喊”过”的次数,请把它还原成正确的顺序,即数组的第i个元素存储编号i的人喊

KJ.JK 4168

JVM基础知识(一)jvm内存结构

一. java内存组成介绍 堆内存: 用于分配所有类实例和数组的内存 非堆内存: 方法区、JVM内部处理或优化、类结构(常量池,字段,方法数据)、方法、构造方法 二. JVM内存区域模型 方法区(永久代、非堆) 用于存储虚拟机加载的类信息、常量、静态变量、以及在类中声明的各种方法和方法字段, 被各个线程共享1.1 用于存储虚拟机加载的类信息、常量、静态变量、以及在类中声明的各种方法和方法字段...

irich的博客 7898

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java JVM 零基础,详细讲解一(基础结构)。

JVM(Java Virtual Machine,Java 虚拟机)是一种用于计算设备的规范,它是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现。对于 Java 语言来说,JVM 是其运行的基础。Java 程序并不是直接在操作系统上运行,而是在 JVM 上运行。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序可以在不同的操作系统上实现 “一次编写,到处运行”。

weixin_70171141的博客 1642

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JVM基础篇一(内存结构)

一、运行时数据区 二、解析JVM运行时数据区 1.程序计数器(Program Counter Register) 作用: 特点: 2.虚拟机栈(Java Virtual Machine Stacks) 问题辨析 栈内存溢出 3.本地方法栈 4 .堆(Heap) 1.堆内存溢出(java.lang.OutOfMemoryEeror:Java heap space) 2.堆内存诊断 5.方法区(Method Area) 1方法区内存溢出(java.lang.OutOfMemoryEe.

weixin_57504000的博客 681

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java基础一(语法 JVM内存结构 重载)

1.dos命令 dir 查看当前目录的文件 cls 清屏 cd \ 回到根路径 ipconfig 查看ip地址 ipconfig /all 查看更详细的网络信息 这个详细信息中包括网卡 的物理地址,例如:70-8B-CD-A7-BA-25 这个物理地址具有全球唯一性,物理地址通常叫做MAC地址 怎么查看两台计算机是否可以通信? ping命令 语法格式: ping IP地址 ping 域名 ping www.baidu.com ping 61.135.168.121 (百度的IP地址) ping 61.13

qq_36697196的博客 415

JVM基础(一)—— 运行时内存结构

  JVM 在执行Java程序的过程中会把它所管理的物理内存划分成不同的内存区域,每一个区域都存放着不同的数据。每个区域也都有不同的用途,以及创建和销毁的时机,根据虚拟机规定,可以获得这样的 JVM 内存结构。 1  程序计数器   程序计数器(Program Counter Register)是一块比较小的内存区域,可以看作是当前线程所执行的字节码的行号指示器。就是用...

weixin_30586085的博客 179

JVM基础一| java se体系结构及jvm概述

Java SE体系架构 java se体系结构图 JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心,具体的下文会详细说明。JRE :英文名称(Java Runtime Environment),我们叫它:Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 J.

KevinBrain的博客 625

JVM基础知识(一)jvm内存结构_10

采用垃圾回收器GC统一进行内存管理, GC会在某些特定的时间点对所有分配的堆内内存进行扫描并回收, 这个过程会对java应用程序的性能造成一定影响, 还可能会产生Stop The World。class文件中存在非运行时常量池(编译阶段即已确定), JVM规范对class文件结构有严格规范, 必须符合此规范的class文件才会被JVM认可和装载。直接内存既不是虚拟机内存的一部分, 也不是java虚拟机规范定义的内存区域 (如jdk1.4新加入的NIO)当前线程所执行的字节码的行号指示器。

2401_87360873的博客 935

6.JVM基础-类文件结构(一)—— Class类文件结构

Java 源代码首先需要使用 Javac 编译器编译成 .class 文件,然后由 JVM 执行 .class 文件,从而程序开始运行。 JVM 只认识 .class 文件,它不关心是何种语言生成了 .class 文件,只要 .class 文件符合 JVM 的规范就能运行。目前已经有 JRuby、Jython、Scala 等语言能够在 JVM 上运行。它们有各自的语法规则,不过它们的编译器都能将...

Willson_L的博客 569

一、基础篇(JVM内存结构)

一.概念 JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 1)堆区: a.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) b.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 2)栈区: a.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定...

hq.zheng的博客 188
上一篇: 如何用jsp输出存在于oracle数据库Blob字段中的jpg图片
下一篇: 一个简单实用的数据库操作框架
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值