【Java八股-第十期】JVM - Java基础

提纲:

🔥JVM

  • 类加载器

    • 作用

    • JVM默认类加载器

    • 双亲委派模型

  • 运行时数据区

  • 执行引擎

  • 本地接口

  • JMM

🎈面试八股真题

  • 1、说说类加载与卸载

  • 2、简述一下JVM的内存模型

  • 3、说说堆和栈的区别

  • 4、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

  • 5、Java内存结构

  • 6、说说对象分配规则

  • 7、说说Java对象创建过程

  • 8、知道类的生命周期吗?

一、JVM

1. 类加载器

  • 作用:

    • 动态的将类的 class 加载至内存,防止一次性加载太多 class 导致程序崩溃,防止同一个类被重复加载

  • JVM 提供的默认类加载器:

    • 1、BootstrapClassLoader:负责加载 JDK 的核心类库,最顶层的类加载器,由 c++ 实现,是 JVM 的一部分

    • 2、ExtendClassLoader:负责加载 jre/lib/ext 目录下的类

    • 3、AppClassLoader:负责加载 ClassPath 路径下的所有 jar 和 class

  • 双亲委派模型

    • 原理:Extend 和 App 类加载器在调用 loadClass 方法时,会先调用 findLoadedClass 方法检查是否已经被加载,加载时会先委派给上层类加载器的进行加载,即调用 parent.loadClass 和 findBootstrapClass 方法,若上层类加载器没找到,则由自己加载,通过双亲委派模型可以防止类重复加载对内存的消耗,并可以使类有一个优先级的层次关系,防止 Java 的核心类被覆盖

    • 在调用 loadClass 方法加载类时,通过 Sychronized 锁保证线程安全

    • 破坏双亲委派模型:通过自定义类加载器,继承 ClassLoader 并重写 loadClass 方法的规则

2.运行时数据区

  • 堆内存

    • 存储对象实例,包括新生代和老年代

    • 对象头

      • Mark Word:包括对象的 hashcode,分代年龄 age,加锁情况

      • klass point:指向方法区中类的 klass 元信息

      • 数组长度(数组特有)

    • 对象的实例数据

  • 方法区

    • 类和方法的 klass 元信息

    • 常量池

    • 1.7 以前使用的 PermGen 永久代实现的方法区,1.8 之后使用的元空间实现的方法区,并将 static 静态变量和 StringTable 串池移动至堆内存,永久代的实现方式,堆内存与方法区在逻辑内存中是连续的空间,相当于是堆内存的一部分,因此可能会因为永久代空间不足引发 oom,元空间将方法区移动到了本地内存中,与堆空间的大小无关

  • 栈内存

    • 内部储存方法调用的栈帧

      • slot:栈帧中的局部变量表,存储基本类型和实例的引用

      • stack:操作栈

      • 动态链接

      • 方法返回地址

        • 即将返回值压入返回地址的调用栈,没有返回值的话,cpu 根据计数器调用程序的下一条指令

  • 程序计数器

  • 本地方法栈

  • 直接内存:ByteBuffer、CharBuffer 等 XXBuffer 类,可以通过 java 实现 NIO 的各种 XXChannel 类获得,也可以直接 new 创建,通过,NIO 解决了数据准备到内核缓冲区的阻塞,然而将数据从内核缓冲区拷贝至用户进程缓冲区仍要阻塞,ByteBuffer 通过内存映射的方式,使用户进程可以直接在内核的缓冲区中进行读写,不需要将数据拷贝至用户进程

  • # ByteBuffer 的垃圾回收,(Direct)ByteBuffer 通过 unsafe 来分配内存,并通过虚引用 Cleaner,将 ByteBuffer对象与一个 Deallocate接口绑定,在垃圾回收 ByteBuffer 时,就会将虚引用放入引用队列,并在垃圾回收结束后由 Reference Handler 线程调用 Deallocate 接口进行资源回收

3.执行引擎

  • 及时编译器 JIT

  • 解释器

  • 垃圾回收器

4.本地接口

  • Native Interface本地接口

    • 本地接口的作用是融合不同的变成怨言为Java所用,他的初衷是融合c/c++程序,Java诞生的时候时c/c++横行的时候,要想立足,必须调用c/c++程序,于是在内存中专门开辟出一块区域处理标记为native的代码,他的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies。
      目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见了。因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service等等。

  • Native Method Stack

    • 它的具体做法是在Native Method Stack中登记native方法,在Execution Engine执行时加载本地方法库

