【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

一文讲清 JVM 内存结构 | 极客视点

  • 2019-12-13
  • 本文字数:1741 字

    阅读完需:约 6 分钟

一文讲清JVM内存结构 | 极客视点
00:00
05:51


本文发布于极客时间 | 极客视点专栏,由 InfoQ 整理分享。


JVM 一直都是程序员面试的必考点,但是要把它搞清楚又好像不是特别容易。JVM 的知识点太散,不系统,所以不便于归纳总结。近日,公众号“Java 大联盟”的作者楠哥梳理了 JVM 的结构,希望给技术同学带来参考。


JVM 可以分为 5 个部分,分别是:


  • 1.类加载器(Class Loader):加载字节码文件到内存。

  • 2.运行时数据区(Runtime Data Area):JVM 核心内存空间结构模型。

  • 3.执行引擎(Execution Engine):对 JVM 指令进行解析,翻译成机器码,解析完成后提交到操作系统中。

  • 4.本地库接口(Native Interface):供 Java 调用的融合了不同开发语言的原生库。

  • 5.本地方法库(Native Libraies):Java 本地方法的具体实现。


JVM 的结构如下图所示:



这其中最复杂的是运行时数据区,它也是 JVM 内存结构最重要的部分。运行时数据区又可以分为方法区、虚拟机栈、本地方法栈、堆以及程序计数器,并且方法区和堆是线程共享的,虚拟机栈、本地方法栈、程序计数器是线程隔离的。下面详细讲解运行时数据区的各个组成部分。

1.方法区

方法区存储虚拟机加载的类信息、常量、静态变量以及即时编译器编译后的代码等数据。方法区是一种规范,它的其中一种实现是永久代。JDK 7 以前的版本字符串常量池是放在永久代中的,JDK 7 将字符串常量池移动到了堆中,JDK 8 直接删除了永久代,改用元空间替代永久代。

2.本地方法栈

本地方法栈与 Java 栈的作用和原理基本相同,都可以用来执行方法,不同点在于 Java 栈执行的是 Java 方法,本地方法栈执行的是本地方法。


什么是 Java 的本地方法呢?Java 是基于应用层的高级编程语言,无法访问操作系统底层信息,如底层硬件设备等,这个时候就需要使用其他语言来完成其欠缺的功能了,比如 C 语言。本地方法的使用原理如下所示:


  • 在 Java 程序中声明 native 修饰的方法,只有方法定义,没有方法实现,将该 Java 文件编译成字节码文件。

  • 用 javah 编译字节码文件,生成一个 .h 文件。

  • 写一个 .cpp 文件实现 .h 文件中的方法。

  • 将 .cpp 文件编译成动态链接库文件 .dll 。

  • 使用 System.loadLibrary() 加载动态连接库文件。


这样就可以实现本地方法的调用,用 Java 调用而非 Java 编写的接口,基本原理是利用反射机制,在运行时找到 .dll 文件并且解析,根据动态链接库中的文件名称创建出对象和方法,然后就可以利用对象调用方法了。

3.程序计数器

程序计数器占用的内存空间较小,是当前线程所执行的字节码行号指示器,通过改变这个计数器的值来选取下一条需要执行的字节码指令。多个线程之间的程序计数器相互独立,为了保证每个线程恢复后都可以找到具体的执行位置。

4.Java 堆

Java 堆用来存放实例化对象,它被所有线程共享,在虚拟机启动时创建,用来存放对象实例,其占用了 Java 内存的大部分空间,是 GC 的主要管理区域,又可分为年轻代、老年代、永久代。


年轻代又可分为 Eden,from Survivor,to Survivor。Eden 区用来存放刚刚创建的对象,如果 Eden 区放不下,则放在 Survivor 区,甚至老年代中。Survivor 区又可分为 Survivor From 和 Survivor To,GC 回收时使用,将 Eden 中存活的对象存入 Survior From 中,下一次回收时,将 Survior From 中的对象存入 Survior To 中,清除 Survior From ,下一次回收时重复此步骤,Survior From 变成 Survior To,Survivor To 变成 Survivor From,依次循环,同时每次回收,对象的年龄都 +1,年龄增加到一定程度的对象,移动到老年代中。


老年代是存放生命周期较长的对象,而永久代在 JDK 8 之后已经被元空间替代。元空间使用本地内存,永久代使用 JVM 内存,所以使用元空间的好处在于程序的内存不再受限于 JVM 内存,本地内存剩余多少空间,元空间就可以有多大,解决了空间不足的问题。

