JVM面试

news2024/11/24 7:43:04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1.JVM 的整体结构
  • 2.类加载做了哪些事情?
    • 类加载器有哪些?
    • 双亲委派和沙箱安全
  • 3.Java虚拟机栈是什么
  • 4.方法区的理解
    • HotSpot 中方法区的演进
    • 方法区的内部结构
  • 5.对象堆中的分配过程
    • 堆空间的参数设置
  • 6.对象创建方式
  • 7.创建对象的步骤
    • 一、判断对象对应的类是否加载、链接、初始化
    • 二、为对象分配内存
      • 1. 如果内存规整:使用指针碰撞
        • 如果内存是规整的,那么虚拟机将采用的是指针碰撞法(Bump The Point)来为对象分配内存。
      • 2. 如果内存不规整:空闲列表分配
        • 如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虚拟机将采用的是空闲列表来为对象分配内存。
    • 三、处理并发问题
    • 四、属性的默认初始化
        • 属性的默认初始化(零值初始化)
    • 五、设置对象的对象头
    • 六、属性的显示初始化、代码块中初始化、构造器中初始化
  • 8.可达性分析算法,引用计数算法
    • 引用计数算法
    • 可达性分析算法
    • 对象的finalize() 机制
  • 9.垃圾回收相关算法
    • 1. 清除阶段—标记-清除算法
    • 2. 清除阶段—复制算法
    • 3. 清除阶段—标记-压缩(整理)算法
    • 小结
    • 分区算法
  • 10.JVM常用命令行参数
  • 11.常见的垃圾回收器
  • 12.jvm调优案例
    • 一般步骤
        • 解决内存OOM 两大法宝
    • 生产案例
  • 13.内存泄漏
    • 内存泄漏----案例分析
  • 14.纤程


1.JVM 的整体结构

JVM–01–Java体系结构
在这里插入图片描述
在这里插入图片描述
执行引擎包含三部分:

  • 解释器
  • 及时编译器
  • 垃圾回收器
    在这里插入图片描述

2.类加载做了哪些事情?

JVM–02–类加载子系统
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类加载器有哪些?

image.png
在这里插入图片描述

双亲委派和沙箱安全

在这里插入图片描述
在这里插入图片描述

3.Java虚拟机栈是什么

JVM–05–虚拟机栈
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.方法区的理解

JVM–09–方法区
在这里插入图片描述

在这里插入图片描述

HotSpot 中方法区的演进

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

方法区的内部结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.对象堆中的分配过程

JVM–07–堆1—简介、对象分配过程、GC
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

堆空间的参数设置

在这里插入图片描述

6.对象创建方式

JVM–10–创建对象的步骤、对象实例化内存布局、访问定位
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7.创建对象的步骤

JVM–10–创建对象的步骤、对象实例化内存布局、访问定位

  1. 加载类元信息
  2. 为对象分配内存
  3. 处理并发问题
  4. 属性的默认初始化(零值初始化)
  5. 设置对象头信息
  6. 属性的显示初始化、代码块中初始化、构造器中初始化
    在这里插入图片描述

一、判断对象对应的类是否加载、链接、初始化

  1. 虚拟机遇到一条 new 指令,首先去检查这个指令的参数能否在 Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化(即判断类元信息是否存在)。
  2. 如果没有,那么在双亲委派模式下,使用当前类加载器以 ClassLoader + 包名 + 类名为 Key 进行查找对应的 .class 文件,如果没有找到文件,则抛出 ClassNotFoundException 异常,
  3. 如果找到,则进行类加载,并生成对应的 Class 对象

二、为对象分配内存

首先计算对象占用空间的大小,接着在堆中划分一块内存给新对象。如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小( long 和 double 是8个字节)

1. 如果内存规整:使用指针碰撞

如果内存是规整的,那么虚拟机将采用的是指针碰撞法(Bump The Point)来为对象分配内存。
  • 意思是所有用过的内存在一边,空闲的内存放另外一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把指针指向空闲那边挪动一段与对象大小相等的距离罢了。如果垃圾收集器选择的是
    Serial ,ParNew 这种基于压缩算法的,虚拟机采用这种分配方式。一般使用带 Compact(整理)过程的收集器时,使用指针碰撞。

2. 如果内存不规整:空闲列表分配

如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虚拟机将采用的是空闲列表来为对象分配内存。
  • 意思是虚拟机维护了一个列表,记录上那些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。这种分配方式成为了 “空闲列表(Free List)”

说明:选择哪种分配方式由 Java 堆是否规整所决定,而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

三、处理并发问题

在分配内存空间时,另外一个问题是及时保证 new 对象时候的线程安全性:创建对象是非常频繁的操作,虚拟机需要解决并发问题。虚拟机采用了两种方式解决并发问题:

  • CAS(Compare And Swap)失败重试、区域加锁:保证指针更新操作的原子性
  • TLAB 把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在 Java 堆中预先分配一个小块内存,称为本地线程分配缓冲区,(TLAB,Thread Local Allocation Buffer)虚拟机是否使用 TLAB,可以通过 -XX:+/-UseTLAB 参数来设定

