听说又被 JVM 内存区域方面的面试题给虐了?看看这篇文章吧!
下图即是 Java 工具的建设进程,我提议最好是能默写出来,而且要把握每一步在做什么。 ![]() ①类加载搜查:假造机会到一条 new 指令时,起首将去搜查这个指令的参数是否能在常量池中定位到这个类的标记引用,而且搜查这个标记引用代表的类是否已被加载过、理会和初始化过。假如没有,那必需先执行响应的类加载进程。 ②分派内存:在类加载搜查通事后,接下来假造机将为新生工具分派内存。工具所需的内存巨细在类加载完成后便可确定,为工具分派空间的使命等同于把一块确定巨细的内存从 Java 堆平分别出来。分派方法有“指针碰撞”和“空闲列表”两种,选择那种分派方法由 Java 堆是否规整抉择,而Java堆是否规整又由所回收的垃圾网络器是否带有压缩清算成果抉择。 内存分派的两种方法:(增补内容,必要把握) 选择以上两种方法中的哪一种,取决于 Java 堆内存是否规整。而 Java 堆内存是否规整,取决于 GC 网络器的算法是"标志-破除",照旧"标志-清算"(也称作"标志-压缩"),值得留意的是,复制算法内存也是规整的 ![]() 内存分派并发题目(增补内容,必要把握) 在建设工具的时辰有一个很重要的题目,就是线程安详,由于在现实开拓进程中,建设工具是很频仍的工作,作为假造机来说,必必要担保线程是安详的,凡是来讲,假造机回收两种方法来担保线程安详:
③初始化零值:内存分派完成后,假造机必要将分派到的内存空间都初始化为零值(不包罗工具头),这一步操纵担保了工具的实例字段在 Java 代码中可以不赋初始值就直接行使,措施能会见到这些字段的数据范例所对应的零值。 ④配置工具头:初始化零值完成之后,假造神秘对工具举办须要的配置,譬喻这个工具是谁人类的实例、怎样才气找到类的元数据信息、工具的哈希吗、工具的 GC 分代年数等信息。这些信息存放在工具头中。其它,按照假造机当前运行状态的差异,如是否启用方向锁等,工具头会有差异的配置方法。 ⑤执行 init 要领:在上面事变都完成之后,从假造机的视角来看,一个新的工具已经发生了,但从 Java 措施的视角来看,工具建设才刚开始, 3.2 工具的内存机关 在 Hotspot 假造机中,工具在内存中的机关可以分为3块地区:工具头、实例数据和对齐添补。 Hotspot假造机的工具头包罗两部门信息,第一部门用于存储工具自身的自身运行时数据(哈希码、GC分代年数、锁状态符号等等),另一部门是范例指针,即工具指向它的类元数据的指针,假造机通过这个指针来确定这个工具是谁人类的实例。 实例数据部门是工具真正存储的有用信息,也是在措施中所界说的各类范例的字段内容。 对齐添补部门不是肯定存在的,也没有什么出格的寄义,仅仅起占位浸染。由于Hotspot假造机的自动内存打点体系要求工具起始地点必需是8字节的整数倍,换句话说就是工具的巨细必需是8字节的整数倍。而工具头部门正好是8字节的倍数(1倍或2倍),因此,当工具实例数据部门没有对齐时,就必要通过对齐添补来补全。 3.3 工具的会见定位 成立工具就是为了行使工具,我们的Java措施通过栈上的 reference 数据来操纵堆上的详细工具。工具的会见方法有假造机实现而定,今朝主流的会见方法有①行使句柄和②直接指针两种:
![]()
![]() (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |