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

JVM调优面试题——基础知识

文章目录

  • 1、JDK,JRE以及JVM的关系
  • 2、编译器到底干了什么事?
  • 3、类加载机制是什么?
    • 3.1、装载(Load)
    • 3.2、链接(Link)
    • 3.3、初始化(Initialize)
  • 4、类加载器有哪些?
  • 5、什么是双亲委派机制?
  • 6、介绍一下JVM内存划分(运行时数据区)
    • 6.1、方法区
    • 6.2、Heap(堆)
    • 6.3、Java Virtual Machine Stacks(虚拟机栈)
  • 7、堆为什么进行分代设计?
  • 8、老年代的担保机制
  • 9、为什么Eden:S0:S1 是8:1:1
  • 10、对象的创建以及分配过程
  • 11、方法区、元数据区、持久代是什么关系?
  • 12、对象在内存中的布局

1、JDK,JRE以及JVM的关系

JDK全称为Java Development Kit,是Java开发人员在编写Java程序时使用的开发工具包。如图所示,其包括了JRE和JVM。
其中JRE是Java程序的运行环境,提供了JVM的实现和一些基本类库。
而JVM则是识别.class文件中的指令并调用操作系统完成指令动作。
03.png

2、编译器到底干了什么事?

仅仅是将我们的 .java 文件转换成了 .class 文件,实际上就是文件格式的转换。

image.png

3、类加载机制是什么?

所谓类加载机制就是:虚拟机把Class文件加载到内存,并对数据进行校验、转换解析和初始化等操作,形成虚拟机可以直接使用的Java类型,即java.lang.Class 。具体为以下几个步骤:

image.png

3.1、装载(Load)

装载的操作其实就是查找和导入class文件

  1. 通过一个类的全限定名获取定义此类的二进制字节流(全限定名是将类名中的.替换为/,例如 java/lang.String)
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口