四、属性的默认初始化

属性的默认初始化(零值初始化)

内存分配结束,虚拟机将分配到的内存空间都初始化为零值(不包括对象头),这一步保证了对象的实例字段在 Java 代码中可以不用赋初始值就可以直接使用,程序能访问到这些字段的数据类型所对应的零值

  • 属性的默认初始化
  • 显示初始化
  • 代码块中的初始化
  • 构造器初始化
  • 所有属性设置默认值,保证对象实例字段在不赋值可以直接使用

五、设置对象的对象头

  • 将对象的所属类(即类的元数据信息)、对象的 HashCode 和对象的 GC 信息、锁信息等数据存储在对象的对象头中。这个过程的具体设置方式取决于 JVM 实现。
    -
    在这里插入图片描述

六、属性的显示初始化、代码块中初始化、构造器中初始化

  • 在 Java 程序的视角看来,初始化才正式开始。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量
  • 因此一般来说(由字节码中跟随 invokespecial 指令所决定),new 指令之后会接着就是执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完成创建出来。

执行 init 方法进行初始化
在这里插入图片描述

8.可达性分析算法,引用计数算法

JVM–15—垃圾回收相关算法 1---- 标记阶段算法、 finalization机制、MAT 与 JProfiler

引用计数算法

在这里插入图片描述
在这里插入图片描述

可达性分析算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对象的finalize() 机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

9.垃圾回收相关算法

JVM–16—垃圾回收相关算法 2----清除阶段算法

在这里插入图片描述

1. 清除阶段—标记-清除算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 清除阶段—复制算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 清除阶段—标记-压缩(整理)算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分区算法

在这里插入图片描述
在这里插入图片描述

JVM–19—垃圾回收器----CMS回收器、G1回收器、ZGC回收器

G1 回收器:区域化分代式在这里插入图片描述

10.JVM常用命令行参数

JVM调优–01—JVM常用命令行参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.常见的垃圾回收器

JVM–18—垃圾回收器

JVM–19—垃圾回收器

7种经典的垃圾收集器

  • 串行回收器:Serial、Serial Old
  • 并行回收器:ParNew、Parallel Scavenge、Parallel Old
  • 并发回收器:CMS、G11
    在这里插入图片描述
    Serial 回收器:串行回收
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

12.jvm调优案例

JVM调优–03—性能优化步骤、常用的jvm图形化界面

一般步骤

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决内存OOM 两大法宝

在这里插入图片描述

生产案例

在这里插入图片描述
在这里插入图片描述

13.内存泄漏

JVM调优–05—内存泄漏、案例分析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

内存泄漏----案例分析

  1. ThreadLocal
    提升–10—ThreadLocal简介
    在这里插入图片描述

14.纤程

JVM调优–07—GC日志分析、纤程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

bind、call、apply 区别?

