Java JVM虚拟机面试题

Java JVM虚拟机面试题

  • 前言
  • 1、ThreadLocal的底层原理和应用?
  • 2、Java中的锁池和等待池?
  • 3、wait(),yield(),join(),sleep()的区别?
  • 4、你们项⽬如何排查JVM问题?
  • 5、YGC和FGC发生时间?
  • 6、说说类加载器双亲委派模型?
  • 7、哪些对象可以作为 GC Root 呢?
  • 8、怎么确定⼀个对象是否可以回收?
  • 9、JVM参数有哪些?
  • 10、什么是STW?
  • 11、JVM原理及性能调优?
  • 12、什么是字节码?采用字节码的好处是什么?
  • 13、JVM的内存结构图?
  • 14、JVM 类加载加载过程?
  • 15、类加载器的种类?
  • 16、双亲委派模型?
  • 17、变量槽slot的理解?
  • 18、ThreadLocal 内存泄漏的原因?
  • 19、HotSpot内存布局?
  • 20、蓝绿发布、灰度发布、滚动发布?
  • 21、什么是TCP网络分层?
  • 22、什么是TCP的三次握手和四次挥手?
  • 23、TCP、HTTP和UDP协议的区别?
  • 24、浏览器输入一个www.daibu.com中间经历了什么?
  • 25、HTTP的状态码有哪些?
  • 总结


前言

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。

如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!

1、ThreadLocal的底层原理和应用?

  • 1、ThreadLocal是一个线程局部变量,底层是通过ThreadLocalMap来实现的,Map的key是ThreadLocal对象,Map的value为需要缓存的数据;
  • 2、ThreadLocal的应⽤场景比如存储用户信息,或者数据库连接,⼀个线程持有⼀个连接,线程之间不共享连接。

2、Java中的锁池和等待池?

在java中,每个对象都有两个池,锁池和等待池:

  • 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,当其它的线程想要调用这个对象的synchronized方法(或者synchronized块),就必须先获得该对象的锁,但是该对象的锁目前正被线程A占有,所以这些线程就进入了该对象的锁池(等待队列)中。
  • 等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁,同时线程A就进入到了该对象的等待池(可运行队列)中。如果另外一个线程调用了该对象的notifyAll()方法,那么处于该对象的等待池中的所有线程都会进入该对象的锁池中,准备争夺锁的拥有权;如果是调用notify()方法,那么等待池中只会有一个线程随机的进入锁池中。(wait、notify、notifyAll方法必须出现在synchronized中)。

3、wait(),yield(),join(),sleep()的区别?

  • wait方法:使当前线程放弃CPU资源并释放锁,该线程进入对象等待池中,进入等待状态,需要唤醒才能进入可运行状态;
  • yield方法:使当前线程放弃CPU资源但不释放锁,该线程进入对象锁池中,进入可运行状态,让优先级相同的线程有机会获取CPU资源;
  • sleep方法:使当前线程放弃CPU资源但不释放锁,该线程进入对象锁池中,进入阻塞状态,让优先级低的线程有机会获取CPU资源,等睡眠时间到了,会继续执行;
  • join方法:使当前线程放弃CPU资源但不释放锁,该线程进入对象锁池中,进入阻塞行状态,让其他的线程先执行,从而保证线程的执行顺序。

4、你们项⽬如何排查JVM问题?

对JVM内存的调优主要的是减少GC的频率和Full GC的次数。
步骤:

  1. 可以使⽤jmap来查看JVM中各个区域的使⽤情况;
  2. 可以使⽤jstack来查看线程的运⾏情况,⽐如线程阻塞、是否出现了死锁;
  3. 可以使⽤jstat来查看垃圾回收的情况,如果发现FGC⽐较频繁,就应该要优化了。
    系统崩溃前的一些现象:
  4. 每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右;
  5. FGC的次数越来越多,最频繁时隔不到1分钟就进行一次FGC;
  6. 年老代的内存越来越大并且每次FullGC后年老代没有内存被释放。
    优化:如果频繁发⽣FGC,那么可以考虑加⼤年轻代的内存⼤⼩,如果改完之后,FGC减少,则证明修改有效;如果没有减少,我们可以通过JvisualVM工具去分析dump文件,找到异常的线程(占⽤CPU⾼)和异常的实例对象,定位到具体的代码,然后再进⾏详细的分析和调试。

