Java语言区别于其他计算机语言的最大特点就是面向对象性,也被称为与平台无关的编程语言,java能实现这样的特点,就是因为JVM虚拟机的作用,因此关于JVM的知识点都是需要大家掌握的。下面整理了10道JVM面试题,是在java面试中考察几率最大的题目,一起来学习吧。

1.什么情况下会发生栈内存溢出?

  • 栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表又包含基本数据类型,对象引用类型;
  • 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常,方法递归调用产生这种结果;
  • 如果Java虚拟机栈可以动态扩展,并且扩展的动作已经尝试过,但是无法申请到足够的内存去完成扩展,或者在新建立线程的时候没有足够的内存去创建对应的虚拟机栈,那么Java虚拟机将抛出一个OutOfMemory异常;
  • 参数-Xss 去调整JVM栈的大小。

2、介绍JVM内存模型

JVM内存结构如下:

  • 程序计数器:当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有。
  • Java虚拟栈:存放基本数据类型、对象的引用、方法出口等,线程私有。
  • Native方法栈:和虚拟栈相似,只不过它服务于Native方法,线程私有。
  • Java堆:java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享。
  • 方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。(即永久带),回收目标主要是常量池的回收和类型的卸载,各线程共享。

3.JVM内存新生代中为什么要分为Eden和Survivor?

  • 如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC.老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多,所以需要分为Eden和Survivor;
  • Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代;
  • 设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

4.JVM的永久代中会发生垃圾回收吗?

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)。

5.什么是类加载器,类加载器有哪些?

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。主要有以下四种类加载器:

  • 启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用;
  • 扩展类加载器(extensions class loader):它用来加载java的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载java类;
  • 系统类加载器(system class loader):它根据java应用的类路径(CLASSPATH)来加载Java类。一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它;
  • 用户自定义类加载器,通过继承 java.lang.ClassLoader类的方式实现。

6.简述java类加载机制?

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。

7.类加载器双亲委派模型机制?

当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

8.Java对象创建过程?

  • JVM遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用,然后加载这个类;
  • 为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本地线程缓冲分配(TLAB)”;
  • 将除对象头外的对象内存空间初始化为0;
  • 对对象头进行必要设置。

9.对象分配的规则?

  • 对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC;
  • 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存);
  • 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,直到达到阀值对象进入老年区。
  • 动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
  • 空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。

10.描述一下JVM加载class文件的原理机制?

JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。 类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。

JVM使java成为应用程序可以运行在任意的平台变成可能,不需要程序员为每一个平台单独重写或者是重新编译。所以需要大家对JVM的内容熟练掌握,上面的JVM面试题是学习虚拟机的基础知识,也是在java面试中常考到的题目,希望朋友们可以好好学习JVM的相关知识,同时也可以更多的学习和关注[java面试题],这样才能在众多面视者中脱颖而出。
阿里巴巴编码规范 基础技能认证 考题分析(考题+答案)_链接:https://pan.baidu.com/s/1CTGGf4IM-mDKU4FO82yAMw
提取码:r7y9

面试必学JVM面试题(附答案)相关推荐

  1. 【Java面试宝典】1000+面试题附答案详解,最全面详细

    进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里.美团.滴滴.头条等大厂面试大全,其中概括的知识点有:Java.MyBatis.ZooKeeper.Dubbo.Elast ...

  2. 10个外企面试必问的问题!附答案和HR意图

    最近有人私信问我,怎么进外企?以软件测试行业为例,整理了10个外企面试时一般会提问的问题,同时附上HR问这些问题背后的意思以及个人认为比较好的答案.最后也有一些外企的笔试面试题赠送.希望对大家有所帮助 ...

  3. java高并发面试题目_列举Java高并发面试题附答案解析

    Java高并发面试题是程序员面试过程中的必修课,只有熟练掌握这些技术要点,在我们的学习中才会脱颖而出,在这里,达内石家庄Java培训老师作深入解答. Java并发面试题附答案 1. 什么是原子操作?在 ...

  4. 美图php面试题目,据说是雅虎的一份PHP面试题附答案

    据说是雅虎的一份PHP面试题附答案 更新时间:2009年01月07日 23:23:32   作者: 雅虎的一份PHP面试题附答案 从网上搜集到的,据说是雅虎的面试题. 1. Which of the ...

  5. Jvm面试题及答案 100道(持续更新)

    最新Jvm面试题及答案[附答案解析]Jvm面试题及答案2021,Jvm面试题最新面试题,Jvm面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的.这些答案难免会存在一些错 ...

  6. Jvm面试题及答案(300道 Jvm面试题大全带答案)

    最新Jvm面试题及答案[附答案解析]Jvm面试题大全带答案,Jvm面试题最新面试题,Jvm面试题新答案已经全部更新完了,有些答案是自己总结的,也有些Jvm面试题答案是在网上搜集整理的.这些答案难免会存 ...

  7. JVM面试题及答案整理(最新版)

    Jvm面试题及答案整理965道(2021最新版) 这是我收集的<Jvm 最常见的 965道面试题>高级Java面试问题列表.这些问题主要来自 JVM核心部分 ,你可能知道这些棘手的JVM ...

  8. 微软经典面试题(附答案)

    微软经典面试题(附答案) 想要公司盈利?还得依靠系统!-在线咨询! 2006-08-08 14:07 来源: 名牌有名牌的理由,就连招聘也与众不同.微软公司的招聘一向都是人们议论的话题,说它百般刁难的 ...

  9. 2021 年大厂面试高频架构题汇总(附答案详解)

    金九银十到了,有很多即将面试的朋友咨询怎么做准备.这里必须要和大家再强调一下要准备的7大方面!总结起来包括:1至2门你最熟悉的编程语言+数据结构和算法题+计网+操作系统+设计模式+数据库+开发框架. ...

最新文章

  1. redis常用命令参考
  2. 【Java】Java连接Mysql数据库的demo示例
  3. Linux文本过滤与处理命令
  4. 这次,带你做一个属于自己的无人机!
  5. 1061 判断题(PAT乙级 C++)
  6. 新版ipados可以编辑C语言吗,iPadOS新增了五个有用的功能,看你需不需要
  7. 设计模式学习(三)——单例模式
  8. 【codevs1174】 靶形数独,暴力解决问题
  9. backbonejs中的集合篇(一)
  10. Linux-lamp
  11. 【每日scrum】NO.7
  12. Tomcat 服务器状态监控显示PS Survivor Space 99%
  13. WTS 2.1.18124.1 彻底抛弃了 15063(Win 10 创意者更新)
  14. 综述:基于影像基因组学的肺癌诊断治疗方法研究
  15. jsp怎么设置页面背景
  16. 2022年女性精致美学白皮书
  17. Mysql+Echarts+Python+Flask实现前后端交互及数据可视化
  18. Java语言程序设计与数据结构(进阶篇)梁勇课后题ex——19
  19. 2020年第十七届中国研究生数学建模竞赛B题 -解题思路
  20. git基础配置/SSH

热门文章

  1. Linux /etc/passwd和etc/shadow 详解
  2. 【图像分割】基于matlab形态学重建和过滤改进FCM算法(FRFCM)的图像分割【含Matlab源码 085期】
  3. Gradle加速编译
  4. 如果软件测试都做不好,你还想做开发?
  5. 我的校园visio拓扑图
  6. python 词表里的词不符合_教你背单词 | 利用python分析考研英语阅读并生成词频降序表...
  7. react+umi 使用本地图片做菜单icon
  8. Win11怎么将软件图标固定到任务栏上?
  9. 微信小程序获取头像 、填写昵称
  10. ubuntn18.04安装LabelImg