<面试必过系列>2021最新JVM大厂必问面试题【附解答】

数字追月使
• 阅读 1204
点赞再看,养成好习惯!

嗨咯,大家好,今天给大家整理了一些JVM必问的大厂面试题,起因是我的学弟在网上刷了无数面试题,然后前两天信心满满的去阿里面试,没想到在一面的时候被HR问到 “如何判断一个对象是否存活?(或者 GC 对象的判定方法)” 然后卡壳了....我真的想敲死他,这个不是我跟他讲过的要看的知识点吗?

<面试必过系列>2021最新JVM大厂必问面试题【附解答】

然后学弟弱弱的跟我讲,他刷了网上很多面试题,但是没有看到这道题。当时我的内心一万个草泥马跑过...好吧,为了让大家不在JVM这个题目上被刷下来,我特意去看了今年所有大厂的面试题,整理出下面这些JVM必问面试题

作为阅读福利小编也把所有的题目+解答整理成了PDF文档,如果需要的可以自行下载
JVM大厂必问面试题【附解答】

<面试必过系列>2021最新JVM大厂必问面试题【附解答】

1. 内存模型以及分区,需要详细到每个区放什么。

JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面,class 类信息常量池(static 常量和 static 变量)等放在方法区new:

  • 方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字节码)等数据
  • 堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要在堆上分配
  • 栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,局部变量表存放的是 8 大基础类型加上一个应用类型,所以还是一个指向地址的指针
  • 本地方法栈:主要为 Native 方法服务
  • 程序计数器:记录当前线程执行的行号

2. 堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。

堆里面分为新生代和老生代(java8 取消了永久代,采用了 Metaspace),新生代包含 Eden+Survivor 区,survivor 区里面分为 from 和 to 区,内存回收时,如果用的是复制算法,从 from 复制到 to,当经过一次或者多次 GC 之后,存活下来的对象会被移动到老年区,当 JVM 内存不够用的时候,会触发 Full GC,清理 JVM 老年区当新生区满了之后会触发 YGC,先把存活的对象放到其中一个 Survice区,然后进行垃圾清理。因为如果仅仅清理需要删除的对象,这样会导致内存碎片,因此一般会把 Eden 进行完全的清理,然后整理内存。那么下次 GC 的时候,就会使用下一个 Survive,这样循环使用。如果有特别大的对象,新生代放不下,就会使用老年代的担保,直接放到老年代里面。因为 JVM 认为,一般大对象的存活时间一般比较久远。

3. 对象创建方法,对象的内存分配,对象的访问定位。

new 一个对象

4. GC 的两种判定方法:

  • 引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为 0 就会回收但是 JVM 没有用这种方式,因为无法判定相互循环引用(A 引用 B,B 引用 A)的情况
  • 引用链法: 通过一种 GC ROOT 的对象(方法区中静态变量引用的对象等-static 变量)来判断,如果有一条链能够到达 GC ROOT 就说明,不能到达 GC ROOT 就说明可以回收

5. SafePoint 是什么

比如 GC 的时候必须要等到 Java 线程都进入到 safepoint 的时候 VMThread 才能开始
执行 GC

  1. 循环的末尾 (防止大循环的时候一直不进入 safepoint,而其他线程在等待它进入safepoint)
  2. 方法返回前
  3. 调用方法的 call 之后
  4. 抛出异常的位置

6. GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

先标记,标记完毕之后再清除,效率不高,会产生碎片

复制算法:分为 8:1 的 Eden 区和 survivor 区,就是上面谈到的 YGC

标记整理:标记完毕之后,让所有存活的对象向一端移动

7. GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。

并行收集器:串行收集器使用一个单独的线程进行收集,GC 时服务有停顿时间

串行收集器:次要回收中使用多线程来执行

CMS 收集器是基于“标记—清除”算法实现的,经过多次标记才会被清除

G1 从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个 Region 之间)上来看是基于“复制”算法实现的

