我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【JVM】JVM内存模型详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【JVM】JVM内存模型详解

一、JVM是什么?

JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运行,这也是Java能够“一次编译,到处运行的”原因。

二、JVM内存模型图

在这里插入图片描述

三、JVM运行数据区详解

  1. JVM运行数据区分为虚拟机栈、本地方法栈、程序计数器、堆区、元空间(方法区)五部分。其中虚拟机栈、本地方法栈和程序计数器属于线程私有,而堆、元空间属于线程共享。
    在这里插入图片描述
  2. 虚拟机栈中存储方法、方法中的局部变量、以及运行时数据,本地方法栈和虚拟机栈类似,只不过本地方法中栈存储的是本地方法的一些数据信息,程序计数器用来表示程序代码的执行位置,每一线程工作时,都会开辟自己的虚拟机栈、本地方法栈、和程序计数器。
  3. 堆区,存储对象信息,以及数组,是所有线程共享区域、
  4. 元空间存储类加载的相关信息,以及静态变量、常量、运行时常量池等。

下面,以代码演示各个位置存储的信息:

//1.首先类加载器将类加载到原空间public class Application {    //main线程--> main的线程栈,也就是虚拟机栈    //2.执行main 方法,将main方法压入栈    public static void main(String[] args) throws Exception {        //3.load方法压入虚拟机栈        load();        System.in.read();        //保证程序不要退出     }        public static void load() {        //4.在堆区创建Config对象,同时在栈区存储对象的引用地址,指向堆区            Config config = new Config();        //5.将loadData()方法压入栈            config.loadData() ;        }    }
public class Config {    //1.静态变量存储在元空间    public static Manager mdnagerl = new Manager();    //2.实例变量/对象变量 和类对象一起存储在堆区    private int a;//3.loadData()存储在方法区    public String loadData() {        return "abc";    }}

在这里插入图片描述

四、JVM运行数据区各部分特点及作用


  1.   堆用来存放对象和数组,只要是堆中的对象,就可以被所有线程共享(静态变量、静态常量、字符串存储在堆中的老年代里)。Java7 版本中将永久代的静态变量和运行时常量池转移到堆中存放的。
      
      堆是 JVM 上最大的内存区域。垃圾回收操作的对象就是堆。
      
      堆空间一般是程序启动时就申请了,一般设置成可伸缩的。 随着对象的频繁创建,堆空间占用的越来越多,就需要不定期的对不再使用的对象进行回收,这就是GC。
      
       对于基本数据类型对象(如byte、short、int、long、float、double、char),在方法体内声明时,会直接分配在栈中,其它情况都会分配在堆中。
      
      对于普通对象来说,JVM 会首先在堆上创建对象,然后在其他地方使用它的引用。比如,把这个引用保存在虚拟机栈的局部变量表中。但是在开启了逃逸分析时,如果发现某个对象只会在方法内部使用,则可能会将该对象经过标量替换后也存在栈中。
      
    堆的几个重要参数:
      -Xms:堆的最小值(初始值,默认单位是:字节,要求是1024的整数倍);
      -Xmx:堆的最大值;
      -Xmn:新生代的大小;
      -XX:NewSize;新生代最小值(初始值);
      -XX:MaxNewSize:新生代最大值;

虚拟机栈
   Java虚拟机栈是当前线程在执行方法时存储所需的数据、指令、返回地址的一种栈结构(先进后出)。它的生命周期与线程保持一致。提一句:静态变量不入栈。
  
   每调用一个方法就会在栈里加入一个栈帧。调用的方法执行完了,对应的栈帧就会出栈。栈帧里分为4个区域,这4个区域就包含了执行Java方法时的全部内容。这个4个区域分别是:局部变量表、操作数栈、动态连接、方法出口。
在这里插入图片描述
虚拟机栈默认1M。 如果我们不断的往虚拟机栈中入栈帧,但是就是不出栈的话,那么这个虚拟机栈就会溢出。

程序计数器
   由于现在都是多线程运行,而一个CPU在同一时刻只能运行一个线程,多个线程只能交替运行。程序计数器的作用就是记录当前线程下一条要运行的指令,这样保证了线程在切换回来时能回到正确的位置继续开始执行
   程序计算器是唯一不会发生内存溢出的地方。如果正在执行的是Native 方法,由于不是JVM执行,则这个计数器值为空(Undefined)

方法区(元空间)
   方法区也是一个线程共享的内存区。
  
