JVM原理-jvm内存模型

article/2025/8/19 23:04:38

一、jvm内存模型

  • 结构图
    在这里插入图片描述

JVM包含两个子系统和两个组件

  • Class loader(类装载子系统)
    根据给定的全限定名类名(如:java.lang.Object)来装载class文件到
    Runtime data area运行时数据区中的method area方法区中
  • Execution engine(执行引擎)
    执行classes中的指令
  • Runtime data area(运行时数据区)
    我们常说的JVM的内存
  • Native Interface(本地接口)
    与native libraries交互,是其它编程语言交互的接口
  • 运行流程
    首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到
    内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能

1、运行时数据区

  • 结构图

在这里插入图片描述

  • 程序计数器(Program Counter Register)

当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;

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

每个方法在执行的同时都会在Java 虚拟机栈中创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息;

  • 本地方法栈(Native Method Stack)

与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;

  • Java 堆(Java Heap)

Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;

  • 方法区(Methed Area)

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

1.1、程序计数器(Program Counter Register)

  1. 程序计数器它是一个块较小的内存空间,保存了当前线程正在执行的字节码指令的地址
  2. 由于JVM的多线程是通过线程轮流切换来分配CPU执行时间的方式实现的,一个CPU只能处理一个线程的业务。线程切换后,程序计数器会记录当前线程执行的字节码指令的地址(行号),当线程再次分配到CPU时,通过程序计数器记录的行号找到上次字节码执行的地址继续执行。程序计数器是线程私有的,它是JVM中唯一没有规定OutOfMemoryError情况的区域。

1.2 、Java 虚拟机栈(Java Virtual Machine Stacks)

  1. JAVA虚拟机是线程私有的,生命周期和线程相同
  2. 虚拟机栈描述的是JAVA方法执行的内存模型,每个方法执行的时候,会创建一个栈帧(Stack Frame)来储存局部变量表、操作数栈、动态链接、方法出口等信息
  • 栈帧

栈帧是虚拟机的单位,一个方法一个栈帧,用来储存局部变量、操作数栈、动态链接、方法出口等信息
在这里插入图片描述

  • 局部变量表
    用来存储我们临时8个基本数据类型、对象引用地址、returnAddress类型(字节码的指令地址)

  • 操作数栈
    操作数栈就是用来操作的,例如代码中有个 i = 6*6,他在一开始的时候就会进行操作,读取我们的代码,进行计算后再放入局部变量表中去

  • 动态链接
    如方法中需要大量计算的,把计算的代码封装成一个add()方法,当前方法调用add()方法,跳转过去,add()就是动态链接

  • 方法出口
    出口正常的话就是return 不正常的话就是抛出异常落

1.3、JAVA堆(Java Heap)

  1. JAVA堆是虚拟机内存最大的一块区域,所有线程共享,虚拟机启动时就创建,用来储存对象实列
  2. 所有的对象实例和数组都在堆上分配
  3. 垃圾收集器管理的主要区域,被称为“GC堆”
  4. 从内存回收的角度来看,JAVA堆可分为新生代和老年代
  5. 从内存分配的角度来看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区
  6. 如果堆中没有内存可以完成实例分配,并且堆也无法再扩展时,将会抛OutOfMemoryError异常

1.4、方法区(Methed Area)

  1. 方法区是所有线程共享,用于储存已被JVM加载的类信息、常量、静态变量等信息,就是javac编译器编译后的代码数据
  2. 当方法区无法满足内存分配需求时,抛出OutOfMemoryError异常

1.5 、堆栈的区别

对比JVM堆JVM栈
物理地址堆的物理地址分配对对象是不连续的。因此性能慢些。在GC的时候也要考虑到不连续的分配,所以有各种算法。比如,标记-消除,复制,标记-压缩,分代(即新生代使用复制算法,老年代使用标记——压缩)栈使用的是数据结构中的栈,先进后出的原则,物理地址分配是连续的。所以性能快
内存分配堆的内存空间是不连续的,所以分配的内存是在运行期确认的,因此大小不固定。一般堆大小远远大于栈栈的内存空间是连续的,所以分配的内存大小要在编译期就确认,大小是固定的
存放内容堆存放的是对象的实例和数组。更关注的是数据的存储局部变量、操作数栈、动态链接、返回结果 ,更关注的是程序方法的执行
程序可见性堆是所有线程共享的,对于整个应用程序都是共享、可见的栈是线程私有的,仅对当前线程可见,生命周期和线程相同

2、Execution engine(执行引擎)

虚拟机核心的组件就是执行引擎,它负责执行虚拟机的字节码,字节码文件只是 JVM 的一套 指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的要JVM字节码执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行

3、类加载器(Class loader)

  • 定义
    根据指定全限定名称将class文件加载到JVM内存,转为Class对象

3.1、 四种类加载器

  • 启动类加载器(Bootstrap ClassLoader):用来加载java核心类库,无法被java程序直接引用
  • 扩展类加载器(extensions class loader):用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类
  • 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它
  • 用户自定义类加载器:通过继承 java.lang.ClassLoader类的方式实现

3.2、类装载的执行过程

  1. 加载:根据查找路径找到相应的 class 文件然后导入
  2. 验证:检查加载的 class 文件的正确性
  3. 准备:给类中的静态变量分配内存空间
  4. 解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,在直接引用直接指向内存中的地址
  5. 初始化:对静态变量和静态代码块执行初始化工作

3.3、双亲委派模型

在这里插入图片描述

  • 双亲委派模型工作流程

一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。

  • 作用

如果没有双亲委派,那么用户是不是可以自己定义一个java.lang.Object的同名类,java.lang.String的同名类,并把它放到ClassPath中,那么类之间的比较结果及类的唯一性将无法保证,因此,为什么需要双亲委派模型?防止内存中出现多份同样的字节码

  • 打破双亲委派机制

-打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和findClass方法

4、直接内存

  • 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致 OutOfMemoryError 异常出现
  • 可以理解为基于物理内存和Java虚拟机内存的中间内存

二、垃圾回收机制及算法

------JVM原理-垃圾回收机制及算法


http://chatgpt.dhexx.cn/article/doT21Yvt.shtml

相关文章

JVM原理-垃圾回收机制及算法

JVM原理-jvm内存模型 jvm内存模型 一、垃圾回收机制算法 1、 判断对象是否回收算法 垃圾收集器在做垃圾回收的时候,首先需要判定的就是哪些内存是需要被回收的,哪些对象是存活的,是不可以被回收的;哪些对象已经死掉了&#xf…

jvm面试原理

1、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组…

JVM原理和JVM内存的整理

JVM原理及JVM内存 JVM原理及JVM内存概念这么说1.JVM的基本过程2.JVM的中的“解释”原理,三个重要机制3.JVM的体系结构4.运行时数据区JVM垃圾回收 JVM原理及JVM内存 之前看了许多JVM原理的文章、写作的大牛们都讲的很透彻,但是私下觉得:写得详…

JVM原理和调优(读这一篇就够了)

前言 抛2个问题: 1、export JAVA_OPTS"-Xms256m -Xmx512m -Xss256m -XX:PermSize512m -XX:MaxPermSize1024m -Djava.rmi.server.hostname136.64.45.24 -Dcom.sun.management.jmxremote.port9315 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.manageme…

JVM工作原理

JVM的生命周期 (1)两个概念:JVM实例和JVM执行引擎实例 JVM实例对应了一个独立运行的java程序,它是进程级别的 JVM执行引擎实例则对应了属于用户运行程序的线程,它是线程级别的 (2)VM实例的诞生…

JVM原理与实战

JVM原理 类加载流程和内存分配栈帧操作一、JVM垃圾回收算法主动加载的几种方式?符号引用和直接引用1.1 什么是垃圾(Garbage Collection)回收?1.2 引用计数法(Reference Conting)1.3 标记清除法 *(Mark - Sweep)1.4 复制算法 *(Copying)1.4.1 复制算法在JVM中的应用1.…