5、YGC和FGC发生时间?

  • 1、YGC:新生代堆分为E区和S区(S0区和S1区),当E区空间不够时,会触发FGC,然后回收E区的内存空间,把存活的对象复制到S区,然后对象的GC年龄加1,如果GC年龄大于15,对象会直接进入到老年代;
  • 2、FGC:当老年代空间不够(默认大于80%)时,会触发FGC,然后同时回收新生代和老年代(如果手动调用System.gc()方法,也会触发FGC)。

6、说说类加载器双亲委派模型?

类加载器包括启动类加载器(BootstrapClassLoader)、扩展类加载器(ExtClassLoader)、应用类加载器(AppClassLoader)、自定义类加载器等四种;
JVM在加载类时,先让父类加载器去加载该类,如果加载成功则返回,如果没有加载到就自己去加载,防止了重复加载。

7、哪些对象可以作为 GC Root 呢?

在JAVA中,可以当做GC root对象的有以下几种:

  • 1、栈中引用指向的对象:Test t = new Test();
  • 2、方法区中的静态类变量 public static Test t;
  • 3、方法区中的常量指向的对象(全局变量)private final Test t = new Test();。

8、怎么确定⼀个对象是否可以回收?

  • 1、⽤计数算法:这种⽅式是给堆内存中的每个对象记录⼀个引⽤数,引⽤数为0的就认为可以回收,这是JDK早期的使⽤⽅式,但是它⽆法解决循环引⽤的问题。
  • 2、可达性算法:这种⽅式是在内存中,从GC root对象⼀直向下找引⽤,找到的对象就不会被回收,没找到的对象就会被回收。

9、JVM参数有哪些?

JVM参数⼤致可以分为三类:

  • 1.标准参数:-开头,在以后的JVM版本中不会改变,比如-version,-jar。
  • 2.⾮标准参数:-X开头,在以后的JVM版本中可能会改变,比如-Xms,-Xmx,-Xmn。
  • 3.不稳定参数:-XX开头,在以后的JVM版本中随时会改变,用于JVM的性能调优和调试,比如内存溢出时会自动生成dump文件到指定目录:
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/base。

10、什么是STW?

STW: Stop-The-World,指的是GC事件发生过程中,除了GC所需的线程外,其他线程都将停止工作,没有任何响应,直到GC事件结束才继续它们的任务;
减少STW,这也是JVM调优的重点。触发条件:
1.可达性分析算法中枚举根节点(GC Roots);
2.JMap命令生成dump文件;
3.手动调用System.gc(),触发YGC或者FGC。

11、JVM原理及性能调优?

1.JVM是Java虚拟机的缩写,有了它就可以实现跨平台了,达到一次编译,多处使用。

  • JVM原理简单来说就是编译和执行java源代码,
    第一步编译:是通过java编译器、语法语义分析器和字节码生成器得到一个字节码的.class文件;
    第二步执行:是通过JVM执行引擎来完成,其中包括了JIT编译器和字节码解释器。
  • 性能调优主要的目的是减少GC的频率和Full GC的次数。
    第一点:尽量让对象在年轻代时被GC回收;
    第二点:控制好年轻代和老年代的内存比例;
    第三点:根据实际情况选择合适的垃圾回收算法;
    第四点:不要手动触发垃圾回收,尽量依靠JVM自身的机制。

12、什么是字节码?采用字节码的好处是什么?

