JVM详解:JVM的系统架构

计算机语言大致可以分为两类,一直是编译性语言,典型的如C++,他会先有编译器编译成可执行文件(操作系统可读,不同的操作系统需要编译成不同的可执行文件),而另一种则是翻译性语言,这种语言本身不被编译,而是由另一个已经被编译成可执行文件开启进程,在这个进程中对此计算机语言逐行的翻译执行,典型的如javaScript,其可以在node环境或浏览器环境(本质是都是v8引擎)下执行,这种语言通常都可以跨操作系统,因为操作系统的差异,其运行环境已经适应完了。

java相对特殊,其既需要编译,也需要翻译,大致过程是由java语言先编译成字节码文件,再由jvm充当翻译,来对字节码文件进行翻译执行,那么多此一举的好处是什么呢?

首先字节码本身是跨操作系统的,也就说在任何操作系统下,字节码都是一样的,所以编译成字节码对jvm的翻译工作不会造成负担,编译的过程本身能够处理掉很多无需在运行时执行的代码,比如类型检查,常量的创建等等(JVM也秉承着能在编译期处理,绝不再运行期处理的原则)。

1. JVM中的类型处理

JVM支持的数据类型可以分为原始类型引用类型,与Java语言本身一样。其中,引用类型包括整型(char 也算作整型)、浮点型、布尔类型以及 returnAddress 类型。那么,什么是 returnAddress 呢?

returnAddress 是一种特殊的类型,用于保存JVM内置指令的引用,或者可以理解为指向某个内存地址的指针。在方法调用过程中,JVM需要保存调用点的返回地址,returnAddress 就用于存储该信息,通常与堆栈操作密切相关。

JVM的设计理念是尽可能将编译期能解决的工作都交给编译器来完成。因此,类型检查类型区分这种可以在编译期间完成的事情,就是在编译阶段完成的,而不是在运行时动态执行的。例如,javac 编译器在编译Java源代码时就会根据类型生成相应的字节码。

字节码期间把类编译好不是应该的吗?不然JVM怎么知道是什么类型,换句话说JVM就不需要保存类型信息吗,不还是一样需要处理类信息吗?没错,JVM其实并不关心或者说不需要知道在运行时变量的具体类型。它只是一个翻译机器,根据字节码指令执行操作。就像操作系统运行可执行文件时,它并不关心程序的具体内容,而只按指令执行。

Boolean类型特别处理

尽管Java中有boolean类型,但JVM在内部对其的处理方式与其他基本类型不同。在JVM中,boolean类型通常被转换为 01 进行存储,boolean 数组则被转换为字节数组。


2. PC寄存器

PC寄存器(Program Counter Register)是JVM内部的重要组件,用于记录当前线程正在执行的字节码指令的位置。每个线程都有自己的PC寄存器。

  • PC寄存器的作用:它指向当前线程下一条将要执行的字节码指令。每当JVM执行字节码时,PC寄存器会自动更新,指向下一个指令。对于执行JVM内置指令时,PC寄存器会指向相应的内置指令。
  • 内置指令和系统调用:JVM内置的指令(例如,垃圾回收、同步操作等)类似于操作系统的内核函数。它们是公共资源,多个线程访问时需要进行同步控制,以确保安全执行。

JVM通过PC寄存器来控制每个线程的执行,就像操作系统通过CPU调度控制进程一样。在这种机制下,JVM能够有效避免Java程序对JVM本身的破坏,因为内置指令被严格保护。

多个Java程序(或服务)依赖于同一个JVM进程。当JVM崩溃时,所有运行在该JVM上的Java程序都会受到影响。因此,保护JVM不被非法操作是至关重要的。


3. JVM内存管理

JVM的内存管理涉及栈(Stack)和堆(Heap)两大区域,分别用于存储不同类型的数据。

3.1 栈(Stack)

每个线程的创建(java服务的主线程本质上就是jvm创建的一个翻译线程),都伴随着一个栈内存的创建,这个栈就是运行当前线程代码的内存区域,栈它的主要作用是存储局部变量和方法调用时的栈帧。那么什么是栈帧。

3.2 栈帧

当一个需要使用一个类的时候,jvm会将这个类加载进堆内存的方法区,单此时只会加载类的元数据信息,并不会将类的方法也一并加载进内存(内存中会保存类的方法的符号引用,不是真正的引用),每当类的方法被调用时,JVM会为该方法创建一个栈帧,并将栈帧放入线程的执行栈中执行。栈帧是方法执行的运行环境,其中包含了该方法的局部变量、操作数栈、常量池引用等信息。

局部变量的保存比较特殊,其并不是一个个游离在栈帧内存中,而是在编译期被保存在一个数组,并且将使用的常量变为常量的引用,存入数组,因为常量最终并不在栈帧中,而在常量池中,而原来使用局部变量的地方,都会变成数组及数组的索引。