5.虚拟机栈

Java 栈中存放的是多个栈帧,每个栈帧对应一个被调用的方法,主要包括局部变量表、操作数栈、动态链接、方法返回地址(方法出口)。每一个方法的执行,JVM 都会创建一个栈帧,并且将栈帧压入 Java 栈,方法执行完毕,该栈帧出栈。也就是说,每个方法的执行都是一个栈帧的入栈和出栈过程,Java 虚拟机栈用来存储栈帧,方法调用结束之后,帧会被销毁。


以上就是 JVM 的内存结构,你都学会了吗?


原文链接: 一次性把JVM讲清楚,别再被面试官问住了


2019-12-13 12:222332

评论

发布
暂无评论
发现更多内容

双十一剁手节,MobPush助力各大电商平台提前锁定潜力用户

MobTech袤博科技

大数据

IBM SPSS Statistics 26 (spss统计软件)中文特别版下载

影影绰绰一往直前

IBM SPSS Statistics中文 IBM SPSS Statistics破解 IBM SPSS Statistics下载 IBM SPSS Statistics 26

iOS应用加固方案解析:ipa加固安全技术全面评测

万界星空科技生产管理MES系统的数据追溯技术

万界星空科技

mes 云mes 追溯系统 产品追溯 万界星空科技mes

Adobe Media Encoder 2024(Me2024)直装版下载

影影绰绰一往直前

Adobe Media Encoder 2024

Mac电脑上最受欢迎的SSH工具,让你轻松远程控制服务器!

影影绰绰一往直前

SSH工具 终端SSH仿真工具

go 中的循环依赖

EquatorCoco

Go 编程语言 循环依赖

好用的磁盘分析工具 Disk Xray免激活版

mac大玩家j

磁盘管理 Mac软件 磁盘管理软件

DBeaver Ultimate(数据库管理软件)官方绿色版

影影绰绰一往直前

DBeaver Ultimate DBeaver Ultimate软件 DBeaver Ultimate下载

Amazon Bedrock 划算吗?Bedrock 大模型服务定价与分析

魏临

多维详述MediaBox互动直播AUI Kit低代码开发方案

阿里云视频云

云计算 视频云

iPulse 激活版for mac(系统状态监控软件) v3.141

胖墩儿不胖y

Mac软件 系统监控软件

Nitro PDF Pro(全面的PDF工具)便携版

影影绰绰一往直前

Nitro Pro下载 Nitro Pro便携版 Nitro Pro

超级APP,All in one APP

WorkPlus

如何构建新一代实时湖仓?袋鼠云基于数据湖的探索升级之路

袋鼠云数栈

数据仓库 数据湖 湖仓一体 大数据仓库 实时湖仓

武创院区块链产业研究所:基于鲲鹏DevKit开发区块链政务服务协同数据治理平台,数据管理更放心

彭飞

WorkPlus安全专属移动数字化航空母舰,助力企业掌控业务和生态

WorkPlus

分享一套适合二开的JAVA开源版本MES系统

万界星空科技

生产管理系统 云mes 免费mes 开源mes mes源码

Adobe Media Encoder(ME)2024 for mac v24.0.2中文激活版下载

晴雯哥

推送效率低?MobPush带着APP消息推送一站式解决方案来了

MobTech袤博科技

大数据

华润啤酒走进用友,数智化赋能酒业新世界

用友BIP

如何配置支付宝密钥之如何配置证书|保姆级教学(二)

盐焗代码虾

证书 支付宝 经验分享 密钥

【iOS开发】iOS App的加固保护原理:使用ipaguard混淆加固

雪奈椰子

使用Python调用API接口获取拼多多商品数据:一篇详细说明文章

Noah

LED显示屏由哪些部件组成

Dylan

系统 LED显示屏 屏幕 电源

AutoCAD 2024 v24.3 mac版下载 内置激活教程

晴雯哥

用友BIP,助力轴承行业数智化转型

用友BIP

数智化转型

文明6 for mac 1.4.5 最新DLC 越南和忽必烈包 文明6 mac破解版

晴雯哥

培养财务团队协作,冲破市场经济逆境

智达方通

财务分析 业财融合 智达方通 财务团队协作

盈利能力管理,为企业未来发展创造优势

智达方通

全面预算 盈利能力

硬件开发少走弯路,来华秋这场研讨会提升技能

华秋电子

工程师

一文讲清JVM内存结构 | 极客视点_文化 & 方法_极客视点_InfoQ精选文章