JVM内存模型及JAVA程序运行原理

news2024/9/20 12:33:50

文章目录

    • JVM简介
    • JVM的内存结构
      • 方法区
      • 程序计数器
    • JAVA程序在JVM内是如何执行的

JVM简介

  • JVM------Java Virtual Machine.JVM是Java平台的基础,与实际机器一样,它有自己的指令集(类似CPU通过指令操作程序运行),并在运行时操作不同的内存区域(JVM内存体系)。Java虚拟机位于操作系统之上(如下图所示),将通过JAVAC命令编译后的字节码加载到其内存区域,通过解释器将字节码翻译成CPU能识别的机器码行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
    在这里插入图片描述
  • JVM是运行在操作系统之上的,它与硬件没有直接交互。

JVM的内存结构

  • JAVA源代码文件通过编译后变成虚拟机可以识别的字节码,JAVA程序在执行时,会通过类加载器(见下图)把字节码加载到虚拟机的内存中(虚拟机的内存是一个逻辑概念,相当于是对主内存的一个抽象,实际上真实的数据还是存放在主存中),详见下图。
    在这里插入图片描述
  • Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。每个区域都有各自的作用。
  • 分析 JVM 内存结构,主要就是分析JVM 运行时数据存储区域。JVM 的运行时数据区主要包括:堆、栈、方法区、程序计数器等。而 JVM 的优化问题主要在线程共享的数据区中:堆、方法区。
    在这里插入图片描述
    类加载器
    在这里插入图片描述

方法区

  • 方法区又称非堆(non-heap),方法区用于存储已被虚拟机加载的类信息,常量、静态变量,即时编译后的代码等数据。方法区中最著名的就是Class对象Class对象中存放了类的元数据信息,包括:类的名称、类的加载器、类的方法、类的注解等
  • 当我们new一个新对象或者引用静态成员变量时,Java虚拟机(JVM)中的类加载器子系统会将对应Class对象加载到JVM中,然后JVM再根据这个类型信息相关的Class对象创建我们需要实例对象或者提供静态变量的引用值。注意,我们定义的一个类,无论创建多少个实例对象,在JVM中都只有一个Class对象与其对应,即:在内存中每个类有且只有一个相对应的Class对象,如图:
    在这里插入图片描述
  • 实际上所有的类都是在对其第一次使用时动态加载到JVM中的,当程序创建第一个对类的静态成员引用时,就会加载这个被使用的类(实际上加载的就是这个类的字节码文件)。注:使用new创建类的新实例对象也会被当作对类的静态成员的引用(构造函数也是类的静态方法)
  • 由此看来Java程序在它们开始运行之前并非被完全加载到内存的,其各个部分是按需加载,所以在使用该类时,类加载器首先会检查这个类的Class对象是否已被加载(类的实例对象创建时依据Class对象中类型信息完成的),如果还没有加载,默认的类加载器就会先根据类名查找.class文件(编译后Class对象被保存在同名的.class文件中),在这个类的字节码文件被加载时,它们必须接受相关验证,以确保其没有被破坏并且不包含不良Java代码(这是java的安全机制检测),完全没有问题后就会被动态加载到内存中,此时相当于Class对象也就被载入内存了(毕竟.class字节码文件保存的就是Class对象),同时也就可以根据这个类的Class对象来创建这个类的所有实例对象。

  • 所有创建出来的实例对象还有数组都是存放在堆内存中,堆是Java虚拟机所管理的内存中最大的一块存储区域,堆内存被所有线程共享。
  • 垃圾收集器就是根据GC算法,收集堆上对象所占用的内存空间,堆上又分为了新生代和老年代,针对不同的分代又会有对象的垃圾回收器和相应的回收算法

  • JVM 中的栈包括 Java 虚拟机栈和本地方法栈,两者的区别就是,Java 虚拟机栈为 JVM 执行 Java 方法服务,本地方法栈则为 JVM 使用到的 Native 方法服务。两者作用是极其相似的,本文主要介绍 Java 虚拟机栈,以下简称栈。
  • 栈属于线程私有的数据区域,与线程同时创建,总数与线程关联,代表Java方法执行的内存模型。每个方法执行时都会创建一个栈帧来存储方法的的局部变量表、操作数栈、动态链接方法、方法返回值、返回地址等信息。每个方法从调用值结束就对于一个栈桢在虚拟机栈中的入栈和出栈过程,栈帧中的局部变量表可以存放基本类型,也可以存放指向对象的引用,当在某个方法中new Object()时,会在当前方法栈帧中的局部变量表存放一个指向堆内存实例对象的引用,详见下图。
    在这里插入图片描述