3.3 方法区

在上文中,我们提到了方法区,方法区是堆的一部分,当一个类需要被使用时,其全部的类信息都会被加载进方法区中。常量也是类信息的一部分,所以常量池也在方法区中。常量池也很简单,就是保存常量的地方,在java被编译时,编译器会将java能够当作常量的部分都变为常量保存在一个常量区中,在加载类时其被加载进常量池保存,其中还包括一些符号引用,就不单独说了。

3.4 操作栈

任何一个方法的执行都会创建栈帧,而一个栈帧的创建也会伴随着一个操作栈的创建,操作栈是栈帧内的一个结构。它是存储方法执行中的临时数据(类似于CPU的寄存器)。在方法执行过程中,操作栈按需推送和弹出数据。它的存在使得栈帧内存的使用更加高效。局部变量的使用就是先将使用变量从数组中拿出,推入操作栈,再进行使用。

当A方法调用B方法,并接收其返回值时,如果B方法执行成功,并且返回值不需要被存在堆中,那么就会会被推入A方法的栈帧的操作数栈中,A方法继续执行。如果失败则执行异常逻辑,或直接报错。

3.5 堆(Heap)

堆是所有线程共享的内存区域。所有需要长期保存的内存数据,都将被放入堆中。

  • 堆内存是垃圾回收的主要区域。JVM会定期检查堆内存中的对象,回收那些不再被任何线程引用的对象。

与栈不同,堆内存中的数据具有较长的生命周期,可以在多个线程之间共享。

在某些情况下,栈帧会被转移到堆中。比如,当方法的返回值被另一个方法(或者栈帧)使用,并且该返回值的生命周期超过当前栈帧的生命周期时,JVM会将栈帧中的数据转移到堆中。这和JavaScript中的闭包机制基本一样,其中栈帧对应着js中的词法环境,局部变量不能被立即回收时,对应的词法环境(栈帧)会被保存下来供后续使用。

3.6 本地方法栈

在阅读java源码中,我们会发现一些方法并没有方法体,只有一个native,对于这些方法,实际上是C++或其他语言编写的,他们无法在正常的栈结构中执行,而是在jvm提供的本地方法栈中执行,这些方法也被称为本地方法。我们也可以编写自己的本地方法,在java中使用,不过这里主要讲jvm,就不讲如何编写本地方法了。本地方法栈也是堆内存的一部分

JVM的整体内存架构大概如下图所示:

在这里插入图片描述

3.7 垃圾回收

JVM的垃圾回收机制与JavaScript语言也及其类似,他是通过标记-清除的方式,来标记从根节点不可达的引用,而JavaScript是通过从根节点进行寻找不可以达引用进行回收,本质上都是清除不可达内存。

  • 标记阶段:JVM会从根节点(GC Root)开始,遍历所有可达的对象,标记所有存活的对象。
  • 清除阶段:JVM会回收未被标记的对象,释放内存。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

21. Drag-Drop拖放操作(二) - 文件、表格和树的拖放实现

本了继上节内容,讲述几种常用的拖放场景示例,包括文件、表格和树的拖放实现。 文件拖放 实现从系统目录拖放文件到App中。 自定义接收视图 自定义应用内部接收拖放的view视图类FileDragView,注册拖放类型,实现目标拖放协议NS…

力扣515:在每个树行中找最大值

给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,104]-231 < Node.val &l…

vivo 游戏中心包体积优化方案与实践

作者&#xff1a;来自 vivo 互联网大前端团队- Ke Jie 介绍 App 包体积优化的必要性&#xff0c;游戏中心 App 在实际优化过程中的有效措施&#xff0c;包括一些优化建议以及优化思路。 一、包体积优化的必要性 安装包大小与下载转化率的关系大致是成反比的&#xff0c;即安装…

数据库SQL——连接表达式(JOIN)图解

目录 一、基本概念 二、常见类型 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; 左连接&#xff08;LEFT JOIN 或 LEFT OUTER JOIN&#xff09;&#xff1a; 右连接&#xff08;RIGHT JOIN 或 RIGHT OUTER JOIN&#xff09;&#xff1a; 全连接&#xff08;FULL…

Sigrity SPEED2000 Power Ground Noise Simulation模式如何查看PDS系统的自阻抗操作指导

Sigrity SPEED2000 Power Ground Noise Simulation模式如何查看PDS系统的自阻抗操作指导 Sigrity Power SI Power Ground Noise Simulation模式可以用于PDS系统自阻抗分析,以下图为例 2D视图

uni-app移动端与PC端兼容预览PDF文件