作用 call、apply、bind作用是改变函数执行时的上下文,简而言之就是改变函数运行时的this指向 那么什么情况下需要改变this的指向呢? 下面举个例子 var name "lucy"; var obj {name: "martin",say: function () {console.log(…

手机网站支付有风险吗?

这是一个在当今数字化时代中,消费者们常常会提出的问题。随着科技的发展和移动设备的普及,越来越多的商家开始接受在线支付,这无疑为消费者提供了极大的便利。然而,与此同时,也伴随着一些潜在的风险。本文将探讨手机网…

使用过滤器Filter实现请求拦截

早期使用servlet进行网络开发时,没有拦截器这些内容,那时做请求拦截都是使用Filter过滤器实现的,配置Filter要对哪些请求路径处理,有权限或不需要拦截的路径放行,没有权限的路径直接拦截请求。 一、Filter直接进行拦截…

SpringBoot之请求的详细解析

1. 请求 在本章节呢,我们主要讲解,如何接收页面传递过来的请求数据。 1.1 Postman 之前我们课程中有提到当前最为主流的开发模式:前后端分离 在这种模式下,前端技术人员基于"接口文档",开发前端程序&…

I.MX RT1170双核学习(1):双核通信之MU消息单元详解

在I.MX RT1170中,它有CM7和CM4核,而消息单元(MU)模块使SoC内的两个处理器能够通过MU接口传递消息以进行通信和协调。 文章目录 1 MU特性2 功能描述3 MU通信实例3.1 轮训实现多核通信3.1.1 MU_SetFlags和MU_GetFlags3.1.2 MU_SendMsg和MU_ReceiveMsg3.1.…

阿里云国际版无法远程连接Windows服务器的排查方法

如果您遇到紧急情况,需要尽快登录Windows实例,请参见以下操作步骤,先检查ECS实例的状态,然后通过云助手向Windows实例发送命令或通过VNC登录实例,具体步骤如下: 步骤一:检查ECS实例状态 无论何…

CentOS 7 源码部署 Nginx

文章目录 1. 概述2. 部署示例2.1 下载和解压 Nginx 源码2.2 安装编译依赖包2.3 编译和安装2.4 启动 Nginx2.5 配置防火墙2.6 设置 Nginx 为系统服务2.7 配置访问 3. 扩展知识 1. 概述 Nginx 是一款高性能的开源 Web 服务器软件,广泛应用于互联网领域。本篇博客将介…

pytest-fixtured自动化测试详解

fixture的作用 1.同unittest的setup和teardown,作为测试前后的初始化设置。 fixture的使用 1.作为前置条件使用 2.fixture的的作用范围 1.作为前置条件使用 pytest.fixture() def a():return 3def test_b(a):assert a3 2.fixture的作用范围 首先实例化更高范围的fixture…

Ghidra设置主题和字体大小

文章目录 Ghidra调整主题和字体大小设置主题和全局字体大小调整反汇编页面字体大小 Ghidra调整主题和字体大小 ghidra默认字体小,默认主题白色伤眼,摸索找到了设置主题和字体的方法 设置主题和全局字体大小 启动ghidra后选择edit>theme>configure 下拉框选择主题,右上…

maui下sqlite演示增删改查

数据操作类 有分页 todoitemDatabase.cs: using SQLite; using TodoSQLite.Models;namespace TodoSQLite.Data {public class TodoItemDatabase{SQLiteAsyncConnection Database;public TodoItemDatabase(){}// 初始化数据库连接和表async Task Init(){if (Databa…

科技提升安全,基于YOLOv7【tiny/yolov7/yolov7x】开发构建商超扶梯场景下行人安全行为姿态检测识别系统

在商超等人流量较为密集的场景下经常会报道出现一些行人在扶梯上摔倒、受伤等问题,随着AI技术的快速发展与不断普及,越来越多的商超、地铁等场景开始加装专用的安全检测预警系统,核心工作原理即使AI模型与摄像头图像视频流的实时计算&#xf…

计算机视觉项目实战-驾驶员疲劳检测

😊😊😊欢迎来到本博客😊😊😊 本次博客内容将继续讲解关于OpenCV的相关知识 🎉作者简介:⭐️⭐️⭐️目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学…

nrm 的使用 可以快速切换下载(npm)镜像,解决资源下载慢和运行失败

nrm是什么? 介绍 nrm(npm registry manager) 是 npm 的镜像源管理工具. 有时候国外资源太慢,使用 nrm 可以快速的在 npm 源之间切换 安装 npm install -g nrm 基本使用 查看可选择的源 nrm ls 切换到对应的镜像源 nrm use 对应的镜像 删除镜像源 nrm del 名字 …

翻译: LLM大语言模型图像生成原理Image generation

文本生成是许多用户正在使用的,也是所有生成式人工智能工具中影响最大的。但生成式人工智能的一部分兴奋点也在于图像生成。目前也开始出现一些可以生成文本或图像的模型,这些有时被称为多模态模型,因为它们可以在多种模式中操作,…

【Matlab】如何将二阶线性微分方程进行Laplace变换得到传递函数

二阶线性微分方程进行Laplace变换 前言正文代码实现 前言 二阶线性微分方程: 一个二阶线性微分方程通常可以写成如下形式: y ′ ′ ( t ) p ( t ) y ′ ( t ) q ( t ) y ( t ) f ( t ) y^{\prime \prime}(t)p(t) y^{\prime}(t)q(t) y(t)f(t) y′′(t)p(t)y′(t)q(t)y(t)f(…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(三)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1)定义模型结构2)优化损失函数 3. 模型训练及保存1)模型训练2)模型保存3)映射保存 相关其它博客工程源代码下载其它资料下载…

Redis系列之简单实现watchDog自动续期机制

在分布锁的实际使用中,可能会遇到一种情况,一个业务执行时间很长,已经超过redis加锁的时间,也就是锁已经释放了,但是业务还没执行完成,这时候其它线程还是可以获取锁,那就没保证线程安全 项目环…

文件操作及函数

什么是文件? 在程序设计中,文件有两种:程序文件和数据文件。 程序文件 包括源程序文件(.c),目标文件(.obj),可执行程序(.exe)。 数据文件 文件的内容不一定是程序&…

mybatis的快速入门以及spring boot整合mybatis(二)

需要用到的SQL脚本: CREATE TABLE dept (id int unsigned PRIMARY KEY AUTO_INCREMENT COMMENT ID, 主键,name varchar(10) NOT NULL UNIQUE COMMENT 部门名称,create_time datetime DEFAULT NULL COMMENT 创建时间,update_time datetime DEFAULT NULL COMMENT 修改…

P1044 [NOIP2003 普及组] 栈——卡特兰数

传送门: P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1044 公式一:递推式(注意开 long long ,然后 先乘完再除,防止下取整) typedef long long ll;…