运行时数据区-面试必问的-你懂了吗-JVM (运行时数据区的作用)

教程大全 2025-07-08 01:11:14 浏览

面试必问的 JVM 运行时数据区,你懂了吗?

2021-07-14 07:21:57Java 虚拟机的运行时数据区经常在面试中被拿来提问,很多概念在市面上有各种各样的说法,搞的不少同学应该是懵逼的。

前言

Java 虚拟机的运行时数据区经常在面试中被拿来提问,很多概念在市面上有各种各样的说法,搞的不少同学应该是懵逼的。

当我们陷入不知道哪个说法是正确的情况时,最好的参考就是源码和规范。

在面试中,当面试官反问你:为什么某某是这样?的时候,如果你回答:因为规范是这么写的、因为源码是这么写的。

这个回答是非常有说服力的。

因此,本文在描述一些有争议的问题上,优先以《Java 虚拟机规范》的说法为准。

正文

1、运行时数据区(Run-Time>

Java 虚拟机定义了若干种在程序执行期间会使用到的运行时数据区域。

其中一些数据区域在 Java 虚拟机启动时被创建,随着虚拟机退出而销毁。也就是线程间共享的区域:堆、方法区、运行时常量池。

另外一些数据区域是按线程划分的,这些数据区域在线程创建时创建,在线程退出时销毁。也就是线程间隔离的区域:程序计数器、Java虚拟机栈、本地方法栈。

1)程序计数器(Program Counter Register)

Java 虚拟机可以支持多个线程同时执行,每个线程都有自己的程序计数器。在任何时刻,每个线程都只会执行一个方法的代码,这个方法称为该线程的当前方法(current method)。

如果线程正在执行的是 Java 方法(不是 native 的),则程序计数器记录的是正在执行的 Java 虚拟机字节码指令的地址。如果正在执行的是本地(native)方法,那么计数器的值是空的(undefined)。

2)Java虚拟机栈(Java Virtual Machine Stacks)

每个 Java 虚拟机线程都有自己私有的 Java 虚拟机栈,它与线程同时创建,用于存储栈帧。

Java 虚拟机栈描述的是 Java 方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

3)本地方法栈(Native Method Stacks)

本地方法栈与 Java 虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是 Java 虚拟机栈为虚拟机执行 Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的本地(Native)方法服务。

4)堆(Heap)

堆是被各个线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。

堆在虚拟机启动时创建,堆存储的对象不会被显示释放,而是由垃圾收集器进行统一管理和回收。

5)方法区(Method Area)

方法区是被各个线程共享的运行时内存区域。方法区类似于传统语言的编译代码的存储区。它存储了每一个类的结构信息,例如:运行时常量池、字段和方法数据,构造函数和普通方法的字节码内容,还包括一些用于类、实例、接口初始化用到的特殊方法。

6)运行时常量池(Run-Time Constant Pool)

运行时常量池是 class 文件中每一个类或接口的常量池表(constant_pool table)的运行时表示形式。

它包含了若干种常量,从编译时已知的数值字面量到必须在运行时解析后才能获得的方法和字段引用。运行时常量池的功能类似于传统编程语言的符号表(symbol table),不过它包含的数据范围比通常意义上的符号表要更为广泛。

2、Java 中有哪几种常量池?

现在我们经常提到的常量池主要有三种:class 文件常量池、运行时常量池、字符串常量池。

3、class 文件常量池

class 文件常量池(class constant pool)属于 class 文件的其中一项,class 类文件包含:魔数、类的版本、常量池、访问标志、字段表集合、方发表等信息。

常量池用于存放编译期间生成的各种字面量(Literal)和符号引用(Symbolic References)。

字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为 final 的常量值等。

符号引用则属于编译原理方面的概念。符号引用是一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可(它与直接引用区分,直接引用一般是指向方法区的本地指针,相对偏移量或是一个能间接定位到目标的句柄)。符号引用主要包括下面几类常量:

常量池中每一项常量都是一个表,截至JDK 13,常量表中分别有17种不同类型的常量。17种常量类型所代表的具体含义如图所示。

关于 class 文件常量池的更多内容可以阅读周志明的《深入理解Java虚拟机》6.3.2 章节。

4、运行时常量池

class 文件常量池是在类被编译成 class 文件时生成的。而当类被加载到内存中后,JVM 就会将 class 文件常量池中的内容存放到运行时常量池中。

Java 虚拟机规范中对运行时常量池的定义如下:

A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file.

运行时常量池是 class 文件中每一个类或接口的常量池表(constant_pool table)的运行时表示形式。

