JVM基本概念及内存管理模型

一、JVM基本概念

JVM(Java Virtual Machine,Java 虚拟机)是 Java 程序运行的核心组件。它负责将 Java 字节码转换为特定平台的机器指令,并提供内存管理、垃圾回收、安全性等功能。JVM 的主要功能包括以下:

  1. 加载和执行字节码:
    • 将 Java 源代码编译后的字节码(.class 文件)加载到内存中,并解释执行或即时编译(JIT)为机器指令。
  2. 内存管理:
    • 管理 Java 程序的内存分配和回收,包括堆、栈、方法区等内存区域。
  3. 垃圾回收:
    • 自动回收不再使用的对象,释放内存。
  4. 安全性:
    • 提供沙箱机制,限制 Java 程序的权限,防止恶意代码的执行。
  5. 多线程支持:
    • 提供线程管理和同步机制,支持多线程编程。
二、JVM的主要组成部分

JVM的主要组成部分包括类加载器、运行时数据区、执行引擎、本地方法接口、本地方法库等。
在这里插入图片描述

  1. 类加载器(Class Loader):
    • 作用:
      • 负责加载Java类文件,并将其转换成JVM内部的运行时数据结构;
    • 分类:
      • 启动类加载器(Bootstrap Class Loader):加载 JVM 核心类库(如 java.lang.*)。
      • 扩展类加载器(Extension Class Loader):加载扩展类库(如 javax.*)。
      • 应用程序类加载器(Application Class Loader):加载用户类路径(Classpath)下的类。
    • 双亲委派模型:
      • 类加载器在加载类时,首先委托父类加载器加载,只有在父类加载器无法加载时,才由自己加载。
  2. 运行时数据区(Runtime Data Areas):
    • JVM 的内存区域分为以下几个部分:
      • 堆(Heap):
        • 存储 Java 对象实例和数组。
        • 是垃圾回收的主要区域。
        • 分为新生代(Young Generation)和老年代(Old Generation)。
      • 栈(Stack):
        • 存储方法的局部变量、操作数栈、动态链接、方法出口等信息。
        • 每个线程都有一个独立的栈。
      • 方法区(Method Area):
        • 存储类的元数据信息,如类名、方法名、字段名、常量池等。
        • 在 JDK 8 之前,方法区的实现是永久代(PermGen);在 JDK 8 及之后,方法区的实现被元空间(Metaspace)取代。
      • 本地方法栈(Native Method Stack):
        • 为本地方法(Native Method)服务。
      • 程序计数器(Program Counter Register):
        • 记录当前线程执行的字节码指令地址。
  3. 执行引擎(Execution Engine):
    • 作用:
      • 负责解释执行Java字节码,并对程序进行优化;
    • 组成部分:
      • 解释器(Interpreter):逐行解释执行字节码。
      • 即时编译器(JIT Compiler):将热点代码(频繁执行的代码)编译为机器指令,提高执行效率。
      • 垃圾回收器(Garbage Collector):自动回收不再使用的对象。
  4. 本地方法接口(Native Method Interface, JNI):
    • 作用:
      • 提供 Java 代码调用本地方法(如 C/C++ 代码)的接口。
    • 使用场景:
      • 调用操作系统底层功能。
      • 调用已有的本地库。
  5. 本地方法库(Native Method Library):
    • 作用:
      • 包含本地方法的具体实现(如 C/C++ 代码)。
三、JVM 工作流程
3.1 JVM工作流程图:

在这里插入图片描述

3.2 JVM具体执行步骤:
  1. 类加载:
    • 类加载器将 .class 文件加载到内存中,并生成对应的 Class 对象。
  2. 字节码验证:
    • 验证字节码的合法性,确保其符合 JVM 规范。
  3. 内存分配:
    • 在堆中为对象分配内存。
  4. 字节码执行:
    • 执行引擎解释执行字节码,或通过 JIT 编译器将字节码编译为机器指令执行。
  5. 垃圾回收:
    • 垃圾回收器自动回收不再使用的对象,释放内存。
  6. 程序结束:
    • 当程序执行完毕或调用 System.exit() 时,JVM 退出。
