当前位置: 首页 > news >正文

java面试-jvm

JVM

JVM 是 java 虚拟机,简单来说就是能执行标准 java 字节码的虚拟计算机

JVM 是如何工作的

首先程序在执行之前先要把 Java 代码(.java)转换成字节码(.class),JVM 通过类加载器(ClassLoader)把字节码加载到内存中,但字节码文件是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine)将字节码翻译成底层机器码,再交由 CPU 去执行,CPU 执行的过程中需要调用本地库接口(Native Interface)来完成整个程序的运行。

jvm 的组件以及功能

在这里插入图片描述

  1. 类加载器(Class Loader):加载类文件到方法区。
  2. 执行引擎(Execution Engine):也叫解释器,负责解释命令,交由操作系统执行。
  3. 本地库接口(Native Interface):本地接口的作用是融合不同的语言为 java 所用
  4. 运行时数据区(Runtime Data Area):
    在这里插入图片描述
    1)堆。堆是 java 对象的存储区域,任何用 new 字段分配的 java 对象实例和数组,都被分配在堆

    2)方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等
    数据。
    3)虚拟机栈:虚拟机栈中执行每个方法的时候,都会创建一个栈桢用于存储局部变量表,操作
    数栈,动态链接,方法出口等信息。
    4)本地方法区:用来调用非 Java 语言实现的方法
    5)程序计数器。指示 Java 虚拟机下一条需要执行的字节码指令。

请谈一下方法区,永久代,元空间

很多人把方法区称作“永久代”(Permanent Generation),本质上两者并不等价,只是 HotSpot 虚
拟机垃圾回收器团队把 GC 分代收集扩展到了方法区,或者说是用来永久代来实现方法区而已,
这样能省去专门为方法区编写内存管理的代码,但是在 Jdk8 也移除了“永久代”,使用 Native
Memory 来实现方法区。
元空间是 Hotspot 在 JDK8 中新加的内容,其本质和永久代类似,都是对 JVM 规范中方法区的实
现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。

会发生内存溢出的区域?

首先程序计数器不会发生内存溢出(因为 java 虚拟机规范了程序计数器是没有内存溢出的区域)
内存溢出分为两者情况一种是 OutOfMemoryError

  1. 堆内存耗尽,对象越来越多又一直使用不能被垃圾回收
  2. 方法区内存耗尽 - 加载的类越来越多
  3. 虚拟机栈累计 - 每个线程都会占用 1M 的内存,线程越来越多还不销毁
    另一种是 StackOverflowError
    JVM 虚拟机栈原因有递归调用未正常结束或者反序列化 json 循环引用

什么是内存泄漏?内存泄漏与内存溢出的区别?

在 java 中一般是指无用的对象因为错误的引用关系不能被 GC 回收处理
如果存在严重的内存泄漏问题,随着时间推移必会引发内存溢出。内存泄漏一般是指资源管理问
题和程序 BUG,内存溢出一般是指内存空间不足和内存泄漏的最终结果

请谈一下什么是垃圾回收?

GC 前要做的三件事

  1. 哪些内存需要回收?
  2. 什么时候回收?
  3. 怎么回收?

如何确定垃圾?

引用计数法:
只要一个对象被其他变量所引用,就让这个对象的计数 +1,如果某一个变量不在被引用,让
他的计数-1,当这个对象引用计数 =0 的时候,代表这个对象没有再被引用了,就可以作为一个
垃圾被回收掉。引用计数法有一个弊端,在循环引用的场合,如果两个对象被循环无限引用,虽
然都不在使用了,但是两个对象的计数都不为 0,导致不能被回收。

可达性分析:
确定一系列根对象,垃圾回收前先把堆中的对象进行一次扫描,判断每一个对象是不是被根
对象所直接或者间接引用,如果是,那么这个对象就不能被回收。反正如果这个对象没有被根对
象直接或者间接所引用,那么这个对象就可以作为垃圾被回收。

如何确定 GC Roots 对象?

虚拟机栈中引用的对象
方法区中的类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中 JNI 引用的对象

对象的引用关系都有哪些?

不管是引用计数法还是可达性分析算法都与对象的“引用”有关,这说明对象的引用决定了
对象的生死,对象的引用关系如下。
强引用:在代码中普遍存在的,类似 Object obj = new Object() 这类引用,只要强引用还
在,垃圾收集器永远不会回收掉被引用的对象。
软引用: 是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾收集,只有当 JVM
认为内存不足时,才会去试图回收软引用指向的对象,JVM 会确保在抛出 OutOfMemoryError
之前,清理软引用指向的对象。
弱引用: 非必需对象,但它的强度比软引用更弱,被弱引用关联的对象只能生存到下一
次垃圾收集发生之前。
虚引用: 也称为幽灵引用或幻影引用,是最弱的一种引用关系,无法通过虚引用来获取
一个对象实例,为对象设置虚引用的目的只有一个,就是当着个对象被收集器回收时收到一
条系统通知。

