JVM(1)

news2024/9/22 4:35:12

JVM简介

JVM是Java Virtual Machine的简称,意为Java虚拟机.

在java中,它归属于jre(java运行时环境), 而jre归属于jdk(java开发工具包).

虚拟机是指通过软件模拟的具有完整硬件功能的,运行在一个完全隔离的环境中的完整计算机系统.

常见的虚拟机:JVM, VMwave, VirtualBox.

 JVM和其他两个虚拟机的区别:

1.VMwave与VirtualBox通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器.

2.JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC的寄存器,其它的寄存器都进行了裁剪.

JVM是一台被定制过的现实不存在的计算机.

JVM运行流程

JVM是Java运行的基础,也是实现一次编译到处执行的关键,那么JVM是怎么执行的呢?

我们知道,java属于半编译半解释的语言.java这么设定,还是为了"跨平台",java不想重新编译,而是期望能够直接执行.

程序在执行之前先通过javac将java代码转换成字节码(.class文件),包含的就是java字节码(java自己搞得"CPU"指令). 然后再在具体的系统平台上执行jvm,把上述字节码转换成cpu能识别的机器指令(这其中,jvm就是一个"翻译官").

因此,我们编写和发布一个java程序,其实只需要发布.class即可,jvm拿到.class文件就知道如何转换. Linux/Windows上的jvm就可以把.class转换成linux/windows上能支持的可执行指令了.

不同平台的jvm是存在差异的.不是同一个!对上(给java层面提供的内容)是统一一致的.

Java内存的划分

JVM其实也是一个进程(任务管理器中看到的java进程),进程进行的过程中,要从操作系统中申请一些资源(内存就是其中的典型资源).

这些内存资源,就支撑了后续java程序的执行.比如,在java中定义变量(就会申请内存),内存其实就是从jvm系统这里申请的,jvm是"二房东". (jvm从系统中申请了一大块内存,这一大块内存,给java程序使用的时候,又会根据实际的使用用途分出不同区域("区域划分")).

划分后的布局就是JVM运行时数据区. JVM运行时数据区也叫内存布局,但需要注意的是它和Java内存模型(JMM)完全不同,属于完全两个不同的概念,由以下5大部分组成:

1.堆: 代码中new出来的对象,都是在堆里. 对象中持有的非静态成员变量,也是在堆里.(对于所有线程来说,只有一份)

2.栈: 分为本地方法栈和虚拟机栈. 本地方法栈是指在jvm内部,通过C++写的代码,调用关系和局部变量(一般不会关注本地方法栈,一般说到栈,默认指的是虚拟机栈).  虚拟机栈:记录了java代码的调用关系和java代码的局部变量.  (对于这两个栈来说,它们可以有n份,由于每个线程有自己的执行流,所以每个线程可以有只记得栈). 

3.程序计数器:这是个区域比较小的空间,专门用来存储下一跳要执行的java指令地址.(与栈相同,也是每个线程有自己的程序计数器)

4.元数据区(以前的java版本中,也叫"方法区",从1.8开始,就改了名字).

"元数据"是计算机中的一个常见术语,往往指的是一些辅助性质的,描述性质的属性.比如:

硬盘上不仅仅要存文件的数据本体,还需要存储一些辅助信息: 比如:文件的大小,文件的位置,文件的拥有者,文件的修改时间,文件的权限信息. 这些就统称为"元数据".

而元数据区类似:保存了类的信息,方法的信息,一个程序有哪些类,每个类中有哪些方法,每个方法里面都要包含哪些指令,都会记录在元数据区中.

我们平时写的java代码,if,while,for等逻辑运算,这些操作最终都会被转换成java字节码.(通过javac将代码转换成字节码),此时这些字节码在程序运行时就会被jvm加载到内存中,放到元数据区里面.此时,当前程序要如何执行,要做那些事情,就会按照上述元数据区里的字节码依次执行了.

一个非常经典的笔试题

class Test {
    private int n;
    private static int m;
}

main() {
    Test t = new Test();
}

上述代码中,t,n,m各自处于JVM内存中的哪个区域?