3.3 类加载过程

当 JVM 加载一个类时,会解析类文件中的常量池表,并将其内容加载到 运行时常量池(Runtime Constant Pool) 中。以下是类加载的详细过程:

  1. 加载(Loading)
    • JVM 读取类文件,并将其二进制数据加载到内存中。
    • 在内存中生成一个代表该类的 Class 对象。
  2. 链接(Linking)
    链接过程分为三个步骤:
    • 验证(Verification):
      • 确保类文件的字节码是合法的,符合 JVM 规范。
    • 准备(Preparation):
      • 为类的静态变量分配内存,并设置默认初始值。
    • 解析(Resolution):
      • 将常量池表中的符号引用解析为直接引用。
      • 对于字符串字面量,JVM 会将其加载到字符串常量池中。
  3. 初始化(Initialization)
    • 执行类的静态初始化代码(如静态变量赋值、静态代码块)。
3.4 常量池的解析机制

在类加载的 解析(Resolution) 阶段,JVM 会处理常量池表中的字符串字面量,并将其加载到字符串常量池中。具体过程如下:

  1. 解析字符串字面量
    • 当 JVM 解析到一个字符串字面量(如 “hello”)时,会检查字符串常量池中是否已经存在该字符串。
      • 如果存在,则直接使用字符串常量池中的引用。
      • 如果不存在,则在字符串常量池中创建一个新的字符串对象,并将其引用添加到运行时常量池中。
  2. 运行时常量池的引用
    • 字符串常量池中的字符串对象会被运行时常量池引用。
    • 运行时常量池中的字符串字面量实际上是字符串常量池中字符串对象的引用。
四、JVM内存管理模型

JVM(Java Virtual Machine)的内存管理模型是 Java 程序运行的核心基础。它负责管理 Java 程序的内存分配、垃圾回收以及运行时数据的存储。JVM 的内存管理模型可以分为以下几个主要区域:

JDK1.7版本主要分为以下几个区域:
在这里插入图片描述

JDK1.8版本相对JDK1.7版本做了如下调整:
在这里插入图片描述

  1. 方法区的变化
    • JDK 1.7:
      • 方法区的实现是永久代(PermGen),是 JVM 内存的一部分。
      • 永久代的大小固定,容易导致 OutOfMemoryError: PermGen space 错误。
    • JDK 1.8:
      • 方法区的实现改为元空间(Metaspace),永久代被移除。
      • 元空间不属于 JVM 内存中,而是在本地内存中。
      • 元空间的大小默认不受限制(受限于系统内存)。
  2. 字符串常量池的变化
    • JDK 1.7:
      • 字符串常量池位于 永久代(PermGen) 中。
      • 永久代的大小固定,容易导致 OutOfMemoryError: PermGen space 错误。
      • 字符串常量池中存储的是字符串对象的引用。
    • JDK 1.8:
      • 字符串常量池被移动到堆内存(Heap) 中。
      • 字符串常量池中存储的是字符串对象的实例(String 对象)。
      • 当字符串常量池中的对象不再被引用时,垃圾回收器会将其回收。
  3. 静态变量的变化
    • JDK 1.7:
      • 静态变量(包括静态基本类型和静态对象引用)存储在 永久代(PermGen) 中。
      • 永久代的大小固定,容易导致 OutOfMemoryError: PermGen space 错误。
    • JDK 1.8:
      • 静态变量被移动到 堆内存(Heap) 中。
      • 静态变量与普通对象一样,由垃圾回收器管理。
  4. 运行时常量池的变化
    • JDK 1.7:
      • 运行时常量池位于 永久代(PermGen) 中。
      • 运行时常量池存储类文件中的常量(如字符串常量、类和接口的全限定名、字段和方法的名称和描述符等)。
      • 永久代的大小固定,容易导致 OutOfMemoryError: PermGen space 错误。
    • JDK 1.8:
      • 运行时常量池被移动到 元空间(Metaspace) 中。
      • 元空间的大小不受JVM内存限制(仅受限于系统内存),避免了永久代的内存溢出问题。