垃圾回收算法有哪些?

  • 标记清除算法
    标记阶段:沿着 GC Root 对象的引用链找,直接或间接引用到的对象加上标记
    清除阶段:释放未加标记的对象占用的内存

  • 标记整理法
    前面的标记阶段、清理阶段与标记清除法类似 多了一步整理的动作,将存活对象向一端移动,可以避免内存碎片产生

  • 标记复制法
    将整个内存分成两个大小相等的区域,from 和 to,其中 to 总是处于空闲,from 存储新创建的
    对象,标记阶段与前面的算法类似,在找出存活对象后,会将它们从 from 复制到 to 区域,复制的过程中自然完成了碎片整理,复制完成后,交换 from 和 to 的位置即可。

  • 分代收集算法
    当前主流 JVM 垃圾回收基本都采用分代收集算法,这种算法会根据对象存活周期的不同将内存
    分为几块,比如 JVM 中的年轻代、老年代、永久代。这样就可以根据各年代特点分别采用最适
    当的 GC 算法。
    垃圾收集按照回收区域分类:

    默认情况下新生代和老生代的内存比例是 1:2。

    部分收集(Partial GC)
    年轻代收集(Minor GC),只是年轻代(Eden,From,To)的垃圾收集。
    老年代收集(Major GC),只是老年代的垃圾收集。

    整堆收集(Full GC)
    收集整个 Java 堆和方法区的垃圾,暂停时间长,应尽力避免

    混合收集(Mixed GC)
    收集整个新生代以及部分老年代的垃圾收集,目前只有 G1 收集器会有这种行为。

Minor GC 年轻代垃圾回收触发机制

新生代垃圾回收采用的是复制算法,每次垃圾收集都能发现大批对象已经死亡,只有少量存
活,因此选择复制算法,年轻代又被分为 Eden 区,From 区和 To 区。

新对象产生的时候都会被放入年轻代的 Eden 区(如果是个大对象会直接进入老年代,判断
大对虾通过 Pretenure SIze Threshold 参数设置,默认 3M),当 eden 内存不足,标记 eden 和 from
的存活对象,清理不可达对象,将 Eden 区和 From 区没有被清理的对象使用复制算法复制到年
轻代的幸存区 To 区,并且将 To 区幸存的对象年龄 +1,在交换幸存区 To 区和幸存区 From 区的
位置。minor GC 会引发一次 stop the world,暂停其他用户的线程,等到垃圾会输结束,用户线程
才恢复运行。当寿命达到 15 次左右,作为一个老不死对象,会被移交至老年代。

Major GC(老年代垃圾回收)

Major GC 指发生在老年代的 GC,MajorGC 采用标记—清除算法。
Major GC 触发条件: 老年代空间不足时,会先尝试触发 Minor GC。Minor GC 之后空间还
不足,则会触发 Major GC。

Full-GC触发条件:

Full-GC是针对整个新生代,老年代和元空间的全局范围内的GC。Full-GC不等于Major GC也不等于Minor GC+Major 发生Full-GC具体看使用了什么垃圾回收器,才能解释是什么样的垃圾回收。当⽼年代的空间使⽤率超过某阈值时,会触发Full GC;当元空间不⾜时(JDK1.7永久代不足),也会触发Full GC;当调⽤System.gc()也会安排⼀次Full GC。

JVM 中为什么新生代中要有两个 Survivor 区?

  • 如果 Survivor 是 0 的话,也就是说新生代只有一个 Eden 分区,每次垃圾回收之后,存活的对
    象都会进入老生代,这样老生代的内存空间很快就被占满了,从而触发最耗时的 Full GC ,显然 这样的收集器的效率是我们完全不能接受的。
  • Survivor 中分为两个区一个 FromService 一个 ToService 区,首先如果只有一个区的话,当新 生代的 Gc 开始工作的时候先把 Eden 区的垃圾回收了,根据其标志-复制算法,我们需要保留的 对象会被移动到 FromService 区中,当FromService 中的内存容量达到了一个阈值,需要我们堆 FromService区进行收集的时候,会导致大量的内存碎片残存其中,以至于后来无法在存入大对象 了;两个区的好处在于,当 FromService区的不需要用到对象也需要被清理的时候,Minor GC 再 次被触发的时候,我们需要保留的对象送到了 ToService 区,然后将ToService 区域和 FromService 区域互换身份,这样我们避免了碎片化的存在,而且永远都有一个干净的内存区域可以使用,是内存区域非常的整洁。

