浅谈JVM基本结构

news2025/1/15 12:48:48

目录

1.JVM概念

2.JVM基本结构

3.JVM存储数据案例


1.JVM概念

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVM类似于在操作系统之上运行的虚拟机软件:它能识别.class 字节码文件(java程序通过javac命令后编译产生的二进制代码),并且能够解析它的指令,最终调用操作系统上的函数,最终成功运行java文件。

总结来说就是JVM 是java程序和操作系统之间的桥梁,它的中间接口就是字节码。得益于JVM,他可以使得java程序可以跨平台在各种操作系统上运行。

jre文件中包含JVM环境。

2.JVM基本结构

JVM的基本结构如下图所示,java程序经过javac命令变成class file后进入jvm中进行处理:

(1)类加载器:

用于加载class文件。其可以分为 AppClassLoader(应用类加载器)、ExtClassLoader(拓展类加载器)、(根加载器,java程序无法获取)、虚拟机自带的加载器。

双亲委派机制: 即类加载器收到请求后,会向上委托给父类加载器,一直向上委托,启动加载器检查是否能加载当前类:能加载,结束;否则抛出异常,通知子类加载。

简单来说就是到最大的根加载器中有无该类,只有当根、拓展加载器都无该类,才会执行当前应用程序加载器。

通过双亲委派机制阻止代码去干涉核心类,守护了被信任的类库边界;将代码归入保护域,确定了代码可以执行哪些操作。

(2)本地方法栈和本地方法接口(JNI):

拓展java的使用,融合不同的编程语言使用。

凡是带了native关键字修饰的方法(该类方法没有方法体),说明java的作用范围达不到了,会进入本地方法栈,登记该方法。然后调用本地方法接口。

(3)程序计数器:

每一个线程私有的,指向方法区中的方法字节码(即线程的编号1,2,3…),占用内存空间小,几乎可以忽略不计。

(4)方法区:

被所有线程贡献,所有定义的东西(静态变量(static)、常量(final)、类信息(Class)、运行时的常量池)都存在方法区中

(5)栈:

要存放8大基本类型(局部变量,即方法中的变量)+对象的引用+实例的方法。

栈是一种数据结构,先进后出、后进先出。main方法执行后会进入java栈,然后调用的其他方法陆续进入。由于先进后出,所以main方法最后结束。即先入栈先调用,程序正在执行的方法一定在栈的顶部。

栈主管程序的运行,线程结束,栈内存即释放。

StackOverflowError:栈溢出,即方法相互递归调用不终止,不断将方法存入栈中,导致栈空间不足;还有就是启动的线程过多导致内存不足,导致的栈空间不足溢出。

(6)堆:

一个JVM只有一个堆内存,其大小是可以调整的。主要存放类、实例成员变量、数组。

可以分为新生区(Eden、survivor from 、survivor to)、老年区、永久区。

新对象会首先分配在 Eden 中(如果新对象过大,会直接分配在老年代中)。

进行轻GC时,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值(经过GC的次数)来决定去向。年龄达到阈值的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,"From"和"To"会交换他们的角色,也就是新的“To”就是上次GC前的"From",新的"From"就是上次GC前的"To"。

当幸存者区中对象经历了足够次数的GC后(-XX:MaxTenuringThreshold中设定的进入老年区的次数),会被移动到老年代。

3.JVM存储数据案例

下面通过代码,简单看看数据如何存储在 JVM中。

有以下两个类:

public class Student {
    private long id;
    private String name;
    private int age;
    
    public Student(long id,String name,int age){
        this.id = id;
        this.name = name;
        this.age = age;
    }
}
public class DataSave {
    public static void main(String[] args) {
        int num = 1;
        DataSave dataSave = new DataSave();
        dataSave.addOne(num);
        Student student = new Student(1,"test",18);
    }

    public void addOne(int i){
        i = i+1;
    }
}

上述定义消息都存于方法区中。

下面执行main程序:main线程入栈,开始执行。

(1)int num =1 ——> 局部变量,基础类型,引用和值都存在栈中。

(2)DataSave dataSave = new DataSave(); ——>新建对象dataSave ,对象dataSave 引用存在栈中,对象实例存在堆中。

(3)dataSave.addOne(num); ——> 方法 addOne()作为类的定义信息存于方法区中;调用addOne()方法,addOne()的栈帧(描述的是方法的一次执行瞬间,里面放的就是一些方法中的局部变量和方法的形参)入栈,开始执行。i为局部变量,引用和值存在栈中。当方法addOne()执行完成后,i就会从栈中消失。

(4)Student student = new Student(1,"test",18); ——>生成对象:student 为对象引用,存在栈中;对象new Student()存在堆中。

其中id, name, age为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中;Student对象新建时调用构造函数获得的id, name, age为成员变量(即1, test,18),它们存储在堆中存储的new Student()对象里面;构造函数执行完毕,id, name, age从栈中消失。

(5)执行结束,num变量,DataSave,Student引用将从栈中消失;main线程出栈。

 以上便是一次代码执行过程中数据在JVM中的存储过程。

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

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

相关文章

SpringBoot【开发实用篇】---- 整合第三方技术(任务、邮件)

SpringBoot【开发实用篇】---- 整合第三方技术(任务、邮件) 1. 任务QuartzTask 2. 邮件发送简单邮件发送多组件邮件(附件、复杂正文) 1. 任务 springboot整合第三方技术第二部分我们来说说任务系统,其实这里说的任务系…

mysql中的binlog

目录标题 前言binlog有两个常用的使用场景 常用的binlog日志操作命令查看所有binlog日志列表 【show master logs;】查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值。【show ma…