编译器(javac)将Java源⽂件(.java)⽂件编译成为字节码⽂件(.class),可以做到⼀次编译到处运⾏, windows上编译好的class⽂件,可以直接在Linux上运⾏,通过这种⽅式做到跨平台,但是需要把字节码解释成各个操作系统能识别的机器码。

13、JVM的内存结构图?

JVM内存模型包括:方法区(元空间)、堆、虚拟机栈、程序计数器、本地方法栈。

  • 1.方法区:主要包括常量、静态方法/变量、类信息(方法/字段等信息)、运行时常量池,操作的是直接内存;
  • 2.堆是运行时数据区,所有类的实例和数组都是在堆上分配内存,在JVM启动的时候分配;
  • 3.虚拟机栈:包括基本数据类型和引用数据存储地址;
  • 4.程序计数器(寄存器):用于记录下一条Jvm指令的执行地址;
  • 5.本地方法栈:就是native本地方法运行时的一块空间。
    在这里插入图片描述

当Java程序编译成为.class文件=》类加载器(ClassLoader)将字节码文件加载到JVM中=》解释器解析为机器码,最后交给cpu执行(只能识别机器码)。
虚拟机栈、程序计数器、本地方法栈是每个线程所独有的。

14、JVM 类加载加载过程?

类加载过程主要包括加载、验证、准备、解析、初始化等阶段;

  • 加载:通过类的全限定名(包名+类名)来找到类文件,再通过字节流在内存中生成对应的class对象;
  • 验证:确保文件格式、字段、方法符合语义要求;
  • 准备:主要是给静态变量分配内存,并设置默认值,比如int类型默认值是0(final修饰的static字段在编译的时候就初始化值了);
  • 解析:就是将常量池中的符号引用(字面量)转换为直接引用的过程:比如String name=”张三”,在编译的时候没有分配内存,不知道内存地址在哪里,所以用符号先代替,解析阶段就是把符号引用替换成直接引用;
  • 初始化:主要是给静态变量设置用户定义的初始值,以及执行静态代码块和构造器方法。
    JVM是采用懒加载的方式,当需要用到该类时,JVM才会将它的class文件加载到内存中生成class对象。

15、类加载器的种类?

  • 1、引导类加载器:是用C语言实现的,用来加载Java的核心类库,比如rt.jar(包含java.lang.String、java.lang.Thread、java.util.ArrayList、java.io.InputStream)
  • 2、扩展类加载器:用来加载Java平台扩展类库,比如ext目录下的类库
  • 3、应用类加载器:用来加载classpath路径下的类库,可以通过获取并操作这个加载器;
  • 4、自定义类加载器:通过继承 java.lang.ClassLoader 类来实现,可以满足特定的需求,比如Tomcat部署多个应用,要保证各个应用中的类是独立的,也可以解决JAR包版本冲突问题。
    获取当前类的加载器:User.class.getClassLoader();
    获取系统默认的加载器:ClassLoader.getSystemClassLoader();

16、双亲委派模型?

工作原理:就是要求一个类加载器在加载类时,它自己不会先去加载,先委托其父类加载器加载,如果父类还存在父类加载器,则继续向上委托,一直委托到引导类加载器;如果父类加载器可以完成加载,就返回成功,如果不可以加载,就由子类自己去加载,如果子类也加载失败就会抛出ClassNotFoundException异常,这就是双亲委派模式。
优点:

  • 1、避免类的重复加载;
  • 2、 保证了Java 核心类库的安全性,比如自定义的String类不会被加载,因为父类加载器优先加载类,因此相同的类只会被加载一次。