常见的垃圾回收器有哪些??

新生代回收器:Serial、ParNew、Parallel Scavenge
老年代回收器:Serial Old、Parallel Old、CMS
整堆回收器:G1

Serial 垃圾收集器(单线程、复制算法):
Serial 垃圾收集器是最基本的垃圾收集器,它使用的是复制算法,Serial 是一个单线程收集
器,它只会使用一个 CPU 或一条线程去完成垃圾收集,在进行垃圾收集的同时必须暂停其他所
有的工作线程直到垃圾收集结束。简单、高效。对于单个 CPU 环境来说没有线程交互的开销,可
以获得最高的单线程回收效率。但一般限定单核 CPU 才可以使用。

ParNew 垃圾收集器(Serial+ 多线程):
ParNew 垃圾收集器是 Serial 收集器的多线程版本,使用的也是复制算法,除了使用多线程
进行垃圾回收,其余的行为全都和 Serial 一样,ParNew 垃圾收集器在垃圾收集过程中也会产生
STW。ParNew 会默认开启和 CPU 数目相同的线程数,可以通过-XX:ParallelGCThreads 参数来
限制垃圾收集器的线程数。

CMS 垃圾回收器 (多线程标记清除算法):
是一款里程碑式的垃圾收集器,为什么这么说呢?因为在它之前,GC 线程和用户线程是无
法同时工作的,即使是 Parallel Scavenge,也不过是 GC 时开启多个线程并行回收而已,GC 的整
个过程依然要暂停用户线程,即 Stop The World。这带来的后果就是 Java 程序运行一段时间就会
卡顿一会,降低应用的响应速度,这对于运行在服务端的程序是不能被接收的。

G1 收集器
Garbage first 垃圾收集器相比 CMS 收集器有以下两个改进:
基于标记-整理算法,不产生内存碎片。可以非常精确控制停顿时间,在不牺牲吞吐量前提
下,实现低停顿垃圾回收。
G1 收集器避免全区域垃圾收集,他把堆内存划分为几个固定大小的独立区域(上面提到的
分区收集算法),并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表。每次根
据所允许的收集时间,优先回收垃圾最多的区域。区域划分和优先级回收机制确保 G1 收集器可
以在有限时间获取最高的垃圾收集效率。

相关文章:

java面试-jvm

