面试官:今天我们来谈谈JVM的内存结构,好吗?应聘者:嗯,不错的应聘者:在之前的面试中也提到过:类文件会被类加载器加载到JVM中,由JVM负责程序“运行时”的“内存管理”应聘者:而JVM的内存结构往往是指JVM定义的“运行时数据区”的候选者:简单来说分为5大块:方法区、堆、程序计数器、虚拟机栈、本地methodstack候选人:to值得注意的是,这是JVM“标准”的分区概念。在具体实现上,不同的厂商可能实现方式不同。采访者:嗯,顺便说一下你地图上每个区域的内容。候选人:好的,让我从“程序计数器”开始。考生:Java是一种多线程语言。我们知道,假设线程数大于CPU数,可能会出现“线程切换”的现象。切换意味着“中断”和“恢复”。“当前线程的执行信息”考生:所以程序计数器是用来记录每个线程执行的字节码的地址(分支、循环、跳转、异常、线程恢复等都依赖于计数器)面试官:好的,我明白了。考生:那我说说“虚拟机栈”考生:每个线程在创建的时候都会创建一个“虚拟机栈”,每次方法调用都会创建一个“栈帧”。每个“栈帧”都会包含几块内容:局部变量表、操作数栈、动态链接和返回地址候选:理解了“虚拟机栈”的组成后,不难猜到它的作用:它的方法保存局部变量和部分变量的计算,参与方法的调用和返回。面试官:好的,我明白了考生:再说说“本地方法栈”考生:本地方法栈的作用和虚拟机栈类似。用于管理对本机方法的调用。这里的“native方法”是指“非Java方法”,一般的native方法都是用C语言实现的。面试官:嗯……考生:嗯,说完“本地方法栈”、“虚拟机栈”和“程序计数器”,哦,还有“方法区”和“堆”考生:那我就说““方法区”的候选者:前面说过,运行时数据区的“分区”是JVM的“标准”,具体实现上,不同的虚拟机厂商可能是不同的候选者:所以“方法区”只是JVM中规范的一部分而已。考生:在HotSpot虚拟机中,经常提到“永久代”这个词,HotSpot虚拟机在JDK8之前用“永久代”实现了“方法区”,但是很多其他厂商的虚拟机并没有“永久代”的概念。考生:我们将使用HotSpot虚拟机来说明下面的内容。候选:在JDK8中,已经用“元空间”代替“永久代”作为“方法区”的实现。面试官:嗯……考生:方法区主要用来存放虚拟机已经加载的“永久代”。类相关信息”:包括类信息、常量池候选:类信息包括类版本、字段、方法、接口、父类。候选:常量池分为“静态常量池”和“运行时常量池”.“字符串常量池”考生:“运行时常量池”存放的是“类加载”时产生的“直接引用”等信息面试官:嗯...考生:还有一点值得注意,从“逻辑分区”,“常量池”是“方法区”的候选:但是从“JDK7”开始,“运行时常量池”和“静态常量池”被转移到“堆”内存中存储(对于“物理分区”,“运行时常量池”和“静态常量池”属于堆)面试官:嗯,这个信息面试官:我想问一下,你说“JDK8”改变了实现“方法区”从“永久代”到“元空间”,有什么区别?考生:主要区别在于“元空间”存储不是存储在虚拟机中,而是使用本地内存。JVM将不会再在方法区遇到内存溢出。以前“永久代”经常会因为内存不足而OOM。异常。考生:根据JDK8版本,归纳起来,相当于:“类信息”存储在“元空间”(也有人把“类信息”称为“类信息常量池”,主要是叫法不同,如只要意思到位即可)考生:“常量池”是从JDK7开始的,从“物理存储”的角度来看是在“堆”中的,这一点一直没有变。面试官:嗯,我明白了。面试官:最后说一下“堆”区。考生:嗯,“堆”是线程共享的区域。类实例和数组分配的内存几乎都来自于它。候选:“Heap”分为“NewGeneration”和“OldGeneration”,“NewGeneration”又分为Eden和Survivor区,最后Survivor由FromSurvivor和ToSurvivor组成候选:BB不多,我候选:把“堆内存”分成几个区域,主要是跟“内存回收”(垃圾回收机制)有关面试官:垃圾回收等下回吧,这个扩展会有很多东西。专访关:为什么不先说说JVM内存结构和Java内存模型的区别?候选人:他们两个没有直接关系。其实经过两次面试,大家应该都有感觉了。考生:Java内存模型与“并发”有关。它是为屏蔽底层细节而提出的规范。(Java层面)在操作内存时在不同平台上的作用是一样的候选:Java内存结构(也称为运行时数据区),它描述了当我们的class文件加载到虚拟机中时,其“逻辑结构”是什么,以及每个分区起什么作用。面试官:我理解了今天的总结:JVM内存结构(JVM内存结构也叫“运行时数据区”,主要由虚拟机栈、本地方法栈、程序计数器、方法区和堆五部分组成。其中,method区和堆是线程共享的。虚拟机栈、本地方法栈、程序计数器是线程隔离的)欢迎关注我的微信公众号【Java3y】聊聊Java面试,在线面试官系列持续更新中!【在线面试官-手机版】系列,每周两篇,持续更新中!【在线面试官-电脑】系列每周两篇持续更新中!原创不易!!一连求三!!