17、变量槽slot的理解?

  • 1.参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束。
  • 2.局部变量表,最基本的存储单位是Slot(变量槽)。
  • 3.局部变量表中存放编译期可知的各种基本数据类型(8种),引用类型(reference)、returnAddress类型的变量。
  • 4.在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress类型),64位的类型(long和double)占用两个slot。
    (byte、short、char 在存储前被转换位Int,boolean 也被转换为int,0表示false,非0 表示true。long和double则占据两个Slot)
  • 5.JVM会为局部变量表种的每一个Slot都分配一个访问的索引,通过这个索引即可成功访问到局部变量表种指定的局部变量值。
  • 6.当一个实例方法被调用的时候,它的方法参数和方法体内部定义的局部变量将按照顺序被复制到局部变量表中的每一个Slot上。
  • 7.如果需要访问局部变量表中一个64bit的局部变量值时,只需要使用前一个索引即可。(比如:访问long或double类型变量)
  • 8.如果当前帧是由构造方法或者实例方法创建的,那么该对象引用this将会存放在Index为0的slot处,其余的参数按照参数顺序继续排列。
  • 9.重复利用
    栈帧中的局部变量表中的槽位是可以重用的,如果一个局部变量过了其作用域,那么在其作用域之后申明的新的局部变量就很由可能会复用过期局部变量的槽位,从而达到节省资源的目的

18、ThreadLocal 内存泄漏的原因?

由于ThreadLocalMap 的生命周期跟 Thread 一样长,对于重复利用的线程来说,如果没有手动删除(remove()方法)对应 key 就会导致entry(null,value)的对象越来越多,从而导致内存泄漏。
因为线程池中的线程不会回收,⽽线程对象是通过强引⽤指向ThreadLocalMap,从而导致ThreadLocalMap无法被回收,就可能造成导致OOM。
解决办法是,在使⽤了ThreadLocal对象之后,⼿动调⽤它的remove⽅法,从而清除该对象。

19、HotSpot内存布局?

JVM是虚拟机的规范,HotSpot是jvm的具体实现。
在HotSpot虚拟机中对象的内存布局分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)
对象头记录了哈希码、锁状态、偏向锁线程ID、GC年龄和类型指针等,如果对象是一个数组,那么对象头还会记录数组长度。
实例数据就是成员变量的值,其中包括父类成员变量和本类成员变量。
对齐填充用于确保对象的总长度为8字节的整数倍,对齐填充并不是必然存在,也没有特别的含义,它仅仅起着占位符的作用。

20、蓝绿发布、灰度发布、滚动发布?

  • 蓝绿发布:并不停止掉老版本,而是直接部署一套新版本,等新版本运行起来后,再将流量切换到新版本上,同时观察蓝色系统的运行状态,如果运行出现问题可以及时切回绿色系统。
  • 滚动发布:就是先停止一部分服务器,执行更新,并重新将其投入使用,直到集群中所有的服务器都更新成新版本。
  • 灰度发布:就是先启动一个新版本应用,将少量的用户流量导入到新版本上,确认新版本运行良好后,再逐步将更多的流量导入到新版本上,最后关闭剩下的老版本服务。

21、什么是TCP网络分层?

应用层,传输层,网络层,物理层。

22、什么是TCP的三次握手和四次挥手?

进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常,为后面的可靠性传送做准备,只有三次握手成功后,才开始发送和接收数据;断开一个TCP连接则需要“四次挥手。

23、TCP、HTTP和UDP协议的区别?

1、HTTP是应用层协议,TCP和UDP是传输层协议;
2、TCP发送数据前需要建立连接;UDP不需要;
3、TCP传输保证可靠性,UDP不保证;
4、TCP传输速度比UDP慢一些。
比如微信登录可以采用TCP协议和Http协议保证安全可靠性,好友发送消息可以采用UDP协议,内网传文件可以采用P2P技术。
连接队列中,如果队列满了,那么正常的请求连接也会被拒绝,从而引起网络阻塞甚至系统瘫痪。

24、浏览器输入一个www.daibu.com中间经历了什么?

1、 DNS域名解析获取IP地址(根服务器->com服务器->baidu服务器->获得IP地址);
2、建立TCP连接(三次握手:SYN->SYN+ACK->ACK);
3、web浏览器向百度服务器发送HTTP请求;
4、百度服务器返回响应数据;
5、浏览器解析数据并渲染html;
6、web浏览器关闭TCP连接(四次挥手:FIN->ACK->FIN->ACK)。