JVM JVM 是 java 虚拟机,简单来说就是能执行标准 java 字节码的虚拟计算机 JVM 是如何工作的 首先程序在执行之前先要把 Java 代码(.java)转换成字节码(.class),JVM 通过类加载器(ClassLoade…...

vscode下载与使用

1.vscode下载 官网下载地址:Download Visual Studio Code - Mac, Linux, Windows下载太慢,推荐文章:解决VsCode下载慢问题_vscode下载太慢_迷小圈的博客-CSDN博客下载太慢,推荐下载链接:https://vscode.cdn.azure.cn/s…...

人员摔倒识别预警算法 opencv

人员摔倒识别预警算法通过opencv网络模型技术,人员摔倒识别预警算法能够智能检测现场画面中人员有没有摔倒,无需人为干预可以立刻抓拍告警。OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉处理开源软件库&…...

华为OD机试题 - 火星文计算(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:火星文计算题目输入输出示例一输入输出说明Code解题思路版权说明…...

AI人工智能 - 初探

1.应用场景 主要用于了解和系统学习AI,从而可以在工作生活中利用AI做一些事。 2.学习/操作 1.文档阅读 下面的内容来自于与chatGPT的对话 2.整理输出 介绍AI 人工智能(Artificial Intelligence,简称AI)是计算机科学中的一个分支&…...

Spring-AOP工作流程

Spring-AOP工作流程 3,AOP工作流程 3.1 AOP工作流程 由于AOP是基于Spring容器管理的bean做的增强,所以整个工作过程需要从Spring加载bean说起: 流程1:Spring容器启动 容器启动就需要去加载bean,哪些类需要被加载呢?需要被增强的类,如:B…...

C51---串口发送指令,控制LED灯亮灭

1.Code: #include "reg52.h" #include "intrins.h" sfr AUXR 0x8E; sbit D5 P3^7; void UartInit(void) //9600bps11.0592MHz { //PCON & 0x7F; //波特率不倍速 AUXR 0x01; SCON 0x50; //8位数据,可变波…...

【Wiki】XWiki数据备份

XWiki为主题使用java开发的开源wiki,官网地址如下: https://www.xwiki.org/xwiki/bin/view/Main/ 目录1、 XWiki升级数据备份1.1、 获取XWiki配置的数据库与持久化目录信息1.2 备份数据库信息1.3 备份持久化目录2、XWiki数据迁移如果一个知识库不能确保数…...

ctk框架开发Qt插件应用示例工程

目录 前言 约定 插件工程pluginApp: 主启动工程StartApp: 效果演示 结语...

spring5源码篇(4)——beanFactoryPostProcessor执行/注解bean的装配

spring-framework 版本:v5.3.19 前面研究了beanDefinition的注册,但也仅仅是注册这一动作。那么在spring容器启动的过程中,是何时/如何装配的?以及装配的bean是如何注入的? (考虑到xml方式基本不用了以及篇…...

masstransit的message几个高级用法

1)问题,Class MessageA 基类,Class MessageB继承自MessageA; 用bus.Publish方法本想把有些消息只发给B队列,结果由于其继承关系A队列也获得了消息; 解决方法用send, Uri uri new Uri(RabbitM…...

漏洞分析丨cve-2012-0003

作者:黑蛋一、漏洞简介这次漏洞属于堆溢出漏洞,他是MIDI文件中存在的堆溢出漏洞。在IE6,IE7,IE8中都存在这个漏洞。而这个漏洞是Winmm.dll中产生的。二、漏洞环境虚拟机调试工具目标软件辅助工具XP-SP3、KaliOD、IDAIE6Windbg组件gflags.exe三…...

rm命令——删除文件或目录

rm命令是英文单词remove的缩写,主要功能是删除文件或目录。 因为删除文件是一个破坏性动作,因此,在使用时需要格外小心,在执行之前一定要再三确认删除的是哪个目录中的什么文件。 rm命令的语法格式如下: rm [选项] …...

【零基础入门学习Python---Python的基本语法使用】

一.Python基本语法使用 Python是一种易学且功能强大的编程语言,具有简洁的语法和广泛的应用领域。在本文中,我们将介绍Python的基本语法使用,以帮助初学者快速入门Python编程。 1.1 注释 Python 支持两种类型的注释:单行注释和多行注释。 单行注释:以 # 符号开头,从 # …...

数据仓库相关概念的解释

数据仓库相关概念的解释 文章目录数据仓库相关概念的解释1 ETL是什么?ETL体系结构2 数据流向何为数仓DW3 ODS 是什么?4 数据仓库层DWDWD 明细层DWD 轻度汇总层(MID或DWB,data warehouse basis)DWS 主题层(D…...

1/4车、1/2车、整车悬架模糊PID控制仿真合集

目录 前言 1. 1/4悬架系统 1.1数学模型 1.2仿真分析 2. 1/2悬架系统 2.1数学模型 2.2仿真模型 2.3仿真分析 3. 整车悬架系统 3.1数学模型 3.2仿真分析 4.总结 前言 前面几篇文章介绍了LQR、SkyHook、H2/H∞、PID控制,接下来会继续介绍滑模、反步法、M…...

Linux性能补丁升级,避免不必要的跨核Wake-Up

导读一个由英特尔发起的、旨在改进Linux内核公平调度程序代码的补丁系列,也看到了来自AMD工程师和其他利益相关者的测试/反馈,并继续进行改进。这个补丁系列的重点是避免在不必要的情况下发生过多的跨核唤醒(Cross-CPU Wake-up)。这样一来,这…...

Spring Cloud Alibaba全家桶(六)——微服务组件Sentinel介绍与使用

前言 本文小新为大家带来 微服务组件Sentinel介绍与使用 相关知识,具体内容包括分布式系统存在的问题,分布式系统问题的解决方案,Sentinel介绍,Sentinel快速开始(包括:API实现Sentinel资源保护,…...

拼多多2021笔试真题集 -- 3. 多多的求和计算

多多的求和计算 多多路上从左到右有N棵树(编号1~N),其中第i个颗树有和谐值Ai。 多多鸡认为,如果一段连续的树,它们的和谐值之和可以被M整除,那么这个区间整体看起来就是和谐的。 现在多多鸡想请…...

DP算法:动态规划算法

步骤(1)确定初始状态(2)确定转移矩阵,得到每个阶段的状态,由上一阶段推到出来(3)确定边界条件。例题蓝桥杯——印章(python实现)使用dp记录状态,d…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...