Net跨平台UI框架Avalonia入门-安装和使用

Avalonia UI是是Net的跨平台UI框架,支持 Windows、Linux、iOS 和 Android,与Net其他UI框架相比,主要是支持Linux。在国产化的需求下,对于C#开发的程序员,Avalonia适合用来开发Linux的桌面客户端。 Avalonia 安装 安装…

SpringBoot——日志

简单介绍: 在我们的程序开发中,日志的存在是必不可少的,日志可以帮助我们观察程序的运行过程,报错信息,各种警告,在我们调试程序的时候起到了非常大的作用。那么在SpringBoot中,我们在每次启动…

6.4.1最小生成树(Prim和kruskal算法)

生成树的概念: 连通图的生成树是包含图中全部顶点的一个极小连通子图 (边尽可能的少,但要保持连通) 若图中顶点数为n,则它的生成树中含有n-1条边。对于生成树而言,若看去他的一条边,则会变成…

软件测试太卷了,三个练手的软件测试实战项目偷偷提升自己(附全套视频跟源码)

项目一:12306抢票项目 项目测试目的 学会Selenium定位web元素的方法 熟练浏览器调试工具使用 项目主体步骤 1) 人工走一遍流程,对自动化的流程心中有数 2) 按步骤拆分,然后对每一个小步骤编写自动化脚本 3&#xf…

1.8G专网5G工业路由器助力智能电网-电力物联网方案

随着智能电网的普及与使用,电力终端的数量也日益剧增,由于间距较远、位置偏僻的特性,造成监管难、效率低、成本高等管理维护难题。 5G的价值也体现了由实验室走向垂直行业应用,赋予各行各业高效组网、高速用网的应用体验。智联物联…

PowerBi连接MySQL提示需安装组件才能使用,本人删去已经下载好的组件,再做一份详细教程。

问题 当我们用PowerBi连接Mysql时候,他突然提示我们需要安装组件。 解决 检查自己的MySQL版本 打开cmd运行框,输入命令mysql -uroot -p,再输入数据库密码 输入select version(); 我这里是8.0.16版本,记住自己的版本号 下载 mysql connector https:/…

在 EKS 上部署 HummerRisk

HummerRisk 是开源的云原生安全平台,以非侵入的方式解决云原生环境的安全和治理问题。核心能力包括混合云的安全治理和容器云安全检测。本文讲介绍如何在 EKS 上部署 HummerRisk。 EKS 简介 Amazon Elastic Kubernetes Service(Amazon EKS)…

python创建用户界面之PyQt5的使用

首先我们winR输入cmd 有两种方法下载PyQt5 方法一: pip install PyQt5 pip install PyQt5-tools 方法二: pip install PyQt5 -i https://pypi.douban.com/simple pip install PyQt5-tools -i https://pypi.douban.com/simple 下载好了之后我们打开 Pych…

idea热部署插件JRebel激活(强烈推荐,试试就离不开了)

JRebel可以实现在idea中热部署项目,修改后不用重启项目,让开发更丝滑。 JRebel需要激活才可以正常使用。 一、快速使用 1、idea安装JRebel插件。 File>Settings>Plugins 搜索JRebel 2、激活 1)填写激活信息 个人部署的注册服务器&…

加密解密软件VMProtect教程(七):主窗口之控制面板“详情”部分

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…

低代码与其拓荒,不如颠覆开发行业

目录 一、前言 二、低代码是一个值得信赖的“黑盒子” 粗略总结,开发者对低代码平台所见即所得设计器有两种反应: 三、人人都爱黑盒子 四、用“低代码平台”来开发是什么样的感受? 五、结论 一、前言 在科幻电影中,我们看到…

图片去底色,让您的产品瞬间脱颖而出

在现代社会中,图片是我们不可或缺的一部分,在各行业中都有着非常重要的作用。但是,有时候我们需要将某些图片中的背景去除,以便更好地突出主体,这时候,图片去底色就起到了非常重要的作用。 图片去底色的优…

论文、专利、文献检索及图像数据工具总结

一、文献检索 1、中文文献检索参考 中文文献途径网址用途1知网https://www.cnki.net/文献检索、下载2万方数据网https://www.wanfangdata.com.cn/文献检索、下载3维普期刊http://lib.cqvip.com/文献检索、下载4浙江图书馆https://www.zjlib.cn/#searchs_1_div文献检索、下载5…

一站式数据分析学习,让你成为一名合格的数据分析师

一站式数据分析学习,让你成为一名合格的数据分析师 随着数字化时代的到来,数字经济已然成为了新的发展潮流,数据的重要性越发显著。加上大数据、人工智能、云计算等数字技术的发展,让数字化时代的步伐迈得更快,目前已经…

为减少来自环境使用的无线传感器网络的传输次数而开发的方法(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 随着无线传感器网络(Wireless Sensor Network,WSN)的广泛应用,业界开始应用环境能量收集技术解决传感器节点的能量补充问题。而…

template和component自定义组件之间的区别

在小程序中自定义组件 component 方式和组件模板 template 2种方式实现页面组件化。 一、component自定义组件 1.概念 自定义组件是指可以被多个页面使用的组件,可以在小程序中多次复用。在开发中可以将一个页面中的代码和样式抽象出来,然后创建一个自定…

百汇BCR:如何参与外汇交易?哪个交易时间更好?

外汇市场时连续24小时运转的,也就是说随时都可以参与交易。那不同的交易时间进场是否会影响交易结果?哪个时间参与交易更好? 一、国际主要市场外汇交易时间(北京时间) 新西兰惠灵顿外汇市场:04&#xff1a…

基于微信小程序的新冠疫苗预约系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:微信小程序 && Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项…