Java - JVM

文章目录

  • 一、JVM
      • 1. JVM的作用
      • 2. JVM、JRE、JDK的关系
      • 3. JVM的组成
      • 4. JVM工作流程
      • 5. 运行时方法区Runtime Data Area
  • 二、深入JVM内存模型(JMM)

一、JVM

1. JVM的作用

在这里插入图片描述
Java代码编译成java字节码后,运行在JVM中,只要针对不同的系统都开发JVM后,java就实现了跨平台。

2. JVM、JRE、JDK的关系

在这里插入图片描述

3. JVM的组成

  1. 类加载器(ClassLoader)
  2. 运行时数据区(Runtime Data Area)
  3. 执行引擎(Execution Engine)
  4. 本地库接口(Native Interface)

4. JVM工作流程

在这里插入图片描述
ClassLoader负责加载字节码文件,至于是否可以运行,由Execution Engine决定。
Execution Engine把指令和数据信息加载到内存中,并且负责把命令解释到操作系统,将JVM指令集翻译成操作系统指令集。
Execution Engine执行指令时,可能会调用一些本地的接口,这时就需要用到Native Interface,主要负责调用本地的接口给java程序使用,会在本地方法栈中记录对应的本地方法。

5. 运行时方法区Runtime Data Area

是JVM最重要的部分,运行时数据区的组成主要包含以下

  1. PC Register(程序计数器)
    程序计数器是程序控制流的指示器,循环,跳转,异常处理,线程的恢复等工作都需要依赖程序计数器去完成。程序计数器是线程私有的,它的生命周期是和线程保持一致的,我们知道,N 个核数的 CPU 在同一时刻,最多有 N个线程同时运行,在我们真实的使用过程中可能会创建很多线程,JVM 的多线程其实是通过线程轮流切换,分配处理器执行时间来实现的。既然涉及的线程切换,所以每条线程必须有一个独立的程序计数器。
  2. Stack (Java虚拟机栈)
    虚拟机栈,其描述的就是线程内存模型,也可以称作线程栈,也是每个线程私有的,生命周期与线程保持一致。在每个方法执行的时候,jvm 都会同步创建一个栈帧去存储局部变量表,操作数栈,动态连接,方法出口等信息。一个方法的生命周期就贯彻了一个栈帧从入栈到出栈的全部过程。
  3. Native Method Stack (本地方法栈)
    本地方法栈的概念很好理解,我们知道,java底层用了很多c的代码去实现,而其调用c端的方法上都会有native,代表本地方法服务,而本地方法栈就是为其服务的。
  4. Heap(堆)
    可以说是 JVM 中最大的一块儿内存区域了,它是所有线程共享的,不管你是初学者还是资深开发,多少都会听说过堆,毕竟几乎所有的对象都会在堆中分配。
  5. Method Area(方法区)
    方法区也是所有线程共享的区域,它存储了被 jvm 加载的类型信息、常量、静态变量等数据。运行时常量池就是方法区的一部分,编译期生成的各种字面量与符号引用就存储在其中。

在这里插入图片描述

💡 随着Java 7及以后版本的发布,虽然字符串常量池被移至堆内存,运行时常量池仍然是方法区(或Java 8中的元空间)的一部分。

💡 在Java 8之前,方法区的实现被称为永久代(PermGen),并且是堆的一部分。所以,当我们说“方法区”时,从概念上讲,它是JVM的一个独立逻辑部分,但在HotSpot JVM的具体实现中,直到Java 7为止,它是作为堆内存结构的一个部分(即永久代)来实现的,永久代是堆的一个物理部分。

💡从Java 8开始,HotSpot JVM去除了永久代的概念,引入了元空间(Metaspace),并且元空间是在本地内存中,而不是在堆内存中。因此,在Java 8及以后的版本中,方法区的实现从永久代变为了元空间,方法区(现在通常指的是元空间)与堆内存是完全分开的。

在这里插入图片描述

💡 元空间在本地内存中,只要内存足够,就不会出现OOM(Out of Memory)。元空间的概念仍然在JVM内存模型中。

在这里插入图片描述

二、深入JVM内存模型(JMM)

。。。待续

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

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

相关文章

保姆级讲解 Stable Diffusion

目录 本文讲解思路介绍 一、引入 二、Diffusion Model 三、原文的摘要和简介 四、Stable Diffusion 4.1、组成模块 4.2、感知压缩 4.3、条件控制 五、图解 Stable Diffusion 5.1、潜在空间的扩散 5.2、条件控制 5.3、采样 5.4、Diffusion Model 与 Stable Diffusion …

OnlyFans如何微信支付?订阅Onlyfans虚拟卡?OnlyFans订阅推荐指南教程

