面试官今天来聊聊JVM的内存结构吧?

候选者:嗯,好的

候选者:前几次面试的时候也提到了:class文件会被类加载器装载至JVM中,并且JVM会负责程序「运行时」的「内存管理」

候选者:而JVM的内存结构,往往指的就是JVM定义的「运行时数据区域」

候选者:简单来说就分为了5大块:方法区、堆、程序计数器、虚拟机栈、本地方法栈

候选者:要值得注意的是:这是JVM「规范」的分区概念,到具体的实现落地,不同的厂商实现可能是有所区别的。

面试官嗯,顺便讲下你这图上每个区域的内容吧。

候选者:好的,那我就先从「程序计数器」开始讲起吧。

候选者:Java是多线程的语言,我们知道假设线程数大于CPU数,就很有可能有「线程切换」现象,切换意味着「中断」和「恢复」,那自然就需要有一块区域来保存「当前线程的执行信息」

候选者:所以,程序计数器就是用于记录各个线程执行的字节码的地址(分支、循环、跳转、异常、线程恢复等都依赖于计数器)

面试官:好的,理解了。

候选者:那接下来我就说下「虚拟机栈」吧

候选者:每个线程在创建的时候都会创建一个「虚拟机栈」,每次方法调用都会创建一个「栈帧」。每个「栈帧」会包含几块内容:局部变量表、操作数栈、动态连接和返回地址

候选者:了解了「虚拟机栈」的组成后,也不难猜出它的作用了:它保存方法了局部变量、部分变量的计算并参与了方法的调用和返回。

面试官:ok,了解了

候选者:下面就说下「本地方法栈」吧

候选者:本地方法栈跟虚拟机栈的功能类似,虚拟机栈用于管理 Java 函数的调用,而本地方法栈则用于管理本地方法的调用。这里的「本地方法」指的是「非Java方法」,一般本地方法是使用C语言实现的。

面试官:嗯...

候选者:嗯,说完了「本地方法栈」、「虚拟机栈」和「程序计数器」,哦,下面还有「方法区」和「堆」

候选者:那我先说「方法区」吧

候选者:前面提到了运行时数据区这个「分区」是JVM的「规范」,具体的落地实现,不同的虚拟机厂商可能是不一样的

候选者:所以「方法区」也只是 JVM 中规范的一部分而已。

候选者:在HotSpot虚拟机,就会常常提到「永久代」这个词。HotSpot虚拟机在「JDK8前」用「永久代」实现了「方法区」,而很多其他厂商的虚拟机其实是没有「永久代」的概念的。

候选者:我们下面的内容就都用HotSpot虚拟机来说明好了。

候选者:在JDK8中,已经用「元空间」来替代了「永久代」作为「方法区」的实现了

面试官:嗯...

候选者:方法区主要是用来存放已被虚拟机加载的「类相关信息」:包括类信息、常量池

候选者:类信息又包括了类的版本、字段、方法、接口和父类等信息。

候选者:常量池又可以分「静态常量池」和「运行时常量池」

候选者:静态常量池主要存储的是「字面量」以及「符号引用」等信息,静态常量池也包括了我们说的「字符串常量池」。

候选者:「运行时常量池」存储的是「类加载」时生成的「直接引用」等信息。

面试官:嗯...

候选者:又值得注意的是:从「逻辑分区」的角度而言「常量池」是属于「方法区」的

候选者:但自从在「JDK7」以后,就已经把「运行时常量池」和「静态常量池」转移到了「堆」内存中进行存储(对于「物理分区」来说「运行时常量池」和「静态常量池』就属于堆)

面试官:嗯,这信息量有点多

面试官我想问下,你说从「JDK8」已经把「方法区」的实现从「永久代」变成「元空间」,有什么区别?

候选者:最主要的区别就是:「元空间」存储不在虚拟机中,而是使用本地内存,JVM 不会再出现方法区的内存溢出,以往「永久代」经常因为内存不够用导致跑出OOM异常。

候选者:按JDK8版本,总结起来其实就相当于:「类信息」是存储在「元空间」的(也有人把「类信息」这块叫做「类信息常量池」,主要是叫法不同,意思到位就好)

候选者:而「常量池」用JDK7开始,从「物理存储」角度上就在「堆中」,这是没有变化的。

面试官:嗯,我听懂了

面试官最后来讲讲「堆」这块区域吧

候选者:嗯,「堆」是线程共享的区域,几乎类的实例和数组分配的内存都来自于它

候选者:「堆」被划分为「新生代」和「老年代」,「新生代」又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成

候选者:不多BB,我也画图吧

候选者:将「堆内存」分开了几块区域,主要跟「内存回收」有关(垃圾回收机制)

面试官:那垃圾回收这块等下次吧,这个延伸下去又很多东西了

面试官你要不先讲讲JVM内存结构和Java内存模型有啥区别吧?

候选者:他们俩没有啥直接关联,其实两次面试过后,应该你就有感觉了

候选者:Java内存模型是跟「并发」相关的,它是为了屏蔽底层细节而提出的规范,希望在上层(Java层面上)在操作内存时在不同的平台上也有相同的效果

