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文件中的指令并调用操作系统完成指令动作。
2、编译器到底干了什么事?
仅仅是将我们的 .java 文件转换成了 .class 文件,实际上就是文件格式的转换。
3、类加载机制是什么?
所谓类加载机制就是:虚拟机把Class文件加载到内存,并对数据进行校验、转换解析和初始化等操作,形成虚拟机可以直接使用的Java类型,即java.lang.Class 。具体为以下几个步骤:
3.1、装载(Load)
装载的操作其实就是查找和导入class文件
- 通过一个类的全限定名获取定义此类的二进制字节流(全限定名是将类名中的.替换为/,例如 java/lang.String)
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
3.2、链接(Link)
- 验证(Verify):保证被加载类的正确性
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
-
准备(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文件的。
- Bootstrap ClassLoader 负责加载 JAVA_HOME中 jre/lib/rt.jar 里所有的class或Xbootclassoath选项指定的jar包。由C++实现,不是ClassLoader子类。
- Extension ClassLoader 负责加载java平台中扩展功能的一些jar包,包括`$$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目录下的jar包。
- App ClassLoader 负责加载classpath中指定的jar包及Djava.class.path所指定目录下的类和jar包。
- Custom ClassLoader 通过java.lang.ClassLoader的子类自定义加载class,属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader。
5、什么是双亲委派机制?
双亲委派是指在加载类的时候,如上图,按照类加载器的顺序向上检查该类是否加载过,向下委派是否可以加载该类。 避免类重复加载并且保证安全性。其执行过程如下图
类加载源码
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内存划分(运行时数据区)
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)、动态链接、方法返回地址和附加信息。
- 局部变量表:方法中定义的局部变量以及方法的参数存放在这张表中。如需要使用的话,必须通过相关指令将其加载至操作数栈中作为操作数使用。
- 操作数栈:以压栈和出栈的方式存储操作数的
- 动态链接:符号引用转换为直接引用
7、堆为什么进行分代设计?
如下图,堆被分为Young区、Old区,其中Young区又分为Eden区、Survivor区,而Survivor区又分为S0和S1。
为什么这样设计有以下原因:
- 如果堆没有分代,等到堆空间满了进行清理时,需要消耗很长的时间去清理,期间应用也无法运行。
- 因为大多数对象生存时间是很短的(大多对象都是执行完方法后就没用了),需要及时被清理,但是又不能清理整个堆,所以划分了Young区、Old区,这样对象生存时间短的放到Young区,生存时间长的放到Old区,每次只清理Young区,提高效率。
- 此时如果来了一个新对象,并且Young区空间足以装下新的对象,但是因为Young区反复被清理过几次,内存空间不连续,没有完整的空间装下新对象,就会造成空间浪费。
- 这个时候如果有另外一个区域可以存放Young区的4个存活对象时(此时放入Old区只会加快清理的次数),新对象就可以正常放进来,所以有了Eden区、Survivor区。
- 但是只有一个Survivor区也会存在内存碎片问题,所以Survivor区分为S0和S1,当Young GC时,将Eden区和其中一个S区的对象都迁移到另一个S区,从而解决内存碎片的问题。
8、老年代的担保机制
当有一个新的对象Young区无法分配空间时,直接放到老年代。
9、为什么Eden:S0:S1 是8:1:1
- 大多数对象生存时间是很短的,并且在Eden就可能会被清理掉
- S0和S1需要来回存放对方以及Eden区的对象,所以比例需要一致
10、对象的创建以及分配过程
11、方法区、元数据区、持久代是什么关系?
方法区可以看作是一个规范,JDK1.7之前的实现是持久代,JDK1.8以及其之后的实现是元数据区。
元数据区的优势是,如果本机内存为16G尽管只给JVM分配了4G,元数据区也是会用到本机的其他12G内存,这样的好处是我们不用估算类信息、常量、静态变量这些数据的占用空间。
如下图,方法区中的静态变量、常量在运行时内存中,而类信息在直接内存中。
12、对象在内存中的布局
相关文章:

JVM调优面试题——基础知识
文章目录1、JDK,JRE以及JVM的关系2、编译器到底干了什么事?3、类加载机制是什么?3.1、装载(Load)3.2、链接(Link)3.3、初始化(Initialize)4、类加载器有哪些?5、什么是双亲委派机制?6、介绍一下JVM内存划分(…...
三、mongdb 查询
一、 MongoDB文档检索 MongoDB中有多种方式可以检索文档: 1.1 查询过滤器 使用查询过滤器从集合中检索文档。查询过滤器是一组键值对,可按字段值查询文档。 例如: db.col.find({"status":"A"})这个示例查询status等于“A”的文档。 1.2 范围查询操作符…...

python的 ping 网络状态监测方法(含多IP)
ping 基本概念 ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(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用户登录界面连接数据库
文章目录数据库账户注册账号登录找回密码为了实现用户登录界面的登录功能,我们必须建立一个数据库,并把账号和对应的密码,存储到数据库中。如果输入的账号和密码与数据库中的一致,那我们就允许用户登录,进入新的界面。…...
以下真的没有任何要写的了,我需要凑字数,请大家原谅
以下真的没有任何要写的了,我需要凑字数,请大家原谅!!!!!!!!!!!!!!!&#…...

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

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

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

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

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

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

Session会话管理
会话管理Web会话管理概述常见的Web应用会话管理方式基于Server端的Session的管理方式基于Cookie的Session的管理方式Cookie与Session最大的区别Cookie-Based的管理方式基于Token-Based的管理方式Web会话管理的安全问题Web会话管理概述 会话管理:在进行人机交互的时…...
极智开发 | ubuntu源码编译cuda版opencv
欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍一下 ubuntu源码编译cuda版opencv。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 如果你需要源码编译cpu版的opencv可以…...

umi学习(umi4)
umi 官方文档 官方建议使用 pnpm node版本在 14 以上 创建项目: 根据 包管理工具不同 ,官方推荐 这里使用 pnpm: 1. pnpm dlx create-umilatest 2. 选择模板 (这里使用 Simple App) 想对module处理需要使用 Ant Desig…...

EasyPoi的excel模板预览与下载、导出简单/复杂数据
官方文档地址:easypoi官网,官方仅供参考,部分描述有问题 excel模板预览 准备工作 事先将整理好的excel模板存在项目中,如图 excel模板预览代码 GetMapping("excel")ApiOperation("excel预览")NoLogpubli…...

收个滴滴Offer:从小伙三面经历,看看需要学点啥?
说在前面 在尼恩的(50)读者社群中,经常有小伙伴,需要面试大厂。 后续结合一些大厂的面试真题,给大家梳理一下学习路径,看看大家需要学点啥? 这里也一并把题目以及参考答案,收入咱…...

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

Qt 解决程序全屏运行弹窗引发任务栏显示
文章目录摘要在VM虚拟机器中测试setWindowFlags()关键字: Qt、 Qt::WindowStayOnTopHint、 setWindowFlags、 Qt::Window、 Qt::Tool摘要 今天眼看项目就要交付了,结果在测试程序的时候,发现在程序全品情况下,点击输入框&#x…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...