50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

一文讲清 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:222919

评论

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

Windows Defender防火墙配置错误与GPO:梳理关键点

运维有小邓

日志管理 日志审计 #日志分析

金融保险行业 AD 域自动化管理解决方案

运维有小邓

AD域 AD域管理

以数生智、以智驭数,矩阵起源产品发布会圆满落幕

MatrixOrigin

人工智能 AI 湖仓一体 多模态数据 AI-ready

【喜报】矩阵起源 2 款深度合成服务算法顺利通过国家网信办备案

MatrixOrigin

人工智能 AI 算力 AI-ready

揭秘 CDC 技术:让数据库同步快人一步

谷云科技RestCloud

数据传输 数据同步 ETL CDC 数据集成工具

MySQL 31 误删数据怎么办?

伤感汤姆布利柏

腾讯会议AI功能用户量同比增长超150%

极客天地

Playwright MCP浏览器自动化教程

测吧(北京)科技有限公司

为什么财务团队要注重数据管理?

智达方通

企业管理 全面预算管理

大数据公有云市场第一,阿里云占比47%!

阿里云大数据AI技术

电商接口之电子面单API接口对接以及调用:以快递鸟为例

快递鸟

鸿蒙5.0项目开发——V2装饰器@Event的使用

高心星

鸿蒙 装饰器 HarmonyOS5.0 V2装饰器 @Event

时序数据库 Apache IoTDB 毕业五周年,“对暗号”获取你的蛇年 T 恤!

Apache IoTDB

恒图科技×火山引擎:为全球用户打造智能创作新体验

新消费日报

2025财务机器人选型全攻略:谁能成为企业“财务大脑”?

Techinsight

Chainlink Data Streams正式上线Sei网络,成为首选预言机基础设施

股市老人

不仅仅是“局域网聊天”:BeeWorks 重新定义企业内网通信

BeeWorks

即时通讯 IM 私有化部署

最新 RPA 权威榜单出炉!排名对比,一文看懂谁在领跑市场

Techinsight

ADManager Plus:面向微软的全面活动目录管理解决方案

运维有小邓

AD域 AD域管理

挖掘PDF生成器中的SSRF漏洞:从发现到利用

qife122

网络安全 SSRF

EdgeOne Pages成为中小企业与开发者出海首选平台

极客天地

数字化转型怎么做?加入西门子Xcelerator平台,开放资源与无限机遇等您探索!

科技热闻

腾讯集团副总裁李强:AI加速全球化竞争从规模扩张转向效率比拼

ToB行业头条

跨境数据传输:ETL如何处理时区与日期格式差异

谷云科技RestCloud

MySQL API 数据传输 数据同步 ETL

重要:Java25正式发布(长期支持版)!

王磊

【新模型速递】PAI-Model Gallery云上一键部署Qwen3-Next系列模型

阿里云大数据AI技术

阿里云 大模型 通义千问 PAI

AI大模型如何生成PPT?7个主流PPT生成器大盘点

职场工具箱

PPT AI大模型 AIGC AI工具 AI生成PPT

局域网部署的团队协作工具推荐,助力高效办公

BeeWorks

即时通讯 IM 私有化部署

嘉银科技基于阿里云 Kafka Serverless 提升业务弹性能力,节省成本超过 20%

阿里巴巴云原生

kafka 阿里云 Serverless 云原生

上线半年客户数增长超300%,腾讯云音视频低代码互动直播组件释放全球开发者生产力

极客天地

OpenTiny NEXT 内核新生:生成式UI × MCP,重塑前端交互新范式!

OpenTiny社区

AI 前端 智能化 OpenTiny MCP

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