25、HTTP的状态码有哪些?

2XX 成功,3XX 重定向,4XX 客户端错误,5XX 服务器错误。

总结

都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/414871.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

11.vue学习笔记(组件生命周期+生命周期应用+动态组件+组件保持存活)

文章目录 1.组件生命周期2.生命周期应用2.1通过ref获取元素DOM结构2.2.模拟网络请求渲染数据 3.动态组件3.1.A,B两个组件 4.组件保持存活(销毁期) 1.组件生命周期 每个Vue组件实例在创建时都需要经历一系列的初始化步骤,比如设置…

探索AI视频模型的无限可能:OpenAI的Sora引领创新浪潮

文章目录 📑前言一、技术解析二、应用场景三、未来展望四、伦理与创意五、用户体验与互动🌤️总结 📑前言 随着人工智能技术的蓬勃发展,AI视频模型正逐渐成为科技领域的新宠。在这个变革的浪潮中,OpenAI推出的首个AI视…

Spring中 Unsupported class file major version 61 报错

初学Spring时遇到的一个错误&#xff1a;Unsupported class file major version 61 &#xff0c;如图所示&#xff1a; 网上查了一下大概是JDK的版本与Spring的版本不一致导致的错误&#xff1b;刚开始我用的Spring版本是&#xff1a; <dependencies><dependency>…

