JVM内存模型(通俗易懂)

2023-11-11

1.什么是jvm?
(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。
(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。
(3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

2.jdk、jre、jvm是什么关系?
(1)JRE(Java Runtime Environment),也就是java平台。所有的java程序都要在JRE环境下才能运行。
(2)JDK(Java Development Kit),是开发者用来编译、调试程序用的开发包。JDK也是JAVA程序需要在JRE上运行。
(3)JVM(Java Virtual Machine),是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

3.JVM原理
(1)jvm是java的核心和基础,在java编译器和os平台之间的虚拟处理器,可在上面执行字节码程序。
(2)java编译器只要面向jvm,生成jvm能理解的字节码文件。java源文件经编译成字节码程序,通过jvm将每条指令翻译成不同的机器码
,通过特定平台运行。

4. JVM执行程序的过程

  1. 加载.class文件
  2. 管理并分配内存
  3. 执行垃圾收集
    JRE(java运行时环境)由JVM构造的java程序的运行环,也是Java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,
    因此他也有他自己的运行的生命周期,也有自己的代码和数据空间。
    JVM在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,
    提供一个完整的Java运行环境,因此也就虚拟计算机。

操作系统装入JVM是通过jdk中Java.exe来完成,
通过下面4步来完成JVM环境:

  1. 创建JVM装载环境和配置
  2. 装载JVM.dll
  3. 初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
  4. 调用JNIEnv实例装载并处理class类。

5. JVM的生命周期

  1. JVM实例对应了一个独立运行的java程序它是进程级别
    a) 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void
    main(String[] args)函数的class都可以作为JVM实例运行的起点
    b) 运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以表明自己创建的线程是守护线程
    c) 消亡。当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出
  2. JVM执行引擎实例则对应了属于用户运行程序的线程它是线程级别的

6、JVM内存模型

(1)java代码具体执行过程如下图,

(2)运行时数据区,即jvm内存结构图如下图

(3)运行时数据区存储了哪些数据?

a) 程序计数器(PC寄存器)

由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,

因此,为了能够使得每个线程都在线程切换后能够恢复在切 换 之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,

否则就会影响到程序的正常执行次序。因此,可以这么说,程序计数器是每个线程所私有的。由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,

因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。

b) java栈

Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)操作数栈(Operand Stack)

指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用(Reference to runtime constant pool)、

**方法返回地址(Return Address)**和一些额外的附加信息。当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。

c)本地方法栈

本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的

d)堆

Java中的堆是用来存储对象本身的以及数组(数组引用是存放在Java栈中的)。堆是被所有线程共享的,在JVM中只有一个堆。

e)方法区

与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,

对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

7、JVM内存溢出的情况

a) 程序计数器(Program Counter Register)

每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。该内存区域是唯一一个在Java虚拟机规范中没有规定任何OOM(内存溢出:OutOfMemoryError)情况的区域。

b)Java虚拟机栈(Java Virtual Machine Stacks)

在Java虚拟机规范中,对这个区域规定了两种异常情况:

1、如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

  2、如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

       这两种情况存在着一些互相重叠的地方:当栈空间无法继续分配时,到底是内存太小,还是已使用的栈空间太大,其本质上只是对同一件事情的两种描述而已。

在单线程的操作中,无论是由于栈帧太大,还是虚拟机栈空间太小,当栈空间无法分配时,虚拟机抛出的都是StackOverflowError异常,而不会得到OutOfMemoryError异常。

而在多线程环境下,则会抛出OutOfMemoryError异常。

c)堆Java Heap

Java Heap是Java虚拟机所管理的内存中最大的一块,它是所有线程共享的一块内存区域。几乎所有的对象实例和数组都在这类分配内存。Java Heap是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”。

  根据Java虚拟机规范的规定,Java堆可以处在物理上不连续的内存空间中,只要逻辑上是连续的即可。如果在堆中没有内存可分配时,并且堆也无法扩展时,将会抛出OutOfMemoryError异常。   

d)方法区域,又被称为“永久代”,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM内存模型(通俗易懂) 的相关文章

