iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >【JVM】JVM内存模型详解
  • 883
分享到

【JVM】JVM内存模型详解

jvmjava面试 2023-09-16 05:09:01 883人浏览 薄情痞子
摘要

一、JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收

一、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

--结束END--

本文标题: 【JVM】JVM内存模型详解

本文链接: https://www.lsjlt.com/news/409474.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 【JVM】JVM内存模型详解
    一、JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收...
    99+
    2023-09-16
    jvm java 面试
  • 【JVM】JVM内存模型(详细)
    目录 一.JVM概述1.jvm简介2.jvm作用3.jvm的内存模型 二.类加载器1.类加载器的作用2.加载器的类型3.双亲委派机制的运行过程4.双亲委派机制优缺点5.为什么要破坏双亲委派机制6.破坏双亲委派机制的方式 三....
    99+
    2023-08-16
    jvm java 面试
  • 详解JVM系列之内存模型
    目录1. 内存模型和运行时数据区2、思维导图和图例3、对象向JVM申请空间4、为什么需要Survivor区?5、为什么需要两个Survivor区?6、例子进行验证堆内...
    99+
    2022-11-12
  • Java 内存模型(JVM)
    目录前言一、什么是 Java 内存模型二、为什么需要 Java 内存模型三、顺序一致性内存模型四、Happens-Before 规则前言 在并发编程中,当多个线程同时访问同一个共享...
    99+
    2022-11-12
  • JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
    JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型。如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。...
    99+
    2023-08-30
    jvm GC 直接内存 jvm性能调优
  • 什么是JVM内存模型?
    本篇文章带大家初步了解一下JVM内存模型,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。计算机内存模型在程序运行时,CPU通过访问主存获取数据,但随着CPU的快速发展,CPU访问速度越来越高,硬件无法满足CPU的条件下,大...
    99+
    2016-08-29
    java教程 java JVM
  • JVM入门之JVM内存结构内容详解
    一、java代码编译执行过程 源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件) 类加载:通过ClassLoader及其子类来完成...
    99+
    2022-11-12
  • java jvm内存模型有哪些
    Java虚拟机(JVM)内存模型主要有以下几个部分:1. 堆内存(Heap):用于存储Java对象的实例以及数组。堆内存是所有线程共...
    99+
    2023-10-12
    java jvm
  • Java JVM内存区域详解
    目录程序计数器Java虚拟机栈方法/函数如何调用?堆总结原网页:JavaGuide JVM在执行Java程序过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本...
    99+
    2022-11-12
  • 一篇文章带你了解JVM内存模型
    目录1. JVM介绍 1.1 什么是JVM?1.2 JVM的优点 1.2.1 一次编写,到处运行。1.2.2 自动内存管理,垃圾回收机制。1.2.3 数组下标越界...
    99+
    2022-11-12
  • 如何进行JVM内存模型使用
    这篇文章给大家介绍如何进行JVM内存模型使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。你对JVM内存模型是否熟悉,这里和大家分享一下,主要包括栈和堆两部分内容,Java栈是与每一个线程关联的,JVM在创建每一个线程...
    99+
    2023-06-17
  • JVM内存参数配置详解
    首先我们知道:JVM发生内存错误的类型 1、堆内存泄漏:OutOfMemory:Java heap space 此种内存泄漏,增加内存,只能暂时解决问题,并不能根治问题。必须要优化代...
    99+
    2022-11-13
  • JVM内存模型/内存空间:运行时数据区
    目录JVM内存模型/内存空间① 程序计数器 (Program Counter Register)② Java虚拟机栈 (VM Stack)&n...
    99+
    2022-11-12
  • jvm中java内存模型的示例分析
    这篇文章主要介绍了jvm中java内存模型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、java内存模型和java内存结构有什么区别 1、java内存...
    99+
    2023-06-19
  • 华为技术专家讲解JVM内存模型(收藏)
    目录1 Program Counter Register (程序计数寄存器)1.1. 定义1.2. 作用1.3. 特点2. Java虚拟机栈(JVM Stack)2.1. 定义2.2...
    99+
    2022-11-12
  • JVM 运行时数据区与JMM 内存模型
    目录1. JVM 运行时数据区2. JMM 内存模型硬件内存模型JMM3. 可见行与 volatile 关键字1. JVM 运行时数据区 JVM运行时数据区可以分为元空间,堆,虚拟机...
    99+
    2022-11-13
    JVM 运行时数据区 JMM 内存模型
  • java内存模型jvm虚拟机简要分析
    目录主内存和工作内存内存间的交互操作原子性、可见性、有序性原子性可见性有序性主内存和工作内存 Java 内存模型规定了所有的变量都存储在主内存中, 每条线程有自己的工作内存...
    99+
    2022-11-12
  • JVM系列之内存模型的示例分析
    这篇文章主要介绍JVM系列之内存模型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 内存模型和运行时数据区这一章学习java虚拟机内存模型(Java Virtual machine menory mod...
    99+
    2023-06-15
  • JVM详解
    JVM 执行流程 程序在执行之前先要把java代码转换成字节码(class文件),JVM 首先需要把字节码通过一定的方式 **类加载器(ClassLoader) **把文件加载到内存中 **运行时数据区(Runtime Data Area)...
    99+
    2023-08-30
    jvm 开发语言 java 后端
  • java jvm内存模型的操作方法有哪些
    Java虚拟机(JVM)的内存模型操作方法主要有以下几种:1. 堆内存管理:Java堆是JVM管理的最大的一块内存区域,用于存储对象...
    99+
    2023-10-18
    java jvm
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作