3.2、链接(Link)

  • 验证(Verify):保证被加载类的正确性
  1. 文件格式验证
  2. 元数据验证
  3. 字节码验证
  4. 符号引用验证
  • 准备(Prepare):为类的静态变量分配内存,并将其初始化为默认值

    public class Demo1 {
    private static int i;public static void main(String[] args) {// 正常打印出0,因为静态变量i在准备阶段会有默认值0System.out.println(i);
    }
    }
    
    public class Demo2 {public static void main(String[] args) {// 编译通不过,因为局部变量没有赋值不能被使用int i;System.out.println(i);}
    }
    
  • 解析(Resolve):把类中的符号引用转换为直接引用的过程
    主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进行。

符号引用就是一组符号来描述目标
直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄

3.3、初始化(Initialize)

对类的静态变量,静态代码块执行初始化操作

4、类加载器有哪些?

在装载(Load)阶段,其中第(1)步:通过一个类的全限定名获取定义此类的二进制字节流,需要借助类装载器完成,顾名思义,就是用来装载Class文件的。

  1. Bootstrap ClassLoader 负责加载 JAVA_HOME中 jre/lib/rt.jar 里所有的class或Xbootclassoath选项指定的jar包。由C++实现,不是ClassLoader子类。
  2. Extension ClassLoader 负责加载java平台中扩展功能的一些jar包,包括`$$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目录下的jar包。
  3. App ClassLoader 负责加载classpath中指定的jar包及Djava.class.path所指定目录下的类和jar包。
  4. Custom ClassLoader 通过java.lang.ClassLoader的子类自定义加载class,属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader。

image.png

5、什么是双亲委派机制?

双亲委派是指在加载类的时候,如上图,按照类加载器的顺序向上检查该类是否加载过,向下委派是否可以加载该类。 避免类重复加载并且保证安全性。其执行过程如下图

image.png

类加载源码

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}

6、介绍一下JVM内存划分(运行时数据区)

image.png

6.1、方法区

方法区是各个线程共享的内存区域,在虚拟机启动时创建。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却又一个别名叫做Non-Heap(非堆),目的是与Java堆区分开来
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常

注意:JVM运行时数据区是一种规范,在JDK 8中的实现就是Metaspace,在JDK6或7中的实现就是Perm Space

6.2、Heap(堆)

Java堆是Java虚拟机所管理内存中最大的一块,在虚拟机启动时创建,被所有线程共享。
Java对象实例以及数组都在堆上分配。

6.3、Java Virtual Machine Stacks(虚拟机栈)

虚拟机栈是一个线程执行的区域,保存着一个线程中方法的调用状态。所以虚拟机栈是线程私有的,随着线程的创建而创建。
每一个被线程执行的方法,为该栈中的栈帧,即每个方法对应一个栈帧。(调用一个方法,就会向栈中压入一个栈帧;一个方法调用完成,就会把该栈帧从栈中弹出。)
每个栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、动态链接、方法返回地址和附加信息。

  • 局部变量表:方法中定义的局部变量以及方法的参数存放在这张表中。如需要使用的话,必须通过相关指令将其加载至操作数栈中作为操作数使用。
  • 操作数栈:以压栈和出栈的方式存储操作数的
  • 动态链接:符号引用转换为直接引用

image.png

7、堆为什么进行分代设计?

如下图,堆被分为Young区、Old区,其中Young区又分为Eden区、Survivor区,而Survivor区又分为S0和S1。

image.png
为什么这样设计有以下原因:

  1. 如果堆没有分代,等到堆空间满了进行清理时,需要消耗很长的时间去清理,期间应用也无法运行。
  2. 因为大多数对象生存时间是很短的(大多对象都是执行完方法后就没用了),需要及时被清理,但是又不能清理整个堆,所以划分了Young区、Old区,这样对象生存时间短的放到Young区,生存时间长的放到Old区,每次只清理Young区,提高效率。
  3. 此时如果来了一个新对象,并且Young区空间足以装下新的对象,但是因为Young区反复被清理过几次,内存空间不连续,没有完整的空间装下新对象,就会造成空间浪费。在这里插入图片描述
  4. 这个时候如果有另外一个区域可以存放Young区的4个存活对象时(此时放入Old区只会加快清理的次数),新对象就可以正常放进来,所以有了Eden区、Survivor区。
  5. 但是只有一个Survivor区也会存在内存碎片问题,所以Survivor区分为S0和S1,当Young GC时,将Eden区和其中一个S区的对象都迁移到另一个S区,从而解决内存碎片的问题。
    在这里插入图片描述

8、老年代的担保机制

当有一个新的对象Young区无法分配空间时,直接放到老年代。

9、为什么Eden:S0:S1 是8:1:1

  1. 大多数对象生存时间是很短的,并且在Eden就可能会被清理掉
  2. S0和S1需要来回存放对方以及Eden区的对象,所以比例需要一致

10、对象的创建以及分配过程

23.png

11、方法区、元数据区、持久代是什么关系?

方法区可以看作是一个规范,JDK1.7之前的实现是持久代,JDK1.8以及其之后的实现是元数据区。

元数据区的优势是,如果本机内存为16G尽管只给JVM分配了4G,元数据区也是会用到本机的其他12G内存,这样的好处是我们不用估算类信息、常量、静态变量这些数据的占用空间。

如下图,方法区中的静态变量、常量在运行时内存中,而类信息在直接内存中。
image.png

12、对象在内存中的布局

image.png

相关文章:

JVM调优面试题——基础知识

文章目录1、JDK&#xff0c;JRE以及JVM的关系2、编译器到底干了什么事&#xff1f;3、类加载机制是什么&#xff1f;3.1、装载(Load)3.2、链接(Link)3.3、初始化(Initialize)4、类加载器有哪些&#xff1f;5、什么是双亲委派机制&#xff1f;6、介绍一下JVM内存划分&#xff08…...

三、mongdb 查询

一、 MongoDB文档检索 MongoDB中有多种方式可以检索文档: 1.1 查询过滤器 使用查询过滤器从集合中检索文档。查询过滤器是一组键值对,可按字段值查询文档。 例如: db.col.find({"status":"A"})这个示例查询status等于“A”的文档。 1.2 范围查询操作符…...

python的 ping 网络状态监测方法(含多IP)

ping 基本概念 ping &#xff08;Packet Internet Groper&#xff09;是一种因特网包探索器&#xff0c;用于测试网络连接量的程序。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令&#xff0c; 主要是向特定的目的主机发送 ICMP&#xff08;Internet Control Messag…...

【独家】华为OD机试提供C语言题解 - 单词反转

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明单词…...

Linux docker环境安装,docker-compose安装,jdk17安装

安装docker 删除之前安装的docker yum remove docker \docker-client \docker-client-latest \docker- common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-sqlinux \docker-engine-selinux \docker-engine \docker-ce安装yum工具 yum install -y y…...

界面开发(3)--- PyQt5用户登录界面连接数据库

文章目录数据库账户注册账号登录找回密码为了实现用户登录界面的登录功能&#xff0c;我们必须建立一个数据库&#xff0c;并把账号和对应的密码&#xff0c;存储到数据库中。如果输入的账号和密码与数据库中的一致&#xff0c;那我们就允许用户登录&#xff0c;进入新的界面。…...

以下真的没有任何要写的了,我需要凑字数,请大家原谅

以下真的没有任何要写的了&#xff0c;我需要凑字数&#xff0c;请大家原谅&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#…...

2023年 Java 发展趋势

GitHub 语言统计表明&#xff0c;Java在编程语言中排名第二&#xff0c;而在2022年的TIOBE指数中&#xff0c;Java排在第四。 抛开排名&#xff0c;Java是自诞生以来企业使用率最高的编程语言&#xff0c;作为一种编程语言&#xff0c;它比许多竞争对手都有更多的优点&#xf…...

Lsof命令介绍

LSOF&#xff08;List Open Files&#xff09;是一款功能强大的开源工具&#xff0c;用于列出当前系统上打开的文件和进程。该工具可以帮助系统管理员和开发人员快速查找正在使用某个文件的进程&#xff0c;以及在系统上使用磁盘空间最多的进程。 本文将介绍LSOF的基本用法和常…...

LeetCode题目笔记——1487. 保证文件名唯一

文章目录题目描述题目链接题目难度——中等方法一&#xff1a;哈希表代码/Python代码/C总结题目描述 给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹&#xff1a;在第 i 分钟&#xff0c;新建名为 names[i] 的文件夹。 由于两个文件 不能 共享相同…...

【概念辨析】结构体内存对齐

一、什么是结构体内存对齐 是使得结构体的每个成员能够在及其访问的特定存储单元上的一种方法。 通过这种方法可以使得机器访问效率加快&#xff0c;也可以使得平台一致性变高。 二、结构体对齐的规则 有两组代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS#include <…...

pg mysql oracle 中的schema

1、schema。 pg中的schema表示当前db中数据库对象的命名空间(namespace)&#xff0c;数据库对象包括但不限于表、函数、视图、索引等。 对于熟悉mysql的人来说&#xff0c;在第一次看到pg中的schema的概念时&#xff0c;可能会疑惑&#xff0c;schema不是表示database的吗&…...

电脑快捷方式删除文件后四种找回方法

快捷指令是一种用作替代快捷键操作的技术。也可以称为“快捷键”&#xff0c;“快捷方式”或“快捷键序列”&#xff0c;它们允许用户在非常快速和方便的方式建立特定操作序列&#xff0c;这对于执行重复性或提高效率非常有用。通过使用快捷指令&#xff0c;您可以执行快速复制…...

Session会话管理

会话管理Web会话管理概述常见的Web应用会话管理方式基于Server端的Session的管理方式基于Cookie的Session的管理方式Cookie与Session最大的区别Cookie-Based的管理方式基于Token-Based的管理方式Web会话管理的安全问题Web会话管理概述 会话管理&#xff1a;在进行人机交互的时…...

极智开发 | ubuntu源码编译cuda版opencv

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍一下 ubuntu源码编译cuda版opencv。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 如果你需要源码编译cpu版的opencv可以…...

umi学习(umi4)

umi 官方文档 官方建议使用 pnpm node版本在 14 以上 创建项目&#xff1a; 根据 包管理工具不同 &#xff0c;官方推荐 这里使用 pnpm&#xff1a; 1. pnpm dlx create-umilatest 2. 选择模板 &#xff08;这里使用 Simple App&#xff09; 想对module处理需要使用 Ant Desig…...

EasyPoi的excel模板预览与下载、导出简单/复杂数据

官方文档地址&#xff1a;easypoi官网&#xff0c;官方仅供参考&#xff0c;部分描述有问题 excel模板预览 准备工作 事先将整理好的excel模板存在项目中&#xff0c;如图 excel模板预览代码 GetMapping("excel")ApiOperation("excel预览")NoLogpubli…...

收个滴滴Offer:从小伙三面经历,看看需要学点啥?

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常有小伙伴&#xff0c;需要面试大厂。 后续结合一些大厂的面试真题&#xff0c;给大家梳理一下学习路径&#xff0c;看看大家需要学点啥&#xff1f; 这里也一并把题目以及参考答案&#xff0c;收入咱…...

Spark Shuffle解析

1 Shuffle的核心要点 1.1 ShuffleMapStage与ResultStage ShuffleMapStage与ResultStage 在划分stage时&#xff0c;最后一个stage称为finalStage&#xff0c;它本质上是一个ResultStage对象&#xff0c;前面的所有stage被称为ShuffleMapStage。 ShuffleMapStage的结束伴随着…...

Qt 解决程序全屏运行弹窗引发任务栏显示

文章目录摘要在VM虚拟机器中测试setWindowFlags()关键字&#xff1a; Qt、 Qt::WindowStayOnTopHint、 setWindowFlags、 Qt::Window、 Qt::Tool摘要 今天眼看项目就要交付了&#xff0c;结果在测试程序的时候&#xff0c;发现在程序全品情况下&#xff0c;点击输入框&#x…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...