JVM(1)

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.rhkb.cn/news/263355.html

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

相关文章

Spring Security学习(七)——父子AuthenticationManager(ProviderManager)

前言 《Spring Security学习(六)——配置多个Provider》有个很奇怪的现象,如果我们不添加DaoAuthenticationProvider到HttpSecurity中,似乎也能够达到类似的效果。那我们为什么要多此一举呢?从文章的效果来看确实是多…

AI:135-基于卷积神经网络的艺术品瑕疵检测与修复

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

Mybatis总结--传参二

#叫做占位符 Mybatis是封装的JDBC 增强版 内部还是用的jdbc 每遇到一个#号 这里就会变为?占位符 一个#{}就是对应一个问号 一个占位符 用这个对象执行sql语句没有sql注入的风险 八、多个参数-使用Param 当 Dao 接口方法有多个参数,需要通过名称使…

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

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

Element table 实现表格行、列拖拽功能

安装包 npm install sortablejs --save <template><div class"draggable" style"padding: 20px"><el-table row-key"id" :data"tableData" style"width: 100%" border><el-table-columnv-for"(it…

趣学贝叶斯统计:贝叶斯定理和乐高积木

利用贝叶斯定理&#xff0c;可以将条件概率倒置。知道P(B|A)&#xff0c;就可以求出P(A|B)。例如&#xff0c;知道感冒时你打喷嚏的概率&#xff0c;就可以倒过来判断打喷嚏时你感冒的概率。这样&#xff0c;我们就用数据更新了自己对世界的信念。 目录 1. 运用乐高2. 通过数学…

SpringBoot和SpringCloud的区别,使用微服务的好处和缺点

SpringBoot是一个用于快速开发单个Spring应用程序的框架&#xff0c;通过提供默认配置和约定大于配置的方式&#xff0c;快速搭建基于Spring的应用。让程序员更专注于业务逻辑的编写&#xff0c;不需要过多关注配置细节。可以看成是一种快速搭建房子的工具包&#xff0c;不用从…

C语言:指针的进阶讲解

目录 1. 二级指针 1.1 二级指针是什么&#xff1f; 1.2 二级指针的作用 2. 一维数组和二维数组的本质 3. 指针数组 4. 数组指针 5. 函数指针 6. typedef的使用 7. 函数指针数组 7.1 转移表 1. 二级指针 如果了解了一级指针&#xff0c;那二级指针也是可以很好的理解…

【安卓逆向】app防止截屏分析与去除

本次分析的app name为&#xff1a;5paH5qGI54uX 这款应用打开之后里面的内容是不允许截图的&#xff0c;防止截图分析&#xff1a;Android应用防止截屏_landroid/view/window;->setflags 0x2000-CSDN博客 App防止恶意截屏功能的方法&#xff1a;iOS、Android和鸿蒙系统的实…

红日靶场3

靶场链接&#xff1a;漏洞详情 在虚拟机的网络编辑器中添加两个仅主机网卡 信息搜集 端口扫描 外网机处于网端192.168.1.0/24中&#xff0c;扫描外网IP端口&#xff0c;开放了80 22 3306端口 80端口http服务&#xff0c;可以尝试登录网页 3306端口mysql服务&#xff0c;可…

7-liunx服务器规范

目录 概况liunx日志liunx系统日志syslog函数openlog 可以改变syslog默认输出方式 &#xff0c;进一步结构化 用户信息进程间的关系会话ps命令查看进程关系 系统资源限制改变工作目录和根目录服务器程序后台话 概况 liunx服务器上有很多细节需要注意 &#xff0c;这些细节很重要…

nodejs+vue+ElementUi废品废弃资源回收系统

系统主要是以后台管理员管理为主。管理员需要先登录系统然后才可以使用本系统&#xff0c;管理员可以对系统用户管理、用户信息管理、回收站点管理、站点分类管理、站点分类管理、留言板管理、系统管理进行添加、查询、修改、删除&#xff0c;以保障废弃资源回收系统系统的正常…

瑞_23种设计模式_装饰者模式

文章目录 1 装饰者模式&#xff08;Decorator Pattern&#xff09;1.1 介绍1.2 概述1.3 装饰者模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析5 总结5.1 装饰者模式的优缺点5.2 装饰者模式的使用场景5.3 装饰者模式 VS 代理模式 &#x…

创作纪念日:记录我的成长与收获

机缘 一开始是在我深入学习前端知识的Vue.js框架遇到了一个问题&#xff0c;怎么都解决不了&#xff0c;心烦意乱地来csdn上找解决方法。开心的是真被我找到了&#xff0c;真的很感恩&#xff0c;也意识到在这个平台上分享自己的经验是多么有意义的事情&#xff0c;可能随便的…

Python爬虫-付费代理推荐和使用

付费代理的使用 相对免费代理来说&#xff0c;付费代理的稳定性更高。本节将介绍爬虫付费代理的相关使用过程。 1. 付费代理分类 付费代理分为两类&#xff1a; 一类提供接口获取海量代理&#xff0c;按天或者按量收费&#xff0c;如讯代理。 一类搭建了代理隧道&#xff0…

【前端素材】推荐优质后台管理系统Welly平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

WSL2配置Linux、Docker、VS Code、zsh、oh my zsh(附Docker开机自启设置)

0. 写在前面 本篇笔记来自于UP主麦兜搞IT的合集视频Windows10开发环境搭建中的部分内容 1. 安装WSL2 按照微软官方文档进行操作&#xff0c;当然也可以直接wsl --install 也可以按照 旧版手动安装的步骤 来进行操作 选择安装的是Ubuntu 20.04 LTS 注&#xff1a;WSL默认安装…

NATS学习笔记(一)

NATS是什么&#xff1f; NATS是一个开源的、轻量级、高性能的消息传递系统&#xff0c;它基于发布/订阅模式&#xff0c;由Apcera公司开发和维护。 NATS的功能 发布/订阅&#xff1a;NATS的核心是一个发布/订阅消息传递系统&#xff0c;允许消息生产者发布消息到特定的主题…

如何使用ArcGIS Pro生成等高线

无论在制图还是规划中&#xff0c;经常会使用到等高线&#xff0c;大多数情况下&#xff0c;从网上获取的高程数据都是DEM文件&#xff0c;我们可以通过ArcGIS Pro来生成等高线&#xff0c;这里为大家介绍一下生成方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的…

解析OOM的三大场景,原因及实战解决方案

目录 一、什么是OOM 二、堆内存溢出&#xff08;Heap OOM&#xff09; 三、方法区内存溢出&#xff08;Metaspace OOM&#xff09; 四、栈内存溢出&#xff08;Stack OOM&#xff09; 一、什么是OOM OOM 是 Out Of Memory 的缩写&#xff0c;意思是内存耗尽。在计算机领域…