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 的区域。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis - 单元测试 参数传递 注解 CRUD

目录 1. MyBatis 简介 2. 简单使用 MyBatis 2.1 创建 MyBatis 项目 2.2 连接数据库 2.3 创建 Java 类 2.4 创建 Mapper 接口 2.5 在测试类中执行 3. 单元测试 3.1 Test 3.2 SpringBootTest 3.3 BeforeEach / AfterEach 4. MyBatis 基础操作 4.1 配置 MyBatis 打印日…

大语言模型学习--本地部署DeepSeek

本地部署一个DeepSeek大语言模型 研究学习一下。 本地快速部署大模型的一个工具 先根据操作系统版本下载Ollama客户端 1.Ollama安装 ollama是一个开源的大型语言模型(LLM)本地化部署与管理工具,旨在简化在本地计算机上运行和管理大语言模型…

shell文本处理

shell文本处理 一、grep ​ 过滤来自一个文件或标准输入匹配模式内容。除了 grep 外,还有 egrep、fgrep。egrep 是 grep 的扩展,相当于 grep -E。fgrep 相当于 grep -f,用的比较少。 用法 grep [OPTION]... PATTERN [FILE]...支持的正则描述…

Linux中死锁问题的探讨

在 Linux 中,死锁(Deadlock) 是指多个进程或线程因为竞争资源而相互等待,导致所有相关进程或线程都无法继续执行的状态。死锁是一种严重的系统问题,会导致系统资源浪费,甚至系统崩溃。 死锁的定义 死锁是指…

Baklib内容中台赋能企业智管

内容中台构建全场景智管 现代企业数字化运营中,全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构,企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例,其利用中台系统将分散在CRM、ERP及内部文档…

ArcGIS Pro高级应用:高效生成TIN地形模型

一、引言 在地理信息科学与遥感技术的快速发展背景下,数字高程模型(DEM)已成为地形表达与分析的关键工具。 三角网(TIN)作为DEM的一种重要形式,因其能够精准描绘复杂地形特征而广受青睐。 ArcGIS Pro为用…

leetcode112-路径总和

leetcode 112 思路 我们利用递归来实现,用result字段来记录结果值,默认为false,我们递归的时候传入需要的目标值,然后每次遍历到一个节点,就用目标值减去节点当前值,最终到叶子节点时,如果是…

LLM | 论文精读 | CVPR | PEACE : 通过多模态大语言模型(MLLMs)赋能地质图全面理解

论文标题:FairCLIP: Harnessing Fairness in Vision-Language Learning 作者:Yan Luo Min Shi Muhammad Osama Khan Muhammad Muneeb Afzal等 期刊:CVPR 2025 email:yuhan.huangwhu.edu.cn 创作不易,恳请大家点赞收…

网络学习(四)HTTPS中,SSL的单向认证与双向认证

目录 一、什么是SSL?1.1 SSL 的主要功能1.2 SSL 的工作原理1.3 SSL 的核心组件1.4 SSL 的应用场景1.5 SSL 与 TLS 的区别 二、SSL 单向认证、双向认证2.1 SSL 单向认证2.2 SSL 双向认证2.3 总结:SSL 单向认证和双向认证的区别 一、什么是SSL?…

Mybatis 中#{} 和${} 的区别是什么?

在 MyBatis 中,#{} 和 ${} 都是用于动态 SQL 语句中的占位符,但是它们的作用和使用方式是不同的。下面是它们的区别: 1. #{} —— 用于防止 SQL 注入和自动类型处理 #{} 是用来将参数安全地传递到 SQL 语句中,它会将传递的参数值…

HTML-05NPM使用踩坑

2025-03-04-NPM使用踩坑 本文讲述了一个苦逼程序员在使用NPM的时候突然来了一记nmp login天雷,然后一番折腾之后,终究还是没有解决npm的问题😞😞😞,最终使用cnpm完美解决的故事。 文章目录 2025-03-04-NPM使用踩坑[toc…

Zookeeper 的核心引擎:深入解析 ZAB 协议

#作者:张桐瑞 文章目录 前言ZAB 协议算法崩溃恢复选票结构选票筛选消息广播 前言 ZooKeeper 最核心的作用就是保证分布式系统的数据一致性,而无论是处理来自客户端的会话请求时,还是集群 Leader 节点发生重新选举时,都会产生数据…

C++ Primer 动态数组

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

基于 HTML、CSS 和 JavaScript 的智能九宫格图片分割系统

目录 1 前言 2 技术实现 2.1 HTML 结构 2.2 CSS 样式 2.3 JavaScript 交互 3 代码解析 3.1 HTML 部分 3.2 CSS 部分 3.3 JavaScript 部分 4 完整代码 5 运行结果 6 总结 6.1 系统特点 6.2 使用方法 1 前言 在当今数字化的时代,图片处理需求日益增长。…

Java+iTextPDF,实时生成与预览PDF文件的最佳实践!

Java+iTextPDF,实时生成与预览PDF文件的最佳实践! 背景 其实公司之前的项目里是用到了帆软报表的,然而最近接了一个新项目,这个项目独立部署在甲方的独立环境中,组长的意思是不用再单独部署一套帆软报表,成本太大,用其他方式实现一下。虽然我不太理解成本大在哪儿,不…

Linux 快捷命令链接

修改mvn命令 默认手动安装后,命令格式为 安装路径命令 /data/apache-maven-3.8.8/bin/mvn -v更改为通用的命令模式 [root ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) [root ~]# echo $PATH /usr/local/node16/bin:/usr/local/sbin:/sbin…

论文回顾:NeoBERT:新一代 BERT

NeoBERT:新一代编码器,具有 4K 标记上下文长度,在 MTEB 上优于 RoBERTa 等更大的模型! 论文链接:https://arxiv.org/pdf/2502.19587 摘要 NeoBERT 是下一代双向编码器;它融合了最先进的架构、现代数据和优…

机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】

目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具,便于在客户端软件中…

一、OpenGL的原理解析

文章目录 OpenGL到底实现的是什么?OpenGL内模型数据的本质是什么?为什么三角形是 3D 渲染的最基本单元?MVP 变换(Model-View-Projection 变换)OpenGL渲染流程-摄像机变换OpenGL渲染流程-投影变换OpenGL渲染管线概述 Op…

大模型——CogView4:生成中英双语高清图片的开源文生图模型综合介绍

CogView4:生成中英双语高清图片的开源文生图模型综合介绍 CogView4 是由清华大学 KEG 实验室(THUDM)开发的一款开源文生图模型,专注于将文本描述转化为高质量图像。它支持中英双语提示词输入,尤其擅长理解中文提示并生成带有汉字的图像,非常适合广告设计、短视频创作等场…