(1)t是一个局部变量(引用类型), t这个变量本身是在栈上.

(2)n是Test的成员变量,n作为成员变量,就是处于堆上的.

(3)我们知道,static修饰的变量/方法,称为"类属性/方法",非static的变量/方法,称为实例"属性/方法".上述带有static修饰的变量就是在类对象中(Test.class),也就是在元数据区中.

JVM把.class文件加载到内存之后,就会把这里的信息使用对象来标识,此时这样的对象就是类对象. 类对象里包含了一系列信息(包括不限于:类的名称,类继承于哪个类,实现了哪些接口.都有哪些属性(啥名字,啥类型,啥权限), 有哪些方法(啥名字,啥参数,啥权限)).

.java文件中涉及到的信息都会在.class中有所体现(注释是不会包含的).

总结:区分一个变量在哪个内存区域中,最主要就是看变量的"形态"(局部变量,成员变量,静态成员变量).

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

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

相关文章

什么是SSD型云服务器?

​  SSD云服务器是一种使用固态硬盘代替传统HDD进行存储的虚拟机。SDD 使用闪存单元来存储数据,与云计算技术相结合,形成强大且高效的存储解决方案,可以随时随地访问。 SSD云服务器如何工作? SSD云服务器是利用虚拟化和云计算技术创建的。…

抖音数据抓取工具|视频内容提取软件

引言部分: 介绍针对抖音视频下载需求开发的强大工具突出解决用户获取抖音视频繁琐问题的初衷 工具功能介绍: 详细描述工具功能,包括关键词搜索、自动批量抓取、选择性批量下载等提及基于C#开发的优势以及支持通过分享链接进行单个视频抓取…

eureka 简介和基本使用

Eureka 是Netflix开发的服务发现框架,是Spring Cloud微服务架构中的一部分。它主要用于微服务架构中的服务注册与发现。Eureka由两部分组成:Eureka Server 和 Eureka Client。获取更详细的信息可以访问官网,如下图: Eureka Server…

使用uniapp实现小程序获取wifi并连接

一、背景 因业务需求,需要在小程序实现发现wifi和连接wifi。但由于Andriod和IOS有差异,所以实现起来有所区别。 先看官方文档 https://developers.weixin.qq.com/miniprogram/dev/framework/device/wifi.html 把连接基础流程了解后,发现二者…

EasyRecovery2024高级完整个人版免费下载使用

该软件的高级功能和功能选项主要包括以下几个方面: 恢复删除的磁盘分区:EasyRecovery能够快速扫描磁盘,寻找并恢复删除的磁盘分区,无需检索完整磁盘扇区。支持主流的MBR和GPT分区类型,实现安全可靠的分区恢复。恢复格…

pythonJax小记(五):python: 使用Jax深度图像(正交投影和透视投影之间的转换)(持续更新,评论区可以补充)

python: 使用Jax深度图像(正交投影和透视投影之间的转换) 前言问题描述1. 透视投影2. 正交投影 直接上代码解释1. compute_projection_parameters 函数a. 参数解释b. 函数计算 2. ortho_to_persp 函数a. 计算投影参数:b. 生成像素坐标网格&am…

《Python 语音转换简易速速上手小册》第10章 未来趋势和发展方向(2024 最新版)

文章目录 10.1 语音技术的未来展望10.1.1 基础知识10.1.2 主要案例:语音驱动的虚拟助理案例介绍案例 Demo案例分析10.1.3 扩展案例 1:情感敏感的客服机器人案例介绍案例 Demo案例分析10.1.4 扩展案例 2:多模态智能会议系统案例介绍案例 Demo

Linux-用户和权限(黑马学习笔记)

认识root用户 root用户(超级管理员) 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 ● 在Linux系统中,拥有最大权限的账户名为:root(超级管理员) ● 而在前期,我们一直…

SpringBoot 3 新特性

目录 1. GraalVM2. 支持虚拟线程3. HTTP Interface 1. GraalVM 使用GraalVM将SpringBoot应用程序编译成本地可执行的镜像文件,可以显著提升启动速度、峰值性能以及减少内存应用。传统的应用都是编译成字节码,然后通过JVM解释并最终编译成机器码来运行&a…