因此,根据规范定义,可以说运行时常量池是 class 文件常量池的运行时表示,每个类在运行时都有自己的一个独立的运行时常量池。

5、字符串常量池

简单来说,HotSpot VM 里的字符串常量池(StringTable)是个哈希表,全局只有一份,被所有的类共享。

StringTable 具体存储的是 String 对象的引用,而不是 String 对象实例自身。String 对象实例在 JDK 6 及之前是在永久代里,从JDK 7 开始放在堆里。

根据 Java 虚拟机规范的定义,堆是存储 Java 对象的地方,其他地方是不会有 Java 对象实体的,如果有的话,根据规范定义,这些地方也要算堆的一部分。

6、字符串常量池是否属于方法区?

我认为是不属于的。

在读本文之前,我相信很多同学会有如下观点:因为运行时常量池属于方法区,所以很多同学认为字符串常量池也应该属于方法区。

但是相信看了上面的内容后,会开始意识到,运行时常量池和字符串常量池其实是不同的两个东西,当然它们在字符串解析时会有关联。

Java 虚拟机规范中对方法区的定义如下:

The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the “text” segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method>7、运行时常量池和字符串常量池的关联?

上面说了,运行时常量池和字符串常量池在字符串解析时会有关联,具体如下。

类的运行时常量池中有 CONSTANT_String_info(见题3表格)类型的常量,CONSTANT_String_info 类型的常量的解析(resolve)过程如下:

首先到字符串常量池(StringTable)中查找是否已经有了该字符串的引用,如果有,则直接返回字符串常量池的引用;如果没有,则在堆中创建 String 对象,并在字符串常量池驻留其引用,然后返回该引用。

也就说,运行时常量池里的 CONSTANT_String_info 类型的常量,经过解析(resolve)之后,同样存的是字符串的引用,并且和 StringTable 驻留的引用的是一致的。

8、String#intern 方法

在 JDK 7 及之后的版本中,该方法的作用如下:如果字符串常量池中已经有这个字符串,则直接返回常量池中的引用;如果没有,则将这个字符串的引用保存一份到字符串常量池,然后返回这个引用。

下面的例子可以进行简单的验证:

9、永久代(PermGen)

永久代在 Java 8 被移除。根据官方提案的描述,移除的主要动机是:要将 JRockit 和 Hotspot 进行融合,而 JRockit 并没有永久代。

而据我们所了解的,还有另外一个重要原因是永久代本身也存在较多的问题,经常出现OOM,还出过不少bug。

根据官方提案的描述,永久代主要存储了三种数据:

1)Class metadata(类元数据),也就是方法区中包含的数据,除了编译生成的字节码被放在 native memory(本地内存)。

2)interned Strings,也就是字符串常量池中驻留引用的字符串对象,字符串常量池只驻留引用,而实际对象是在永久代中。

3)class static variables,类静态变量。

JVM

移除永久代后,interned Strings 和 class static variables 被移动了堆中,Class metadata 被移动到了后来的元空间。

10、永久代和方法区的关系?

方法区是 Java 虚拟机规范中定义的一种逻辑概念,而永久代是对方法区的实现。但是永久代并不等同于方法区,方法区也不等同于永久代。

永久代中的 interned Strings 并不属于方法区,按规范:堆是存储 Java 对象的地方 ,这部分应该属于堆,因此永久代并不是只用于实现方法区。

方法区中 JIT 编译生成的代码并不是存放在永久代,而是在 native memory 中,因此可以说方法区也并不只是由永久代来实现。

11、元空间(metaspace)

元空间在 Java 8 移除永久代后被引入,用来代替永久代,本质和永久代类似,都是对方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存(native memory)。

元空间主要用于存储 Class metadata(类元数据),根据其命名其实也看得出来。

可以通过 -XX:MaxMetaspaceSize 参数来限制元空间的大小,如果没有设置该参数,则元空间默认限制为机器内存。

12、为什么引入元空间?

在 Java 8 之前,Java 虚拟机使用永久代来存放类元信息,通过-XX:PermSize、-XX:MaxPermSize 来控制这块内存的大小,随着动态类加载的情况越来越多,这块内存变得不太可控,到底设置多大合适是每个开发者要考虑的问题。

如果设置小了,容易出现内存溢出;如果设置大了,又有点浪费,尽管不会实质分配这么大的物理内存。

而元空间可以较好的解决内存设置多大的问题:当我们没有指定 -XX:MaxMetaspaceSize 时,元空间可以动态的调整使用的内存大小,以容纳不断增加的类。