OnlyFans 订阅教程,手把手教你使用虚拟信用卡订阅 大家好,大家都在关心OnlyFans如何订阅怎么订阅,能不能用微信或者支付宝来订阅,首先微信是不行的,本文教大家如何在 Onlyfans 订阅和支付(虚拟信用卡&#…

【Tauri】(4):使用Tauri1.5版本+candle框架运行大模型,前后的搭建运行成功,整合前端项目,在应用中显示。

1,视频地址 关于tauri 框架 2,搭建rust 环境 # 设置服务器国内代理: export RUSTUP_DIST_SERVER"https://rsproxy.cn" export RUSTUP_UPDATE_ROOT"https://rsproxy.cn/rustup"# 设置环境变量 export RUSTUP_HOME/data/…

R语言基础的代码语法解译笔记

1、双冒号,即:“::” 要使用某个包里的函数,通常做法是先加载(library)包,再调用函数。最新加载的包的namespace会成为最新的enviroment,某些情况下可能影响函数的结果。而package name::funct…

【操作系统学习笔记】处理器管理1.2

【操作系统学习笔记】处理器管理1.2 参考书籍: 王道考研 视频地址: Bilibili 进程的状态与转换、进程的组织 状态 进程正在被创建时,它的状态是创建态,在这个阶段操作系统会为进程分配资源、初始化 PCB当进程创建完成后,便进入就绪态&…

java ~ word模板填充字符后输出到指定目录

word文件格式&#xff1a; jar包&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0</version></dependency>样例代码&#xff1a; // 封装参数集合Map<String, Ob…

CSS知识点

CSS基础 CSS选择器的优先级是怎样的&#xff1f;✨ CSS选择器的优先级是&#xff1a;内联 > ID选择器 > 类选择器 > 标签选择器 到具体的计算层⾯&#xff0c;优先级是由 A 、B、C、D 的值来决定的&#xff0c;其中它们的值计算规则如下&#xff1a; A 的值等于 1 的…

MySQL InnoDB存储引擎的优点有哪些?

MySQL InnoDB存储引擎的优点有哪些&#xff1f; 在MySQL数据库管理系统中&#xff0c;InnoDB是一种流行的存储引擎&#xff0c;提供了许多重要的功能和优势&#xff0c;使其成为许多应用的首选存储引擎。以下是使用InnoDB表的一些主要好处&#xff1a; 1. 崩溃恢复 如果服务…

报告,已成功揪出三害:英语、谷歌、ChatGPT

互联网风云变幻&#xff0c;最近网上的壮士们经过不懈努力&#xff0c;成功揪出作家莫言为一害&#xff0c;微博上的壮士们给出的理由是“如果莫言是个好人&#xff0c;会给他发诺贝尔文学奖&#xff1f;” 此风波的始作俑者来自某大V&#xff0c;他信誓旦旦要起诉莫言老师&…

Java实现从本地读取CSV文件数据

一、前言 最近项目中需要实现这样一个功能&#xff0c;就是从本地读取CSV文件&#xff0c;并以指定行作为标题行&#xff0c;指定行开始作为数据读取行&#xff0c;读取数据并返回给前端&#xff0c;下面具体说下是如何通过java实现。 二、如何实现&#xff1f; 1.引入相关mav…

【深度学习笔记】6_7 门控循环单元(GRU)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.7 门控循环单元&#xff08;GRU&#xff09; 上一节介绍了循环神经网络中的梯度计算方法。我们发现&#xff0c;当时间步数较大或者…

【Objective -- C】—— 自引用计数

【Objective -- C】—— 自引用计数 一. 内存管理/自引用计数1.自引用计数2.内存管理的思考方式自己生成的对象&#xff0c;自己持有非自己生成的对象&#xff0c;自己也能持有不再需要自己持有的对象时释放无法释放非自己持有的对象 3.alloc/retain/release/dealloc实现4. aut…

全链路Python环境迁移

全链路Python环境迁移 在当前的Python环境中&#xff0c;安装一些库以后&#xff0c;如果换了一套Python环境&#xff0c;难道再来一次不停的pip install&#xff1f;当然不是。 第一步&#xff0c;使用pip freeze&#xff08;冻结&#xff09;备份当前Python库的环境 pip f…

智慧公厕系统的运作过程

智慧公厕是一种新型的未来城市公共厕所&#xff0c;通过物联网、互联网、大数据、云计算、自动化控制等技术&#xff0c;实现公共厕所使用、运营、管理、养护的全过程全方位信息化。 那么&#xff0c;智慧公厕是如何运作的&#xff1f;智慧公厕的运作过程包括什么技术&#xf…

C++ : std::is_same和std::is_same_v

std::is_same和std::is_same_v是C标准库中的类型特性&#xff0c;用于在编译时检查两个类型是否相同。它们都属于<type_traits>头文件。这两个工具非常有用&#xff0c;特别是在模板编程和编译时类型检查中&#xff0c;它们可以帮助实现基于类型的条件编译和编译时决策。…

【Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令】

Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令 1、名词解释 1.1 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的用于并行计算的平台和编程模型。CUDA旨在利用NVIDIA GPU&#xff08;图形处理单元&#xff09;的强大计算…

【哈希】Leetcode 49、 字母异位词分组【中等】

字母异位词分组 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”…

windows/linux 自动登录ssh的脚本

1、如果是cmd环境下&#xff0c;则要编写vbs脚本来实现。 Set ws CreateObject("WScript.Shell") ws.run "ssh zyh192.168.2.183" wscript.sleep 1000 ws.sendkeys("123456") ws.sendkeys("{ENTER}") wscript.sleep 1000 ws.SendKey…

使用R语言进行聚类分析

一、样本数据描述 城镇居民人均消费支出水平包括食品、衣着、居住、生活用品及服务、通信、文教娱乐、医疗保健和其他用品及服务支出这八项指标来描述。表中列出了2016年我国分地区的城镇居民的人均消费支出的原始数据&#xff0c;数据来源于2017年的《中国统计年鉴》&#xf…

Publii和GitHub:搭建个人网站的完美组合

在数字时代&#xff0c;拥有一个个人网站已经非常普遍了&#xff0c;但是&#xff0c;很多人因为技术难题而望而却步。现在&#xff0c;有了Publii&#xff0c;这一切都将变得简单。Publii是一个静态网站生成器&#xff0c;它允许你在本地计算机上创建和管理内容&#xff0c;然…