加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

听说又被 JVM 内存区域方面的面试题给虐了?看看这篇文章吧!

发布时间:2019-04-01 06:06:50 所属栏目:站长百科 来源:Java填坑之路
导读:根基题目 先容下 Java 内存地区(运行时数据区) Java 工具的建设进程(五步,提议能默写出来而且要知道每一步假造机做了什么)工具的会见定位的两种方法(句柄和直接指针两种方法) 拓展题目 String类和常量池8种根基范例的包装类和常量池 一 概述 对付 Java 程

下图即是 Java 工具的建设进程,我提议最好是能默写出来,而且要把握每一步在做什么。

传闻又被 JVM 内存地区方面的口试题给虐了?看看这篇文章吧!

①类加载搜查:假造机会到一条 new 指令时,起首将去搜查这个指令的参数是否能在常量池中定位到这个类的标记引用,而且搜查这个标记引用代表的类是否已被加载过、理会和初始化过。假如没有,那必需先执行响应的类加载进程。

②分派内存:在类加载搜查通事后,接下来假造机将为新生工具分派内存。工具所需的内存巨细在类加载完成后便可确定,为工具分派空间的使命等同于把一块确定巨细的内存从 Java 堆平分别出来。分派方法有“指针碰撞”和“空闲列表”两种,选择那种分派方法由 Java 堆是否规整抉择,而Java堆是否规整又由所回收的垃圾网络器是否带有压缩清算成果抉择。

内存分派的两种方法:(增补内容,必要把握)

选择以上两种方法中的哪一种,取决于 Java 堆内存是否规整。而 Java 堆内存是否规整,取决于 GC 网络器的算法是"标志-破除",照旧"标志-清算"(也称作"标志-压缩"),值得留意的是,复制算法内存也是规整的

传闻又被 JVM 内存地区方面的口试题给虐了?看看这篇文章吧!

内存分派并发题目(增补内容,必要把握)

在建设工具的时辰有一个很重要的题目,就是线程安详,由于在现实开拓进程中,建设工具是很频仍的工作,作为假造机来说,必必要担保线程是安详的,凡是来讲,假造机回收两种方法来担保线程安详:

  • CAS+失败重试:CAS 是乐观锁的一种实现方法。所谓乐观锁就是,每次不加锁而是假设没有斗嘴而去完成某项操纵,假如由于斗嘴失败就重试,直到乐成为止。假造机回收 CAS 配上失败重试的方法担保更新操纵的原子性。•TLAB:为每一个线程预先在Eden区分派一块儿内存,JVM在给线程中的工具分派内存时,起首在TLAB分派,当工具大于TLAB中的剩余内存或TLAB的内存已用尽时,再回收上述的CAS举办内存分派

③初始化零值:内存分派完成后,假造机必要将分派到的内存空间都初始化为零值(不包罗工具头),这一步操纵担保了工具的实例字段在 Java 代码中可以不赋初始值就直接行使,措施能会见到这些字段的数据范例所对应的零值。

④配置工具头:初始化零值完成之后,假造神秘对工具举办须要的配置,譬喻这个工具是谁人类的实例、怎样才气找到类的元数据信息、工具的哈希吗、工具的 GC 分代年数等信息。这些信息存放在工具头中。其它,按照假造机当前运行状态的差异,如是否启用方向锁等,工具头会有差异的配置方法。

⑤执行 init 要领:在上面事变都完成之后,从假造机的视角来看,一个新的工具已经发生了,但从 Java 措施的视角来看,工具建设才刚开始,要领还没有执行,全部的字段都还为零。以是一样平常来说,执行 new 指令之后会接着执行要领,把工具凭证措施员的意愿举办初始化,这样一个真正可用的工具才算完全发生出来。

3.2 工具的内存机关

在 Hotspot 假造机中,工具在内存中的机关可以分为3块地区:工具头、实例数据和对齐添补。

Hotspot假造机的工具头包罗两部门信息,第一部门用于存储工具自身的自身运行时数据(哈希码、GC分代年数、锁状态符号等等),另一部门是范例指针,即工具指向它的类元数据的指针,假造机通过这个指针来确定这个工具是谁人类的实例。

实例数据部门是工具真正存储的有用信息,也是在措施中所界说的各类范例的字段内容。

对齐添补部门不是肯定存在的,也没有什么出格的寄义,仅仅起占位浸染。由于Hotspot假造机的自动内存打点体系要求工具起始地点必需是8字节的整数倍,换句话说就是工具的巨细必需是8字节的整数倍。而工具头部门正好是8字节的倍数(1倍或2倍),因此,当工具实例数据部门没有对齐时,就必要通过对齐添补来补全。

3.3 工具的会见定位

成立工具就是为了行使工具,我们的Java措施通过栈上的 reference 数据来操纵堆上的详细工具。工具的会见方法有假造机实现而定,今朝主流的会见方法有①行使句柄和②直接指针两种:

  • 句柄:假如行使句柄的话,那么Java堆中将会分别出一块内存来作为句柄池,reference 中存储的就是工具的句柄地点,而句柄中包括了工具实例数据与范例数据各自的详细地点信息;
传闻又被 JVM 内存地区方面的口试题给虐了?看看这篇文章吧!
  • 直接指针: 假如行使直接指针会见,那么 Java 堆工具的机关中就必需思量怎样安排会见范例数据的相干信息,而reference 中存储的直接就是工具的地点。
传闻又被 JVM 内存地区方面的口试题给虐了?看看这篇文章吧!

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读