13、元空间能彻底解决内存溢出(Out Of Memory)问题吗?

很遗憾,答案是不行的。

元空间无法彻底解决内存溢出的问题,只能说是有所缓解。当内存使用完毕后,元空间一样会出现内存溢出的情况,最典型的场景就是出现了内存泄漏时。


助理工程师升工程师条件(南京)

可以申报工程师职称。 江苏省申报工程师范围和要求申报对象应遵守国家法律和法规,有良好的职业道德和敬业精神,任现职期间工作表现良好,符合专业技术资格条件的工程专业技术人员。 (一)学历、资历要求1、本科毕业取得助理工程师职称,并从事助理工程师工作4年以上或本科毕业后从事本专业技术工作5年以上;2、大专毕业取得助理工程师职称,并从事助理工程师工作4年以上或大专毕业后从事本专业技术工作7年以上;不具备规定学历,但确有真才实学,业绩显著,符合下列条件之一的,可破格申报:1、中专毕业连续从事本专业技术工作10年以上或累计从事本专业技术工作15年以上、取得助理级职称并从事助理级工作5年以上;2、取得市级科技进步二等奖(相应奖项)以上。 3、企业及乡镇农业事业单位的主要技术负责人,不具备规定学历,参加市职称办认可的相关专业培训,经考试取得合格证书,从事本专业技术工作15年以上,取得助理级职称5年以上。 4、企业及乡镇农业事业单位的技术骨干,不具备规定学历,取得市职称办认可的本专业或相关专业的大专专业证书,从事本专业技术工作15年以上,取得助理级职称5年以上。 5、中专毕业后连续从事本专业技术工作15年以上。 破格人员应参加面试,并对照破格条件进行申报评审。 破格申报人员任现职以来的年度考核必须为称职(合格)以上,其中至少有1次为优秀。 (二)专业技术工作经历(能力)要求有独立完成本专业技术工作的经历,具有解决较复杂技术问题的能力,具有一定的综合、分析、判断、总结和组织协调的能力,并能撰写技术、工程、业务报告。 在任助理工程师期间,具备下列条件之一:(一)作为技术骨干,完成过县(局)级科研项目或课题;(二)作为技术骨干,完成过县(局)级以上工程项目的研究、设计、施工、制造、生产管理工作;(三)参加过一项中型工程新建、扩建或技术改造项目的研究、设计、施工、设备安装调试工作;(四)完成本企业主导产品的开发、设计、制造、工艺和生产管理工作;(五)独立负责生产设备维护和管理工作,能及时发现和排除较复杂的技术故障;(六)完成本产品的技术分析和市场分析,被单位采纳,经实践验证,基本正确;(七)完成对本单位有指导作用的有关情报资料的搜集、整理、汇编、提出系统报告;(八)参加过一项中型成套工程项目国内外投标、承包、施工、验收任务;(九)参加过中型企业中精密、大型、稀有、生产制造关键设备等复杂设备维修工作的全过程或重要成套设备的维护、维修,保证设备正常运行; (十)作为主要技术骨干推广应用有一定水平的新技术、新工艺、新产品、新材料三项以上,并经主管部门鉴定认可;(十一)作为主要技术骨干在两项市级以上重点工程项目的设计、施工、建设中发挥过重要作用。 (三)业绩成果要求任助理工程师期间,具备下列条件之一:(一)市(厅)级科技进步三等奖(姑苏杯奖、优秀勘察、设计奖等相应奖项)以上获奖项目的主要完成人(以奖励证书为准);或县(局)级科技进步二等奖获奖项目的获奖者前五名(以奖励证书为准);(二)县(局)级重点项目或对行业发展有重要促进作用的重点项目的研究、设计、施工、制造、生产技术管理及相关任务的主要完成者,成果通过鉴定或验收;(三)作为技术骨干完成一项中型或两项小型工程项目研究、设计、施工、安装调试任务,经实践检验,达到了要求,通过鉴定或验收;(四)作为技术骨干完成两项有一定技术难度的产品、项目或关键部件的研究、设计、施工、制造、生产技术管理,经同行专家评审或鉴定,达到一定水平,取得一定经济效益或社会效益;(五)完成一项科技成果推广、应用新工艺、新技术、新材料,并转化为生产力,经实践检验,取得一定的经济效益或社会效益;(六)完成一项技术或工艺革新,提高生产力,取得一定经济效益;(七)取得发明专利一项,并转化为生产力,取得一定经济效益或社会效益;(八)提出一项科技建议,为县(局)级有关部门采纳,经同行专家评议认为对科技进步和行业发展有促进作用;(九)解决设计、生产、施工中疑难技术问题,取得较好效果,经行业主管部门认可;(十)参加过一项国家、地方、行业技术标准或重点产品标准的制定,并获批准公布,用于生产实践;(十一)负责完成一项生产工艺、流程的改革,对企业生产技术革新起到推动作用,取得较好效果。 (四)论文要求任助理工程师期间,撰写本专业有一定学术水平的学术论文、技术报告、专业总结,具备下列条件之一:(一)在市级以上专业刊物公开发表或市级以上学术会议上宣读有较高学术价值的本专业论文2篇以上;(二)为解决较复杂技术问题而撰写的有一定水平的技术报告、有一定水平的项目的立项研究(论证)报告或专业总结2篇以上;二、延迟申报对象任现职期间出现如下情况之一,在规定的年限上延迟申报:1、受单位通报批评者,延迟1年以上申报;2、受记过以上处分者,延迟2年以上申报;3、弄虚作假,伪造学历、资历,剽窃他人成果者,延迟3年以上申报。 三、报送材料的内容1、专业技术资格评审表一式二份;2、苏州市申报中级职称人员情况简介表一式十二份;3、任职期内的专业工作情况,考核情况、业务培训及继续教育证书;4、任现职以来的技术工作业务总结;5、任现职以来的专业技术成果及其获奖情况、专业技术项目完成情况、高新技术成果转化情况以及新产品开发、推广等方面的资料;6、任现职以来的本专业(学科)正式发表的论文2篇、或研究报告等2篇以上;7、职称计算机应用能力考核合格证原件和复印件、考试有效成绩证明及准考证;8、学历证书、学位证书、原职称评审申报(初定)表或批文、专业技术职称证书的原件和复印件;9、有效劳动合同或聘约复印件;10、身份证原件和复印件,大一寸免冠照片一张(资格证书用);11、材料目录及评委会需要的其他材料。 申报材料应当按要求提供原件,无法提供原件的,各市、区、局应对各类证书、作品复印件与原件进行核对,核对后在复印件上签署核对无误的字样,验证人签字并加盖公章。 不具备规定学历、资历的人员需报送破格答辩表及符合有关破格条件的材料。 上述材料除1、2项外,其余均按规定装订在专业技术职称评审材料内。 增补材料作为附件另外装订。 四、报送评审材料的要求1、各单位要严格按照省职称办有关文件的规定,认真做好评审材料真实性的核实工作。 学历、资历、职称计算机成绩等都必须真实且符合规定,核实人应签名并盖单位公章。 材料书写要清晰、工整,材料装订要规范,手续要完备齐全。 2、技术业务工作总结要全面、真实客观地反映申报人任职以来的工作情况、业务能力、技术水平和工作业绩。 总结一般可分为五个部分:一是个人简历;二是参加过何种继续教育(培训、进修、学习)及目前的学术水平;三是主要工作业绩奖励情况;四是项目、论文等作品情况;五是申报理由。 破格晋升的人员应对照工程师评审条件写出破格晋升的理由,并附上破格答辩表,具体的破格晋升条件及证明(作品)材料。 3、破格及非本专业申报工程师应参加面试答辩,面试组织部门将面试结果附入评审材料。 申报材料和各类表格式样必须按苏州市职称办规定及要求准备和装订。 五、职称计算机要求申报晋升工程师资格者计算机应用能力要求应符合省市职称工作领导小组印发的资格条件。 1、参加职称计算机应用能力考核,计算机应用技能符合实际工作岗位需要;或参加IT专业技术人员信息化素质培训,取得《IT信息化素质培训考核合格证》;2、计算机专业大学专科以上;3、参加全国计算机软件专业技术资格(水平)考试,成绩合格者。