8. Minor GC 与 Full GC 分别在什么时候发生?

新生代内存不够用时候发生 MGC 也叫 YGC,JVM 内存不够的时候发生 FGC

9. 几种常用的内存调试工具:jmap、jstack、jconsole、jhat

jstack 可以看当前栈的情况,jmap 查看内存,jhat 进行 dump 堆的信息mat(eclipse 的也要了解一下)

10. 类加载的几个过程:

加载、验证、准备、解析、初始化。然后是使用和卸载了通过全限定名来加载生成 class 对象到内存中,然后进行验证这个 class 文件,包括文件格式校验、元数据验证,字节码校验等。准备是对这个对象分配内存。解析是将符号引用转化为直接引用(指针引用),初始化就是开始执行构造器的代码

11.JVM 内存分哪几个区,每个区的作用是什么?

java 虚拟机主要分为以下一个区:

方法区:

  1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生 GC,在这里
    进行的 GC 主要是对方法区里的常量池和对类型的卸载
  2. 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后
    的代码等数据。
  3. 该区域是被线程共享的。
  4. 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池
    具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量
    池中。

虚拟机栈:

  1. 虚拟机栈也就是我们平常所称的栈内存,它为 java 方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等,会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。
  2. 虚拟机栈是线程私有的,它的生命周期与线程相同。
  3. 局部变量表里存储的是基本数据类型、returnAddress 类型(指向一条字节码指令的地址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对象的句柄或者与对象相关联的位置。局部变量所需的内存空间在编译器间确定

4.操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索引来访问,而是压栈和出栈的方式

5.每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接引用。

本地方法栈

本地方法栈和虚拟机栈类似,只不过本地方法栈为 Native 方法服务。堆java 堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。

程序计数器

内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区域是唯一一个 java 虚拟机规范没有规定任何 OOM 情况的区域。

觉得本篇文章对你有帮助的话,记得点赞+收藏+转发!!!由于篇幅问题,我就不在这里一一展示了,需要JVM必问面试题的朋友,可以自行领取 JVM大厂必问面试题【附解答】

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
2021 最新 Java 面试题出炉!(带全部答案)
本文纯粉丝福利,非广告!大家好,给大家带来一套2021 最新整理的 Java面试题,独家整理!!题库非常全面,包括Java集合、JVM、多线程、Spring全家桶、Redis、Dubbo、Netty、Elasticsearch、大数据、阿里巴巴等大厂面试题等。获取方式:点击关注下面的公众号回复:福利
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
JAVA面试题汇总
没有什么套路,就是直接上干货!!!最新Java面试题汇总整理连答案一块儿分享给大家,希望对大家有帮助~之后还会推出Java面试题系列文章,敬请关注!按照技术模块:Java热点技术、多线程、微服务、JVM、Redis、消息队列、SQL相关的面试题。不要走开,稍后更精彩!1、面向对象的特点有哪些?抽象、继承、封装、多态。2、接口和抽象类
可莉 可莉
3年前
2021 最新 Java 面试题出炉!(带全部答案)
本文纯粉丝福利,非广告!大家好,给大家带来一套2021 最新整理的 Java面试题,独家整理!!题库非常全面,包括Java集合、JVM、多线程、Spring全家桶、Redis、Dubbo、Netty、Elasticsearch、大数据、阿里巴巴等大厂面试题等。获取方式:点击关注下面的公众号回复:福利
Stella981 Stella981
3年前
JVM&NIO&HashMap简单问
_JVM&NIO&HashMap简单问_背景:前几天在网上看到关于JVM&NIO&HashMap的一些连环炮的面试题,整理下以备不时之需。_一、JVM_Java的虚拟机的面试内容主要包括GC、类加载机制和内存三大部分。如下是一个一个GC部分简单的连环炮:问:什么时候一个对象会被GC?答:当没有任何对象的引用指向该对
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这