候选者:Java内存结构(又称为运行时数据区域),它描述着当我们的class文件加载至虚拟机后,各个分区的「逻辑结构」是如何的,每个分区承担着什么作用。

面试官:了解了

今日总结:JVM内存结构组成(JVM内存结构又称为「运行时数据区域」。主要有五部分组成:虚拟机栈、本地方法栈、程序计数器、方法区和堆。其中方法区和堆是线程共享的。虚拟机栈、本地方法栈以及程序计数器是线程隔离的)

面试官问我JVM内存结构,我真的是相关推荐

  1. 如果面试官问你 JVM,额外回答逃逸分析技术会让你加分!

    我在面试别人的过程中,JVM 内存模型我几乎必问,虽然有人说问这些就是面试造航母,工作拧螺丝.如果你想当一名 CRUD 码农,你可以选择不用了解这些. 在 JVM 内存模型的问答中,有些人能说出对象是 ...

  2. 面试官问你Java内存区域你用new创建对象来解释

    这几天研究Java虚拟机(Java Virtual Machine),不得不说,这玩意真牛掰,Java跨平台真不是盖的,JVM的学习,今天就从内存区域开始,Java虚拟机他有自己管理的一块内存区域,并 ...

  3. 面试官问我 “String 的不可变真的是因为 final 吗“,我回答 “是“ 然后就被挂了。。。。。。

    String 为啥不可变?因为 String 中的 char 数组被 final 修饰.这套回答相信各位已经背烂了,But 这并不正确! 面试官:讲讲 String.StringBuilder.Str ...

  4. 什么?面试官问我Java内存模型!这不得给我加薪?

    内存模型的基础 通信 线程之间以何种机制来交换信息 共享内存 隐式通信 消息传递 显示通信 同步 程序中用于控制不同线程间操作,发生的相对顺序的机制 共享内存 显式同步 消息传递 隐式同步 Java线 ...

  5. java代码编译之后是如何运行的?不知道这些,面试官问你jvm问题,你只能懵圈

    目录 从机器语言->汇编语言->高级语言 JVM的整体结构 java代码执行流程 java虚拟机种类(常用的就是HotSpot) 从机器语言->汇编语言->高级语言 计算机系统 ...

  6. 【159期】面试官问:说说 MongoDB 批量操作与 MySQL 效率对比?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方留言必回,有问必答! 每天 08:35 更新文章,每天进步一点点... 本文主 ...

  7. 面试官问:Integer 如何实现节约内存和提升性能的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Byte_Liu 来源:https://urlify.cn/ ...

  8. 面试官问我:Redis 内存满了怎么办

    转载自 想不到!面试官问我:Redis 内存满了怎么办 Redis占用内存大小 Redis的内存淘汰 LRU算法 LRU在Redis中的实现 LFU算法 问题 Redis占用内存大小 我们知道Redi ...

  9. 万万没想到,JVM内存结构的面试题可以问的这么难?

    在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了. 那么,请大家尝试着回答一下以下问题: 1.JVM管理的内存结构是怎样的?  2.不同的虚拟机在 ...

最新文章

  1. R语言Goldfeld-Quandt检验实战:检验回归模型中是否存在异方差性(heteroscedasticity)、发生了异常差(heteroscedasticity)问题如何解决
  2. 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
  3. Expect 在网络管理中发挥着重要作用
  4. 手机端h5页面字体大小适配
  5. 以太网供电技术/有源以太网技术POE简单介绍
  6. Powerbi实战--常用新建表代码(单位切换,日期表)
  7. KMP算法(快速模式匹配)
  8. php页面自分页刷新,详解PHP+AJAX无刷新分页实现方法
  9. Windows 7密码重设盘的内部原理浅析
  10. License Server Version 11.9 Installation on Windows Server 2003 Hangs
  11. python3 在线加密_Python3非对称加密算法RSA实例详解
  12. Python——彩票(大乐透)模拟随机选号
  13. 利用wePE制作WinPE启动U盘全过程(含图文)
  14. LINUX MPEG4 DVR源代码,还包括一个可以跨平台运行的MPEG4 播放器(需要XVID与SDL开发库包)
  15. 电商数仓(dwt 层)
  16. 南京大学交叉培养计算机与金融招生人数,教务处组织召开计算机与金融工程实验班师生见面会...
  17. C. Doremy‘s IQ(二分/思维)
  18. java画星星_用java画色彩斑斓的星星
  19. My97DatePicker时间控件
  20. outlook邮件 css 不生效问题

热门文章

  1. 用MsgWaitForMultipleObjects代替WaitForSingleObject和WaitForMultipleObjects()
  2. java spring 校验框架_Springboot 使用校验框架validation校验
  3. 为最快动脉线诊断 铁科院联合第四范式完成高铁智能化巡检应用
  4. vb.net2019-多线程并行计算(2)
  5. C指针原理(7)-C内嵌汇编
  6. (建议收藏)相对靠谱的国内大学排行榜
  7. 【深度学习】CornerNet: 将目标检测问题视作关键点检测与配对
  8. 【广告技术】如何科学地划分用户群体?在聚类中考虑用户特征和社会关系
  9. Pandas基本操作指南-2天学会pandas
  10. 盘一盘推荐系统里值得一读的那些论文