4.1 方法区(Method Area)
  • 作用:
    • 存储类的元数据信息,如类名、方法名、字段名、常量池等。
    • 在 JDK 8 之前,方法区的实现是永久代(PermGen);在 JDK 8 及之后,方法区的实现被元空间(Metaspace)取代。
  • 特点:
    • 线程共享。
    • 存储的数据包括:
      • 运行时常量池(Runtime Constant Pool)。
      • 类信息(Class Metadata)。
      • 静态变量(Static Variables)。
      • JIT 编译后的代码(Just-In-Time Compiled Code)。
4.2 堆(Heap)
  • 作用:
    • 存储 Java 对象实例和数组。
    • 是垃圾回收的主要区域。
  • 特点:
    • 线程共享。
    • 分为新生代(Young Generation)和老年代(Old Generation):
      • 新生代:存放新创建的对象,分为 Eden 区、Survivor 区(From 和 To)。
      • 老年代:存放长期存活的对象。
    • 可以通过 JVM 参数调整堆的大小:
      • -Xms:初始堆大小。
      • -Xmx:最大堆大小。
4.3 栈(Stack)
  • 作用:
    • 存储方法的局部变量、操作数栈、动态链接、方法出口等信息。
    • 每个线程都有一个独立的栈。
  • 特点:
    • 线程私有。
    • 栈的大小可以通过 JVM 参数调整:
      • -Xss:设置每个线程的栈大小。
    • 栈帧(Stack Frame)是栈的基本单位,每个方法调用会创建一个栈帧。
4.4 本地方法栈(Native Method Stack)
  • 作用:
    • 为本地方法(Native Method)服务。
    • 本地方法是用其他语言(如 C/C++)编写的方法。
  • 特点:
    • 线程私有。
    • 与 Java 栈类似,但服务于本地方法。
4.5 程序计数器(Program Counter Register)
  • 作用:
    • 记录当前线程执行的字节码指令地址。
    • 用于线程切换后恢复执行位置。
  • 特点:
    • 线程私有。
    • 是唯一一个不会发生 OutOfMemoryError 的区域。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker 学习(三)——数据管理、端口映射、容器互联

一、数据管理 容器中的管理数据主要有两种方式: 数据卷 (Data Volumes): 容器内数据直接映射到本地主机环境; 数据 卷容器( Data Volume Containers): 使用特定容器维护数据卷 1.…

解锁Egg.js:从Node.js小白到Web开发高手的进阶之路

一、Egg.js 是什么 在当今的 Web 开发领域,Node.js 凭借其事件驱动、非阻塞 I/O 的模型,在构建高性能、可扩展的网络应用方面展现出独特的优势 ,受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端,还能在服务器端大展身手&…

我的ChatGPT怎么登不上?

近期,不少用户反馈在使用ChatGPT时遇到登录困难、连接超时等问题。本文将从技术角度分析常见原因,并提供合规、安全的解决方案,同时结合开发者实际需求推荐实用工具,助您高效应对登录障碍。 ChatGPT登录失败的常见原因 网络环境限…

小米手机如何录制屏幕?手机、电脑屏幕录制方法分享

大家最近有没有遇到想记录手机屏幕操作的情况? 比如精彩的游戏瞬间、有趣的视频教程,或者需要录制屏幕来制作演示材料。小米手机在这方面可是个好帮手,今天就来给你好好唠唠,小米手机如何录制屏幕,以及后续如何处理这…

【jenkins配置记录】

全局工具配置: D:\Program Files\Java\jdk1.8.0_281 D:\Program Files\Git\bin\git.exe E:\allure-2.13.2 2. GIT 3. 定时任务 H 8 * * 1-5 4. 构建触发器 5. 构建后操作 Allure Report 吐血记录:报告路径可以为 workspace 相对路径 6. 系统配置 em…

修改hosts文件,修改安全属性,建立自己的DNS

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

详解LSM树