加工中心可以车涡杆吗,跟数控车床比的话,哪个效率高?

车加工中心适合加工蜗杆,由于车加工中心可以实行自动换刀,它的加工效率更高。

商品的条形码有什么作用?

条形码技术的应用是实现现代化管理的必要手段,其优越性是众所周知的,无论工业领域如何发展,条形码却是实现工业自动化的必由之路。 随着国内工业技术的发展,已有不少工厂实现了条形码的销售管理、库存管理和生产过程管理。 1条形码及条形码制条形码技术 是把计算机所需的数据用一种条形码来表示,然后将条形码数据转换成计算机可以自动阅读的数据。 条形码技术包括条形码编制规则,条形码译码技术,条形码印刷技术,数据通讯技术及计算机技术等,它是一门综合技术。 任何一种条形码都是按照预先规定的条形码编码规则和有关技术标准,由条和空组合而成。 到目前为止,世界上共有四十多种条形码码制。 一般在物流管理中可采用交叉二五码,它的特点是符号占用空间小,信息密度较大。 根据条形码符号所代表的数据结构和所能编码的数据类型,我们在空调器生产中选用了交叉二五码。 条形码校验位的计算方法:在条形码数据中按一、三的循环加权后得出的总和,然后用10减去总和的个位数,所得值即为条形码最后一位的校验数据。 2条形码印刷 我们采用了日本SATO公司的M4800型热转印式条形码打印机,打印速度为125mm/s,其格式灵活,图象质量高,打印成本低,使用方便可靠,故障率低,其缺点是此种打印机速度稍慢。 它在微电脑的控制下完成条形码打印。 我们配置了日本NECPC980INS/E20型手提电脑(带20M硬盘,40M内存)。 条形码软件一般是用BASIC语言编制而成,比较简单,因考虑到打印机处理汉字的能力,最好是选用通过普通微机驱动可处理二级汉字库的条形码打印机,在条形码标签上,除了条形码之外,还应包括一些必要信息,如厂家的商标铭牌等,亦可事先在印刷载体上由不干胶条形码纸带生产厂家完成。 3条形码识别 条形码的识别都是通过条形码阅读器来完成的,它可分为光电扫描器和译码器,一般是组合在一起的。 美国METROLOGIC公司的MS720型阅读器是一种在线式激光扫描阅读器,扫描速度达2000线/秒,可靠扫描距离在7~15英寸区域内,在扫描区内有20条激光扫描线,分五个方向对条形码进行扫描,通过RS-232接口与计算机进行通讯,用DIP开关可选择12种条形码码制。 译码器的任务是将扫描器产生的信号按一定的条形码译码原理转换成计算机可以识别的数据,再传送至计算机中,译码器功能通常是由微处理机运行相应软件来实现,一只新的条形码阅读器须按用户所选择的码制,进行初始化编程:依次设定条形码码制→数据传输速率→条形码字符长度→定义奇偶校验位→条形码阅读器与计算机接口类型等。 译码器只有经过初始化编程之后才能识别用户所选择条形码码制。 通常将条形码阅读器与微机相连,或接至计算机终端上,只要将其输出与微机或终端机上并行接口或RS-232串口连接即可。 4条形码的校验 为了保证条形码的打印质量,应定期对所打印的条形码进行校验。 一般配制一台光笔式条形码扫描器即可。 如TBR-1100或THS-21S型已能满足要求,若有条件则可进一步配制高档的条形码检验机如CODEBARⅡ型:光源波长为633mm(红色光)/900mm(红外光),分辨率达2 5μm,其测定精度为±7 5μm,反射率测定范围0~100%,精度为±2%,若配上TP-32型打印机,即可得到一份完整的条形码检测报告。 5条形码应用系统的构成(见图所示)6条形码技术应用的几点体会自1994年起,我们率先在空调器生产中使用条形码一次性获得成功。 几年来,在推广和应用中积累了一些经验,主要有以下几点体会: ①条形码知识普及的重要性在推广使用中,要使管理层、操作层的人员都懂得条形码的原理,为什么要应用条形码技术以及在电脑系统中条形码的作用,应用条形码技术会对生产管理,质量管理产生的效率,使大家能够从思想上重视这项工作。 ②条形码的应用必须各部门密切配合条形码的应用涉及到产品编号、条形码打印、条形码粘贴、条形码扫描等多个环节,必须由生产部门、质检部门、设备部门等分工合作才能完成。 一般产品条形码采取集中打印,具体的打印数量,粘贴可由生产车间完成,应指定专人操作与维护,并对其进行技术培训,条形码扫描由质检部门完成。 当条形码信息出错时要及时处理,更需要上层领导的协调和全力支持。 ③利用条形码,通过电脑系统进行有效的管理,是应用条形码技术的关键应用条形码技术进行管理的目的是既保证了产品信息的快速,准确输入,以防止手工输入所造成的漏洞,又能为管理者提供每个产品的各种数据,我们在空调器商品检验中使用了条形码技术,为每一台产品建立起出厂前的质量档案,有效地提供了各种信息。 ④制定条形码管理的规章制度条形码应用必须依照一定的规则,要符合其科学性,建立起整个产品的编码体系、内部条形码生成规则、条形码打印制度、条形码粘贴规范、产品使用条形码制度、并且将生产车间的条形码利用率作为一项经济技术指标来考核等。 参考资料:

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