报错:org.springframework.jdbc.BadSqlGrammarException:

//报错 2024-02-24 19:44:10.814 ERROR 6184 --- [nio-9090-exec-5] c.e.exception.GlobalExceptionHandler : 异常信息: org.springframework.jdbc.BadSqlGrammarException: GPT: 根据异常信息,这是一个Spring框架抛出的BadSqlGrammar…

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了!!!金航标kinghelm(www.kinghelm.com.cn)总部位于中国深圳市,兼顾技术、成本、管理、效率和可持续发展。东莞塘厦实验室全电波暗室、网络分析…

NXP实战笔记(九):S32K3xx基于RTD-SDK在S32DS上配置 CRCIRQPower

目录 1、CRC概述 1.1、CRC配置 1.2、代码示例 2、INTCTRL 3、Power 1、CRC概述 硬件CRC产生16或者32bit的,S32K3提供了可编程多项式与其他参数需求。 CRC图示如下 1.1、CRC配置 暂时DMA不怎么会用,所以没有启用DMA CRC的选择 这点需要十分注意&…

芯科科技与Arduino携手推动Matter普及化

双方的合作可助力开发人员在两分钟内将新开发板配置入网 致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)日前宣布,公司与开源硬件和软件领域的…

使用Lombok @Data 出现java: 找不到符号 的问题

第一种&#xff1a;pom依赖最好如下方式 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version><scope>compile</scope> </dependency>第二种&#xff1…

Unity Shader ASE基础效果思路与代码(二):边缘光、扰动火焰

Unity Shader ASE基础效果思路与代码(二)&#xff1a;边缘光、扰动火焰 文章目录 Unity Shader ASE基础效果思路与代码(二)&#xff1a;边缘光、扰动火焰边缘光效果展示&#xff1a;代码与思路&#xff1a; 扰动火焰效果展示&#xff1a;代码与思路&#xff1a; 边缘光 效果展…

力扣随笔之颜色分类(中等75)

思路&#xff1a;定义两个指针划分left&#xff0c;right划分三个区域left左边是红色区域&#xff0c;right右边是蓝色区域&#xff0c;left和right之间是白色区域&#xff1b;定义一个遍历指针遍历整个数组&#xff0c;遇到红色与left所指位置数字交换&#xff0c;并将left自加…

【雷达指标】MTI/MTD性能

目录 一、MTI/MTD性能的指标描述1.1 杂波衰减和对消比1.2 改善因子1.3 杂波中的可见度 二、MATLAB仿真参考文献 雷达通常使用MTI/MTD来进行杂波抑制&#xff0c;采用杂波衰减、对消比、改善因子、杂波中的可见度来描述其性能。 一、MTI/MTD性能的指标描述 1.1 杂波衰减和对消比…

C#学习总结

1、访问权限 方法默认访问修饰符&#xff1a;private 类默认访问修饰符&#xff1a;internal 类的成员默认访问修饰符&#xff1a;private 2、UserControl的使用 首先添加用户控件 使用时一种是通过代码添加&#xff0c;一种是通过拖动组件到xaml中

前端导出下载文件后提示无法打开文件

问题 项目中的导出文件功能&#xff0c;导出下载后的文件打开提示如下&#xff1a; 原因 对返回的响应数据进行打印&#xff0c;发现响应数据为字符串格式&#xff0c;前期规划的后端返回数据应该 blob 对象的。后经排查后发现是请求头缺少了响应数据格式的配置&#xff0c;应…

数据同步MySQL -> Elasticsearch

大家好我是苏麟,今天聊聊数据同步 . 数据同步 一般情况下&#xff0c;如果做查询搜索功能&#xff0c;使用 ES 来模糊搜索&#xff0c;但是数据是存放在数据库 MySQL 里的&#xff0c;所以说我们需要把 MySQL 中的数据和 ES 进行同步&#xff0c;保证数据一致(以 MySQL 为主)…