(全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF

研究生英语读写教程基础级教师用书PDF 研究生英语读写教程提高级教师用书PDF pdf下载&#xff08;完整版下载&#xff09; &#xff08;1&#xff09;研究生英语读写教程基础级教师用书PDF &#xff08;2&#xff09;研究生英语读写教程基提高级教师用书PDF

【Pytorch深度学习开发实践学习】Pytorch实现LeNet神经网络(1)

1.model.py import torch.nn as nn import torch.nn.functional as F引入pytorch的两个模块 关于这两个模块的作用&#xff0c;可以参考下面 Pytorch官方文档 torch.nn包含了构成计算图的基本模块 torch,nn.function包括了计算图中的各种主要函数&#xff0c;包括&#…

linux gdb 调试工具

1.写程序 首先&#xff0c;我们先写出一个 .c 或者.cpp程序 如 然后 gcc -g hello.c -o hello 或者 g -g hello.cpp -o hello &#xff08;-g&#xff09;要加 2. gdb调试 用 gdb &#xff08;可执行程序&#xff0c;如hello&#xff09; 进入之后&#xff0c;有…

Window系统安装USB Redirector结合cpolar实现远程访问本地USB设备

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序&#xff0c;它提供了共享和访问本地或互联网上的U…

物业智能水电抄表管理系统

物业智能水电抄表管理系统是物业管理行业的关键技术之一&#xff0c;其结合了智能化、远程监控和数据分析等功能&#xff0c;为物业管理公司和业主提供了高效、精准的水电抄表管理解决方案。该系统具有多项优势&#xff0c;能够提升物业管理效率&#xff0c;降低成本&#xff0…

[计算机网络]--MAC/ARP/DNS协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、认识以…

UnityWebGL UGUI中文不显示问题

这是Unity编辑中效果 打包成webgl后的效果&#xff08;中文没有显示出来&#xff09; 解决方法 将Unity默认使用的Arial替换成中文字体。 1.找到电脑字体库&#xff08;win电脑字体库路径&#xff1a;C:\Windows\Fonts &#xff1b;Mac电脑搜索“字体册”&#xff09;。 2.将…

TC3xx SMU、PMIC和Tranceiver的功能安全闭环

目录 1.TLF35584安全状态输出响应对象 1.1 响应ERR 收集到的错误信号 1.2 响应监控功能引发的ROT 1.3 响应看门狗引发的错误 1.4 环境过温引发的错误状态 1.5 为什么设计SSx&#xff1f; 2. 安全状态输出给谁 3.小结 在之前文章里&#xff0c;我们简述了TC3xx SMU如何…

js 面试题--事件循环event loop--宏任务和微任务

1 事件循环event loop概念&#xff1a; js 是非阻塞单线程语言&#xff0c;js在执行过程中会产生执行环境&#xff0c;执行环境会按顺序添加到执行栈中&#xff0c;先执行同步栈中的任务&#xff0c;当遇到异步任务时会添加到task队列中&#xff0c;同步栈执行完后&#xff0c…

Python学习系列 -初探标准库之logging库

系列文章目录 第一章 初始 Python 第二章 认识 Python 变量、类型、运算符 第三章 认识 条件分支、循环结构 第四章 认识 Python的五种数据结构 第五章 认识 Python 函数、模块 第六章 认识面向对象三大特性 第七章 初探标准库之os库 第八章 初探标准库之pathlib库 第九章 初探…

【数据结构(C语言)】排序详解

目录 文章目录 前言 一、排序的概念 1.1 排序的概念 1.2 常见的排序算法 二、插入排序 2.1 直接插入排序 2.1.1 基本思想 2.1.2 特性总结 2.1.3 代码实现 2.2 希尔排序 2.2.1 基本思想 2.2.2 特性总结 2.2.3 代码实现 三、选择排序 3.1 直接选择排序 3.1.1…

【数据结构和算法初阶(C语言)】空间复杂度(例题剖析一起探究空间如何评价算法)

目录 1.衔接前言-时间复杂度的回顾 2.关于算法复杂度 3.本文主角-空间复杂度 3.1大O的渐进表示方法 4.空间复杂度例题----实际感受空间复杂度 4.1冒泡排序的空间复杂度 4.2计算递归函数的空间复杂度 4.3动态开辟内存版本求斐波那契数列的空间复杂度 4.4&#xff08;…

蓝桥杯_定时器的基本原理与应用

一 什么是定时器 定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数&#xff0c;当计数值达到设定要求时&#xff0c;向cpu提出中断处理请求&#xff0c;从而实现&#xff0c;定时或者计数功能的外设。 二 51单片机的定时/计数器 单片机外部晶振12MHZ&#xff0c;…

如何实现双向循环链表

博主主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《数据结构》 引言 双向带头循环链表是一种常见的数据结构&#xff0c;它具有双向遍历的特性&#xff0c;并且在表头和表尾之间形成一个循环。本文将深入探讨双向带头循环链表的结构、操作和应用场景&#xff0c;帮…

el-table通过这样封装可以实现校验-表格校验的原理

我们一般在后台系统中&#xff0c;很常见的操作时表格里面嵌套表单&#xff0c;之前我的网上找到了一些封装的用法&#xff1a; <el-form :model"formData" :rules"ruleData" ref"formDom"><el-table :data"formData.tableData&q…

Vue.js入门指南:简介、环境配置与Yarn创建项目

一、Vue.js简介 Vue.js&#xff0c;一个流行的JavaScript框架&#xff0c;以其直观、灵活和高效的特点&#xff0c;在前端开发者中赢得了广泛的赞誉。Vue.js的核心库专注于视图层&#xff0c;使得开发者能够构建出响应式的数据绑定和组合的视图组件。Vue.js的目标是通过尽可能简…

CPU、GPU 混合推理,非常见大模型量化方案:“二三五六” 位量化,模型量化详细实现方案

CPU、GPU 混合推理&#xff0c;非常见大模型量化方案&#xff1a;“二三五六” 位量化&#xff0c;模型量化详细实现方案。 非常见整型位数的量化&#xff0c;来自让各种开源模型能够在 CPU 环境、CPU & GPU 环境混合推理的技术方案&#xff1a;llama.cpp 。为了能够在低配…