   方法区存储的内容有:类型信息(比如类全称、父类全称)、域信息(域名称、域修饰符private等)、方法信息(方法名称、方法修饰符、返回类型等)、字面量(字面量包括文本字符串、八种基本类型的值 、被声明为final的常量等)。
  
  假如两个线程都试图访问方法区中的同一个类信息,而这个类还没有加载进 JVM,那么此时就只允许一个线程去加载它,另一个线程必须等待。
  
  方法区是 JVM 对内存的“逻辑划分”,在 JDK1.7 及之前将方法区称为“永久代”,是因为在 HotSpot 虚拟机中,设计人员使用了永久代来实现了 JVM 规范的方法区。在 JDK1.8 及以后使用了元空间来实现方法区。
  
  Java8 使用元空间替代永久代,是为了融合 HotSpot JVM 与 JRockit VM ,因为 JRockit 没有永久代。
  
  元空间大小参数设置:
  jdk1.7 及以前:-XX:PermSize;-XX:MaxPermSize;
  jdk1.8 以后:-XX:MetaspaceSize; -XX:MaxMetaspaceSize ;如果不设置参数,则只受本机总内存的限制

来源地址:https://blog.csdn.net/qq_57549633/article/details/126495630

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【JVM】JVM内存模型详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【JVM】JVM内存模型(详细)

目录 一.JVM概述1.jvm简介2.jvm作用3.jvm的内存模型 二.类加载器1.类加载器的作用2.加载器的类型3.双亲委派机制的运行过程4.双亲委派机制优缺点5.为什么要破坏双亲委派机制6.破坏双亲委派机制的方式 三.
2023-08-16

深入理解JVM内存模型

JVM内存结构包括方法区、堆、栈、本地方法栈和程序计数器。不同的内存区域有不同的作用和管理方式,合理地使用和管理内存是编写高效、稳定的Java程序的重要方面。
JVM内存2024-11-30

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型。如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。
2023-08-30

Java JVM 内存模型包含哪些内容?(java jvm内存模型有哪些)

在Java编程中,Java虚拟机(JVM)的内存模型是一个非常重要的概念。它定义了Java程序在运行时内存的分配、使用和管理方式。理解JVM内存模型对于编写高效、稳定的Java程序至关重要。一、JVM内存模型的基本概念
Java JVM 内存模型包含哪些内容?(java jvm内存模型有哪些)
Javajvm2024-12-18

什么是JVM内存模型?

本篇文章带大家初步了解一下JVM内存模型,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。计算机内存模型在程序运行时,CPU通过访问主存获取数据,但随着CPU的快速发展,CPU访问速度越来越高,硬件无法满足CPU的条件下,大多内存加入了高速缓存
什么是JVM内存模型?
2016-08-29

JVM的执行程序详解+内存模型交互

jvm它是一个虚构出来的机器,但是它却又是通过在实际的计算机上仿真模拟各种功能来实现的。

java jvm内存模型有哪些

Java虚拟机(JVM)内存模型主要有以下几个部分:1. 堆内存(Heap):用于存储Java对象的实例以及数组。堆内存是所有线程共享的,是Java程序运行时的动态数据区。堆内存被划分为新生代(Young Generation)和老年代(O
2023-10-12

一文带你深入理解JVM内存模型

在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信。
JVM内存模型2024-12-14

面试必问,JVM内存模型扫盲

运行时常量池(Runtime Constant Pool)是方法区中的一部分,用于存储编译期间生成的各种字面量和符号引用。在Java程序运行时,JVM将编译期生成的class文件中的常量池内容读取到运行时常量池中。
JVM内存模型2024-11-30

如何进行JVM内存模型使用

这篇文章给大家介绍如何进行JVM内存模型使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。你对JVM内存模型是否熟悉,这里和大家分享一下,主要包括栈和堆两部分内容,Java栈是与每一个线程关联的,JVM在创建每一个线程
2023-06-17

技术探秘 | 图解 JVM 内存模型,超硬核!

熟悉 JVM 内存结构的同学,可能会很快看得出以上错误信息表示虚拟机堆内存空间不足,因此了解 JVM 内存结构对快速定位问题并解决问题有着非常重要的意义。今天我们一起来了解一下 JVM 内存结构。
JVM内存结构2024-11-29

jvm中java内存模型的示例分析

这篇文章主要介绍了jvm中java内存模型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、java内存模型和java内存结构有什么区别 1、java内存结构记得是
2023-06-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录