JVM-面试题

这篇具有很好参考价值的文章主要介绍了JVM-面试题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、对象

1、对象创建

  • 类加载检查
    • 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池定位到类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过。若没有,必须先执行类加载过程。
  • 分配内存
    • 类加载检查通过后,jvm将为新生对象分配内存,对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从java堆中划分出来。
      • 指针碰撞
        • 适合场景:堆内存规整(即没有内存碎片)的情况下
        • 原理:用过的内存全部整合到一边,没用过的放在另一边,中间有一个分界值指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可:
        • GC收集器:Serial、ParNew
      • 空虚列表
        • 适合场景:堆内存不规整的情况下
        • 原理:康拟机会维护一个列表,该列表中会记录哪些内存块是可用的,在分配的时候,找一块足够大的内存块来划分给对象实例,最后更新列表记录。
        • GC收集器:CMS
      • 并发的时候
        • 采用CAS 配上失败重试的方式保证更新操作的原子性
        • TLAB:为每一个线程预先在 Eden 区分配一块儿内存,JVM 在给线程中的对象分配内存时,首先在 TLAB 分配,当对象大于 TLAB 中的剩余内存或 TLAB 的内存己用尽时,再采用止述的 CAS 进行内存分配
  • 初始化零值
    • 内存分配完成后,虚拟机需要将分配到的内在空回都初始化为零值 (不包括对象头),这一步操作保证了对象的实例字段在 Java 代码中可以不賦初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。
  • 设置对象头
    • 初始化零值完成之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。这些信息存放在对象头中。另外,根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置方式。
  • 执行init()方法
    • 在上面工作都完成之后,从jvm的视角来看,一个新的对象已经产生了,但从Java 程序的视角来看,对象创建才刚开始,init方法还没有执行,所有的字段都还为零。所以一般来说,执行 new指令之后会接者执行init方法,把对象按照程序员的意愿进行初始化。

2、对象在内存的布局

  • 对象头:第一部分用于存储对象自身的运行时数据(哈希码、GC分代年龄、锁状态等),另一部分时类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
  • 实例数据:对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容
  • 对齐填充:仅仅起占位作用(Hotspot 虚拟机的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍)

3、对象访问文章来源地址https://www.toymoban.com/news/detail-830046.html

  • 句柄:Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息
  • 直接指针:reference 中存储的直接就是对象的地址
    • 优点:句柄-reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数

到了这里,关于JVM-面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jvm基础面试题

    JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的method area。 Executio

    2024年02月09日
    浏览(29)
  • 面试八股——JVM★

    类加载 类加载器的定义 类加载器的类别 类装载的执行过程 类的装载过程: 加载: 验证: 准备: 这里设置初始值并不是传统意义的设置初始值(那个过程在初始化阶段)。 解析: 初始化: 使用: 类的回收(被垃圾器回收) 回收时机 垃圾定位——可达性分析法 可作为

    2024年04月23日
    浏览(25)
  • JVM-面试题

    1、对象创建 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池定位到类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过。若没有,必须先执行类加载过程。 分配内存 类加载检查通过后,jvm将为新生对象分配内存

    2024年02月20日
    浏览(25)
  • 【高频面试题】JVM篇

    JVM是什么: JVM(Java虚拟机)是Java程序的 运行环境 ,它是Java平台的核心组成部分之一。JVM提供了一个 运行Java字节码的虚拟机 ,负责将 Java程序解释和执行。 Java程序员可以在JVM上编写和运行Java程序,而 不用考虑底层操作系统的差异性 。JVM的特性使得Java具备了 跨平台性

    2024年02月13日
    浏览(29)
  • JVM相关面试题

    JVM 是Java Virtual Machine (Java虚拟机) 的缩写,是一个可以执行Java字节码的虚拟机进程 。是Java实现跨平台的最核心的部分 先编译,后解释执行 Java源文件 -- 编译器 -- class文件(虚拟指令)– Java虚拟机(JVM)– 解释为指令执行 前4个字节是固定的魔数,用于标识该文件是否为有

    2024年02月07日
    浏览(27)
  • 【JAVA面试】JVM

    提示:文章先作为初版,等后续时间充足后,补充更深的内容 JVM中的垃圾回收算法可以分为两种类型: 基于引用计数 的垃圾回收算法和 基于可达性分析 的垃圾回收算法。目前主流的JVM垃圾回收算法都是基于 可达性分析 的。 引用计数算法 引用计数算法是一种简单的垃圾回

    2024年02月03日
    浏览(28)
  • JVM面试篇

    当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从堆空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。 JVM包含 两个子系统 和 两个组件 两个子系统为 Class loader(类装载):根

    2024年02月14日
    浏览(47)
  • 12、JVM高频面试题

    JVM主要分为下面几部分 类加载器:负责将字节码文件加载到内存中 运行时数据区:用于保存java程序运行过程中需要用到的数据和相关信息 执行引擎:字节码文件并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎将字节码翻译成底层系统指令 本地库

    2024年02月03日
    浏览(29)
  • JVM面试题:①

    类加载器:有那些类装载器:根启动加载器、拓展类加载器、应用类加载器 双亲委派机制 Java类加载的沙箱安全机制 Java8以后得JVM 1.尚硅谷Java开发常见面试题详解https://blog.csdn.net/u011863024/article/details/114684428

    2024年01月20日
    浏览(33)
  • JVM(5)面试篇

    关联课程内容 基础篇-初识JVM 基础篇-Java虚拟机的组成 回答路径 JVM的定义 作用 功能 组成 1、定义: JVM 指的是Java虚拟机( Java Virtual Machine )。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件,Java虚拟机上可以运行Java、Kotlin、Scala、Groovy等语言。 启

    2024年02月21日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包