jvm原理与性能调优

文章目录 一、JVM内存结构 1.运行时数据区 2.直接内存 二、JVM中的对象 1.对象的创建 2.对象的内存布局 3.对象的访问定位 三、垃圾回收算法和垃圾回收器 1. 如何判断对象是已死 2.分代回收理论 3.垃圾回收算法 4.垃圾收集器 四、JVM执行子系统 1.Class文件结构 2.类加载机制 3…

什么是JVM?深入解析JVM原理!

一、JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在J…

全面阐述JVM原理

一 JVM入门 1. 什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码…

JVM原理

JVM原理 一.jvm简介 JVM是Java Virual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组…

JVM原理详解

主题内容: 1.JVM 内存区域概览 2.堆区的空间分配是怎么样?堆溢出的演示 3.创建一个新对象内存是怎么分配的? 4.方法区 到 Metaspace 元空间 5.栈帧是什么?栈帧里有什么?怎么理解? 6.本地方法栈 7.程序…

JVM的运行原理

目录 1.概念 2.JVM运行机制 3.JVM执行流程 4.JVM运行时数据区 什么是线程私有? OOM(内存溢出) 4.1 堆:也叫运行时数据区,线程共享 4.2 方法区:线程共享 4.3 Java虚拟机栈:线程私有,描…

JVM的原理

JVM原理(一) 1、JVM总体结构图 2、JVM堆结构图以及分代 复制算法: 1、新生成的对象存放在Eden区和from区 2、当Eden区内存不够,虚拟机将发起一次MinorGC 3、GC进行时,Eden区中所有存活的对象都会被复制到to区 4、年龄阀值达到15的会被放到老年…

JAVA虚拟机JVM工作原理

提起JAVA,都知道它有个虚拟机,因此可以跨平台,一次编写,到处运行。但具体原理是咋样的?身为JAVA小白,岂可不知! 一、原理 二、结构 1、类加载器 2、执行引擎 3、运行时数据区域一、原理 JVM实现…

JVM 运行机制及其原理

最近出去面试,总被问到Java JVM相关的东西,什么JVM的内存模型、JVM的内存分配、内存回收、内存回收算法…搞得我一头雾水,早些年还看过一些,蹭着有时间给大家也给自己总结下JVM相关的知识。 JVM JVM是Java Virtual Machine&…

JVM原理-超详细总结

JVM概念 JVM是java的核心和基础在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经…

2022年iOS最新面试(底层基础)问题答案

文章目录 Runloop 1、RunLoop 的本质是什么?2、Runloop和线程是什么关系?3、Runloop的底层数据结构是什么样的?有几种 运行模式(mode)?每个运行模式下面的 CFRunloopMode 是哪些?他们分别是什么…

2019年面试必备:iOS 面试题大全(附答案)

这个栏目将持续更新–请iOS的小伙伴关注! 1、多线程的应用 2、GCD实现多个请求都完成之后返回结果 3、A、B两个int数组,得到A数组中B数组不包含的元素 4、事件传递链,页面上一个按钮,按钮和它的superView有一样的action,为什么只执行button的…

iOS 多线程面试题

没有比这里更全的了,看我就好了 面试官😃 :你了解进程吗?谈谈你对进程和线程的理解? 不谈进程,线程无从谈起。要了解什么是线程,我们先需要理解什么是线程。 秒懂百科 😃 以上百科&…

2020,300道高级iOS开发面试题(最新整理)

这个栏目将持续更新–请iOS的小伙伴关注! 一:知名大厂iOS开发面试题篇 1、腾讯—最新iOS面试题总结 2、百度—最新iOS面试题总结 3、头条—最新iOS面试题总结 4、阿里—最新iOS面试题总结 5、美团—最新iOS面试题总结 6、某大厂—最新iOS面试题总结 7、抖音–最新i…