随机推荐

  • java String类(超详细,含常用方法、面试题,内存图,案例)

    String类 一 String类的特点 二 String 类的常见构造方法 三 String常见的面试题 1 字符串常量池 2 String s abc 与String s new String abc 区别 3 字符拼接 4 常量优化机
  • pgsql数据库存储过程中,批量操作数据

    82 数据库存储过程中 批量操作数据 DECLARE record row record 定义一个名为 record row 的记录类型变量 BEGIN FOR record row IN SELECT name age id card F
  • Python制作宝石消消乐小游戏

    开发工具 Python版本 3 6 4 相关模块 pygame模块 以及一些Python自带的模块 相关文件 关注公众号 Python学习指南 回复 消消乐 即可获取 环境搭建 安装Python并添加到环境变量 pip安装需要的相关模块即可
  • Unity简单几行代码让玩家水平移动更丝滑真实

    可以先来看看基础的移动代码 接收玩家的输入 然后赋予刚体速度 但是这种写法存在几个问题 下面一一纠正 首先 如果直接改变刚体的速度 那么可能会出现穿墙的问题 而且没有一种从速度0到缓慢加速的过程 那样较为机械且不真实 所以可以用物理模拟的方
  • Leetcode 448.找到所有数组中消失的数字

    448 找到所有数组中消失的数字 力扣 LeetCode 题目描述 给你一个含 n 个整数的数组 nums 其中 nums i 在区间 1 n 内 请你找出所有在 1 n 范围 但没有出现在 nums 中的数字 并以数组的形式返回结果 示例
  • openAI api 生产最佳实践

    生产最佳实践 本指南提供了一套全面的最佳实践 帮助您从原型过渡到生产 无论您是经验丰富的机器学习工程师还是最近的爱好者 本指南都应为您提供将平台成功投入生产环境所需的工具 从确保访问我们的API到设计能够处理高流量的健壮架构 使用本指南可帮
  • Python-matplotlib画图(莫烦笔记)

    https www zhihu com collection 260736383 lt 此处就不自己写了 看了遍 照着写了一边 作者写的不错 不过有些有些偷懒 我只做了常见的功能 gt 作者 触摸壹缕阳光 链接 https zhuanlan
  • 如何创建你的第一个西门子200PLC程序

    更多关于西门子S7 200PLC内容请查看 西门子200系列PLC学习课程大纲 创建西门子200PLC程序分五步 1 打开Micro WIN软件 2 新建工程 3 打开程序编辑器 4 输入程序指令 5 保存程序 我们以下图程序为例讲解西门子
  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 作者 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 文章目录 0x00 前言简述 0x01 超链接标签元素 a 标签 0x02 框架标签元素 iframe 标签
  • Android性能优化 _ 把构建布局用时缩短 20 倍(下),轻松拿下offer

    scaleType ImageView ScaleType FIT XY setImageResource R drawable user portrait gender female also addView it also addVie
  • Spring Boot、Dubbo项目Mock测试踩坑与总结

    本文是对Spring Boot Dubbo项目进行Mock测试的总结与踩坑实录 搜索了一圈 居然没发现类似的文章 莫非用Dubbo的朋友们都不Mock测试 或者有其他的办法测试吗 简单总结了一下 希望对大家能有一定参考意义 如果有更好的测试
  • 小影服务器维修,轩辕传奇2月27日所有服务器停服更新公告

    尊敬的轩辕勇士们 我们计划将于2月27日上午9 00 11 00期间对所有服务器进行停服更新 在更新期间 所有服务器的玩家将暂时无法进入游戏 停服更新结束后 所有服务器的玩家将更新到最新版本 版本号为 1 11 107 2 同时 官网会在更
  • 菜鸟的刷题之路之二叉树

    成功不是终点 失败不是终结 勇气才是启程的第一步 作者 不能再留遗憾了 专栏 菜鸟的刷题之路 本文章主要内容 将有序数组转换为二叉搜索树 二叉搜索树中第K小的元素和叶子相似的树的详细题解 文章目录 将有序数组转换为二叉搜索树 题目要求 做题
  • spring boot 整合dubbo2.7.8

    由于dubbo2 7 8之前的版本有漏洞 项目需要升级至2 7 8 之前用的是阿里的dubbo 在版本切换上遇到过一些问题 特记录一下心得 首先讲下dubbo的版本 dubbo在2 6版本是阿里在管理和维护 后面交给了apache管理 2
  • Linux(一):Linux入门

    概述 Linux 是一套免费使用和自由传播的类 Unix 操作系统 Linux 英文解释为 Linux is not Unix 同时基于多用户 多任务 支持多线程和多 CPU 的操作系统 目前很多企业采用CentOS 本文后续涉及到linu
  • Make sure ‘SystemCfg‘ is registered using qRegisterMetaType

    最近在编写Qt代码的时候遇到标题上的问题 现象是 在收到一个xml字符串需要解析时 我放在线程里面处理 然后线程执行完成后将xml对应的结构体返回给主线程 在主线程的槽函数中始终接收不到 但是在子线程中emit函数是执行过的 在调试窗口中看
  • github push时提示Username for ‘https://github.com‘ 解决办法

    今天进行push的时候一直提醒我输入Username还有PassWord 还出现提示 remote Support for password authentication was removed on August 13 2021 起初我以
  • 剑指 Offer 43. 1~n 整数中 1 出现的次数

    目录 编辑 一 问题描述 二 例子 三 题目接口 四 题目解答 1 暴力解法 2 规律解法 总结 代码 一 问题描述 输入一个整数 n 求1 n这n个整数的十进制表示中1出现的次数 例如 输入12 1 12这些整数中包含1 的数字有1 10
  • 在linux shell中使用ftp命令来实现自动上传与下载

    前段时间有个需求 需要利用crontab定时往某个FTP上传文件 原以为linux中带的ftp命令只支持交互式的操作 没法在命令行下使用 所以后来打算利用PHP中提供的ftp命令来做 但是很不幸的发现ftp模块不是PHP的标准模块 还需要自
  • JVM内存模型(通俗易懂)

    1 什么是jvm 1 jvm是一种用于计算设备的规范 它是一个虚构出来的机器 是通过在实际的计算机上仿真模拟各种功能实现的 2 jvm包含一套字节码指令集 一组寄存器 一个栈 一个垃圾回收堆和一个存储方法域 3 JVM屏蔽了与具体操作系统平