5.JMM

  • Java 内存模型,控制 Java 线程之间的通信,决定一个线程对共享变量的写入何时对另一个线程可见,是一套内存使用规则

  • 程序运行时,将内存分为线程共享的主存和线程本地私有的工作内存,主存与工作内存和 JVM 的内存划分没有关系,线程对变量的所有操作都是在工作内存中完成,然后再刷新到主存

  • JMM 定义了重排序的 happens-before 原则,sychronized 锁与 volatile 关键字都是其中的规定,来限制指令的重排序

二、面试八股真题🎈🎈🎈

1、说说类加载与卸载

  • 加载过程


    • 其中验证,准备,解析合称链接
      • 加载通过类的完全限定名,查找此类字节码文件,利用字节码文件创建Class对象.

      • 验证确保Class文件符合当前虚拟机的要求,不会危害到虚拟机自身安全.

      • 准备进行内存分配,为static修饰的类变量分配内存,并设置初始值(0或null).不包含final修饰的静态变量,因为final变量在编译时分配.

      • 将常量池中的符号引用替换为直接引用的过程.直接引用为直接指向目标的指针或者相对偏移量等.

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

代码鹿のJAVA八股面试题总结 文章被收录于专栏

【📫专栏目录在最底部📫】 - 本专栏适合于JAVA已经入门的学生或人士,有一定的编程基础。 - 本专栏特点: 本专刊囊括了JAVA、Spring、计算机网路、操作系统、计算机网络、MySQL、算法与数据结构、中间件等一系列知识点,总结出了高频面试考点(附有答案),事半功倍,为大家春秋招助力。 - 本专栏内容分为五章

全部评论

相关推荐

从大一开始就开始学习Java,一路走来真的不算容易,每次面试都被压力,不过这次终于达成了自己的一大心愿!时间线和面经:8.17-投递9.1-一面实习+项目拷打看门狗机制讲一下redis加锁解锁的本身操作是什么Lua脚本是干什么的udp和tcp讲一下流量控制讲一下令牌桶算法说一下大端和小端是什么线程和协程有什么区别怎么切换协程切换的时候具体做了什么对于程序来说,你刚才提到的保存和恢复现场,这个现场有哪些信息udp优势现在有一个客户端和服务端,要实现TCP的通信,我们的代码要怎么写服务器怎么感知有新的连接怎么处理多个客户端的请求连接TCP怎么处理粘包和分包现在有两个文件,然后每个文件都有一亿条URL,每个的长度都很长,要怎么快速查找这两个文件共有的URLHashmap底层说一下怎么尽量提升插入和查询的效率如果要查找快,查询快,还有解决非空的问题,怎么做LoadingCache了解吗手撕:堆排序9.4-二面部门的leader,超级压力面拷打实习+项目,被喷完全没东西类的加载到垃圾回收整个底层原理讲一遍类加载谁来执行类加载器是什么东西,和进程的关系Java虚拟机是什么东西,和进程的关系如果我们要执行hello world,那虚拟机干了什么呢谁把字节码翻译成机器码,操作时机是什么Java虚拟机是一个执行单元吗Java虚拟机和操作系统的关系到底什么,假如我是个完全不懂技术的人,举例说明让我明白一个操作系统有两个Java程序的话,有几个虚拟机有没有单独的JVM进程存在启动一个hello world编译的时候,有几个进程JVM什么时候启动比如执行一条Java命令的时候对应一个进程,然后这个JVM虚拟机到底是不是在这个进程里面,还是说要先启动一个JVM虚拟机的进程垃圾回收机制的时机能手动触发垃圾回收吗垃圾回收会抢占业务代码的CPU吗垃圾回收算法简单说说垃圾回收机制的stop the world存在于哪些时机垃圾回收中的计算Region的时候怎么和业务代码并行执行假如只有一个线程,怎么实现并行Java为什么要这么实现Java效率比C++慢很多,那为什么还要这样实现Java虚拟机到底是什么形式存在的说一下Java和C++的区别还有你对Java设计理念的理解无手撕面试结束的时候,我真的汗流浃背了,面试官还和我道歉,说他是故意压力面想看看我的反应的,还对我给予了高度评价:我当面试官这么多年,你是我见过最好的一个9.9-三面临时通知的加面,就问了三十分钟项目9.11-hr面问过往经历,未来计划,想从腾讯实习中得到什么?当场告知leader十分满意我,所以直接ochr面完一分钟官网流程变成录用评估中,30分钟后mt加微信告知offer正在审批9.15-offer这一次腾讯面试体验真的不错,每个面试官能感觉到专业能力很强,反馈很足,比起隔壁某节真是好太多以后就是鹅孝子了
三本咋了:当面试官这么多年你是我见过的最好的一个
你面试被问到过哪些不会的...
点赞 评论 收藏
分享
09-15 10:09
门头沟学院 Java
迷茫的大四🐶:深信服可能点击就自动投递了
投递深信服等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务