程序计数器

  • 程序计数器是一块较小的内存空间,用来存储虚拟机下一条执行的字节码指令地址,和CPU中的程序计数器是一样的概念。

JAVA程序在JVM内是如何执行的

程序在JVM内部是怎么运行的,JAVA程序的执行过程简单来说包括:

  1. JAVA源代码编译成字节码;
  2. 字节码校验并把JAVA程序通过类加载器加载到JVM内存中;
  3. 在加载到内存后针对每个类创建Class对象并放到方法区;
  4. 字节码指令和数据初始化到内存中;
  5. 找到main方法,并创建栈帧;
  6. 初始化程序计数器内部的值为main方法的内存地址;
  7. 程序计数器不断递增,逐条执行JAVA字节码指令,把指令执行过程的数据存放到操作数栈中(入栈),执行完成后从操作数栈取出后放到局部变量表中,遇到创建对象,则在堆内存中分配一段连续的空间存储对象,栈内存中的局部变量表存放指向堆内存的引用;遇到方法调用则再创建一个栈帧,压到当前栈帧的上面。

在这里插入图片描述

你知道的越多,你不知道的越多。

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

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

相关文章

Temu、shopee、Lazada、Newegg、美客多销量增长黑科技!

在跨境电商的激烈竞争环境下,2023年伴随着疫情的解封,电商业务重新焕发生机。卖家们不应该只在一个平台投放所有资源,而应多元化地进行平台选择。实际上,许多小型电商平台如Wish、敦煌等也能带来大量业务,而且竞争压力…

如何保证API接口的安全性

API接口的安全性是非常重要的,以下是一些保证API接口安全性的措施: 用户认证、授权:接口的调用者必须提供有效的身份认证信息,包括用户名、密码、密钥等,以保证接口的调用者的身份有效性。同时,需要在接口的…

亚马逊云科技中国峰会:Amazon DeepRacer——因构建 而可见

文章目录 一、前言二、 亚马逊云科技中国峰会大会亮点三、Amazon DeepRacer 赛事火热开启四、Amazon DeepRacer 深度体验五、2023亚马逊云科技中国峰会——Amazon DeepRacerAmazon DeepRacer 中国峰会总决赛Girls in Tech Show高校联动,寻找未来“生力军”Amazon De…

电赛汇总(三):常用传感器电路模块设计

电赛汇总(三):常用传感器电路模块设计 这一章节主要详细记录各种常用的传感器的电子芯片型号、设计原理与思想,以便随时查看翻阅。这部分内容出自黄根春等学者著的《全国大学生电子设计竞赛教程》一书中,感兴趣的朋友可以购买翻阅。 文章目…

Debian12编译安装R软件

1.解压源码包 2.运行./configure --prefix/usr/local/R-4.3 报错,没有安装fortran编译器 3.运行./configure --prefix/usr/local/R-4.3 4.运行./configure --prefix/usr/local/R-4.3 5.运行./configure --prefix/usr/local/R-4.3 6.运行./configure --pref…

厦门大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 厦门大学(B)考研难度(☆☆☆☆☆) 厦门大学计算机考研主要招生学院有信息学院、人工智能研究院、医学院和电影学院。目前均已出拟录取名单。 厦门大学信息学院&#xff…

14. WebGPU 透视投影

在上一篇文章中,介绍了如何制作 3D ,但 3D 没有任何透视效果。它使用的是所谓的“正交”视图,它有其用途,但通常不是人们说“3D”时想要的。 现在,需要添加透视图。究竟什么是透视?基本特征就是离得越远的…

牛客网基础语法71~80题

牛客网基础语法71~80题😘😘😘 💫前言:今天是咱们第八期刷牛客网上的题目。 💫目标:可以掌握循环嵌套,可以采用一些数组来解决问题,对循环知识掌握熟练,对数学…

H5套壳微信小程序跳转H5以及配置服务器接口域名和业务域名

一、H5套壳微信小程序跳转H5 基本语法&#xff1a; <web-view src"https://你的域名"></web-view> 1. 其中&#xff0c;url必须在管理后台加进业务域名&#xff0c;并且是https开头的。 使用了web-view&#xff0c;页面将不能放置其他元素&#xff0c…

【深度学习】RepVGG解析和学习体会,结构重参数化的后的速度比较,代码实现

文章目录 前言0. Vgg1.RepVGG Block 详解 前言 论文名称&#xff1a;RepVGG: Making VGG-style ConvNets Great Again 论文下载地址&#xff1a;https://arxiv.org/abs/2101.03697 官方源码&#xff08;Pytorch实现&#xff09;&#xff1a;https://github.com/DingXiaoH/RepV…

linux动态监控进程懂了没?

这里写目录标题 top交互模式监控网络状态 top top与ps类似&#xff0c;他们都是用来显示正在执行的进程。 两者最大的不同之处就是top在执行一段时间可以更新正在运行的进程。 基本语法&#xff1a; top 选项 选项功能-d 秒数指定top指令每隔几秒更新&#xff0c;默认为3秒-i…

【新星计划·2023】Linux图形、字符界面介绍与区别

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将介绍图形界面与命令行界面以及它们的区别&#xff0c;登录方法。 目录 一、图形界面与命令行界面介绍 1、图形界面 2、命令行…

Oracle单机版升级(11.2.0.3升级到11.2.0.4)

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

人工神经网络ANN

文章目录 1. 人工神经网络简介1.1 生物神经网络1.2 人工神经网络 2. 人工神经网络原理2.1 ANN的基本构造2.1.1 神经元的结构模型2.1.2 网络拓扑结构 2.2 学习规则2.3 学习算法 3. 人工神经网络特点4. 人工神经网络的Python应用5. 源码仓库地址 1. 人工神经网络简介 1.1 生物神…

北通阿修罗2 Pro 多模板 连接Cemu 支持体感

需要使用体感的游戏基本上都是任天堂的游戏&#xff0c;如塞尔达。所以接下来针对CEMU模拟器介绍如何使用体感。 先看CEMU的手柄配置文档。 https://cemu.cfw.guide/controller-configuration.html 运动控制支持可能因手柄而异。任天堂Switch、Dualshock 4和DualSense手柄都支持…

Nik Color Efex 滤镜详解(5/5)

淡对比度 Pro Contrast 分析图像并为该图像创建特定的颜色&#xff0c;在保持画面细节的同时&#xff0c;实现更高的对比度。 校正色偏 Correct Color Cast 用于纠正色偏。 校正对比度 Correct Contrast 根据光影纠正对比度。 动态对比度 Dynamic Contrast 根据画面对象自动校…

【JY】浅析时程分析中的阻尼设置

&#xff08;非线性&#xff09;直接积分法、快速非线性分析&#xff08;FNA&#xff09;法等时程分析方法中的阻尼设置尤为重要&#xff0c;以SAP2000为例&#xff0c;进行抛砖引玉&#xff0c;各类软件做法也大同小异&#xff0c;可借鉴与学习。 模态阻尼 模态阻尼是用非耦合…

模拟电路系列分享-频率失真

目录 概要 整体架构流程 技术名词解释 技术细节 1.基本问题简介 2.线性失真 3.频率失真的危害 小结 概要 提示&#xff1a;这里可以添加技术概要 继续接着上一节的内容继续分享和学习&#xff0c; 整体架构流程 分三个部分&#xff0c;仔细的分享了失真方面的知识 技术名词…

团体程序设计天梯赛-练习集L1篇④

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

Spring Boot 日志的主要组件及其特点

Spring Boot 日志的主要组件及其特点 在开发应用程序时&#xff0c;日志是非常重要的一部分。它可以帮助我们了解应用程序的运行情况&#xff0c;发现并解决问题。在 Spring Boot 中&#xff0c;有许多不同的日志框架可供选择。本文将介绍 Spring Boot 日志的主要组件及其特点…