过程遇到的问题 1、如果用的是最新的版本的pdfjs的话&#xff0c;就会报Promise.withResolvers 不是一个方法的错误&#xff0c;原因是Promise.withResolvers是ES15新特性&#xff0c;想了解可参考链接&#xff0c;这里的解决方案是将插件里的涉及到Promise.withResolvers的地…

「Py」Python基础篇 之 Python都可以做哪些自动化?

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「Py」Python程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…

[ 网络安全介绍 5 ] 为什么要学习网络安全?

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战

目录 前言 一、原始的处理办法 1、使用Set方法来转换 2、使用构造方法转换 二、基于ModelMapper的动态转换 1、ModelMapper简介 2、集成到项目中 3、Shapefile属性读取 三、总结 前言 在现代软件开发中&#xff0c;尤其是在多层架构中&#xff0c;经常需要将数据从一个…

时间管理的三个痛点

时间管理方面&#xff0c;有三个痛点&#xff1a;不知道、不平衡、不安全。 很多人&#xff0c;忙了一天&#xff0c;感觉很累&#xff0c;但是不知道做了什么。他不知道&#xff0c;这一天工作了几个小时&#xff0c;做了哪些事&#xff0c;分别用了多少时间&#xff0c;只是…

封装el-menu

案例图 数据格式 commonMenu.vue <template><div class"commonMenuStyle"><el-sub-menu v-if"hasChildren" :index"item.MenuId"><template #title><el-icon><location /></el-icon><!-- isColl…

微服务day07

Elasticsearch 需要安装elasticsearch和Kibana&#xff0c;应为Kibana中有一套控制台可以方便的进行操作。 安装elasticsearch 使用docker命令安装&#xff1a; docker run -d \ --name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \ //设置他的运行内存空间&#x…

假期增设:福祉与负担并存,寻求生活经济平衡之道

近年来&#xff0c;关于春节与五一假期各自增设一日的议题持续引发广泛热议。这一额外假期的增设&#xff0c;究竟是民众福祉的增益&#xff0c;还是社会运行的额外负担&#xff0c;值得我们深入探讨。 从宏观经济视角审视&#xff0c;假期的延长产生了复杂而深远的影响。一方面…

结构体(c语言)

一.结构体 1.结构的基础知识 结构是一些值得集合&#xff0c;这些值称为成员变量&#xff0c;结构得每个成员可以是不同类型的变量 2.结构体的声明 struct tag//结构体名称{member-list;//成员变量}variable-list;//全局变量 例&#xff1a;描述一个学生 struct Stu {int a…

GIS空间分析案例---城市公共设施配置与服务评价

今天给大家带来新的GIS案例分析——“城市公共设施配置与服务评价” 数据准备 本案例提供的数据资料如下&#xff1a; 武汉城区.shp&#xff1a;武汉市三环城区范围面要素&#xff1b; 武汉城区&#xff08;去除水系&#xff09;.shp&#xff1a;去除水系后的研究区范围面要…

如何在算家云搭建Peach-9B-8k-Roleplay(文本生成)

一、Peach-9B-8k-Roleplay简介 Peach-9B-8k-Roleplay 是一种聊天大型语言模型&#xff0c;它是通过我们的数据合成方法创建的超过 100K 的对话中微调 01-ai/Yi-1.5-9B 模型而获得的。 也许是 34B 以下参数最好的 LLM。 二、模型搭建流程 1. 创建容器镜像 进入算家云平台的“…

软件工程概论项目(二),node.js的配置,npm的使用与vue的安装

上一章我们配置了git仓库&#xff0c;这一章我们来配置项目需要用的一些其他的环境。 放一个思维导图在这里&#xff0c;可以参考一下&#xff0c;很不全面&#xff0c;没有参考价值,反正我先这样写吧。 参考了这个nodejs的配置&#xff0c;写的很好&#xff1a;https://blog.c…

Android中桌面小部件的开发流程及常见问题和解决方案

在Android中&#xff0c;桌面小部件&#xff08;App Widget&#xff09;是应用程序可以在主屏幕或其他地方显示的一个可视化组件&#xff0c;提供简化信息和交互功能。Android桌面小部件的framework为开发者提供了接口&#xff0c;使得可以创建和更新小部件的内容。以下是Andro…

JAVA题目笔记(十五)经典算法题

一、按要求排序 要求&#xff1a;定义数组并存储一些女朋友对象&#xff0c;利用Arrays中的sort方法进行排序 属性包括&#xff1a;姓名&#xff0c;年龄&#xff0c;身高 按照年龄大小进行排序&#xff0c;年龄一样按照身高排序&#xff0c;身高一样按照姓名字母进行排序。…

【JVM】关于JVM的内部原理你到底了解多少(八股文面经知识点)

前言 &#x1f31f;&#x1f31f;本期讲解关于HTTPS的重要的加密原理~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…