目录 什么是LSM树 磁盘结构与顺序IO LSM树结构 LSM树的写入 SSTable合并 LSM树的读取 LSM树的删除 总结 什么是LSM树 LSM 树全名日志结构合并树(Log-Structured Merge Tree),是一种用于存储和管理数据的树状数据结构,常用…

3d投影到2d python opencv

目录 cv2.projectPoints 投影 矩阵计算投影 cv2.projectPoints 投影 cv2.projectPoints() 是 OpenCV 中的一个函数,用于将三维空间中的点(3D points)投影到二维图像平面上。这在计算机视觉中经常用于相机标定、物体姿态估计、3D物体与2D图…

Spring Boot集成Minio笔记

一、首先配置MinIO 1、MinIO新建Bucket&#xff0c;访问控制台如图 创建访问密钥(就是账号和密码) 二、集成mino添加Minio客户端依赖 1.maven构建方式在pom.xml引入jar <dependency><groupId>io.minio</groupId><artifactId>minio</artifactI…

github进不去,一直显示错误

1、进入网址Dns检测|Dns查询 - 站长工具 2、复制检测出来的任意一个ip 3、打开电脑的文件夹&#xff1a;C:\Windows\System32\drivers\etc 下的hosts文件下复制这个ip地址 20.205.243.166 4、winr 打开cmd&#xff0c;输入ipconfig/flushdns ipconfig/flushdns出现这个就可以…

【商城实战(2)】商城架构设计:从底层逻辑到技术实现

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab 目录 BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab分类效果基本介绍BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目…

Windows下使用ShiftMediaProject方法编译FFmpeg

Windows SDK 8.1版本不支持dxva vp9! 需要10.0.17134.0&#xff01;或者把config编译选项去掉 1.下载源码 https://github.com/ShiftMediaProject 2.创建ShiftMediaProject文件夹 把下载好的源码放入source 3.进入SMP执行 project_get_dependencies.bat 自动下载ffmepg依赖项…

C++ Primer 动态数组

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

第四十一:Axios 模型的 get ,post请求

Axios 的 get 请求方式 9.双向数据绑定 v-model - 邓瑞编程 Axios 的 post 请求方式&#xff1a;

神经网络:AI的网络神经

神经网络&#xff08;Neural Networks&#xff09;是深度学习的基础&#xff0c;是一种模仿生物神经系统结构和功能的计算模型。它由大量相互连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;能够通过学习数据中的模式来完成各种任务&#xff0c;如图像分类、语音…

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式 2025/3/4 16:47 缘起&#xff1a;128GB的TF卡&#xff0c;只能格式化为NTFS/exFAT/ext4。 在飞凌的OK3588-C下&#xff0c;NTFS格式只读。 exFAT需要改内核来支持。 现在只剩下ext4了。 linux R4默认不支持exFAT…

FPGA之硬件设计笔记-持续更新中

目录 1、说在前面2、FPGA硬件设计总计说明3、 原理图详解 - ARITX - 7 系列3.1 顶层框图介绍3.2 FPGA 电源sheet介绍&#xff1a;3.2.1 bank 14 和 bank 15的供电3.2.2 bank 0的供电3.2.3 Bank34 35 的供电 3.3 核电压和RAM电压以及辅助电压 4 原理图详解-- Ultrascale ARTIX4.…

【弹性计算】弹性裸金属服务器和神龙虚拟化(一):功能特点

《弹性裸金属服务器》系列&#xff0c;共包含以下文章&#xff1a; 弹性裸金属服务器和神龙虚拟化&#xff08;一&#xff09;&#xff1a;功能特点弹性裸金属服务器和神龙虚拟化&#xff08;二&#xff09;&#xff1a;适用场景弹性裸金属服务器和神龙虚拟化&#xff08;三&a…

【Azure 架构师学习笔记】- Azure Databricks (15) --Delta Lake 和Data Lake

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (14) – 搭建Medallion Architecture part 2 前言 ADB 除了UC 这个概念之外&#xff0c;前面【Azure 架构师学习笔记】- Azure Databricks (1…