JVM常见面试题

news2024/9/22 9:53:13

目录

一、JVM内存划分

二、JVM类加载

1、什么是类加载

2、类加载的过程

2.1 加载

2.2 连接

2.3 初始化

3、何时触发类加载

4、双亲委派模型

4.1 什么是双亲委派模型

4.2 双亲委派模型的优点

三、JVM的垃圾回收机制

1、什么是GC

2、GC回收哪部分内存

3、判定垃圾的算法

3.1 引用计数

3.2 可达性分析

4、垃圾回收算法

4.1 标记清除

4.2 复制算法

4.3 标记整理

4.4 分代回收


一、JVM内存划分

堆区:存放new出来的对象,所有线程共享堆区

栈区:存放方法之间的调用关系,每个线程对应有一个栈区

方法区:存放类对象(加载好的类),所有线程共享方法区

程序计数器:存放下一个要执行的指令的地址,每个线程对应有一个程序计数器

注意: 方法区在JDK8之后被替换为元数据区/元空间

JVM的内存划分一般会结合代码来考,举个例子:

class Test2{
    private int z;
}
public class Test {
    //x是成员变量,在堆区
    public int x;

    //y是静态成员变量,类变量,在方法区
    public static int y;
    
    //test2也是静态成员变量,在方法区,但是它new的对象在堆区,所以test2中的z也在堆区
    public static Test2 test2 = new Test2();
    public static void main(String[] args) {
        //test是一个局部变量,在栈区,但是它new的对象在堆区
        Test test = new Test();
    }
}

注意:变量存在于哪个区域,和变量类型无关,和变量的形态(局部/成员/静态)有关!

二、JVM类加载

1、什么是类加载

        java程序在运行之前,需要先进行编译,把.java文件编译为二进制字节码的.class文件,当程序运行的时候,JVM就会读取对应的.class文件,并且解析文件中的内容,在内存中构造一个类对象并初始化。

2、类加载的过程

类加载的过程大体可分为以下几个步骤:

2.1 加载

JVM找到对应的.class文件,读取文件内容,并按照.class规范的格式来解析。

注意:“加载”阶段只是整个“类加载”过程中的一个阶段,不要搞混了~

2.2 连接

连接过程又可以细分为三个步骤:

(1) 验证

检查当前的.class文件的字节流中包含的信息是否符合《Java虚拟机规范》的全部约束要求,保证这些信息被当做代码运行后不会危害JVM自身的安全。

(2) 准备

给类里的静态变量分配内存空间,初始值设为0。

(3) 解析

将常量池内的符号引用替换为直接引用,即初始化字符串常量的过程。

一个.class文件中包含很多字符串常量,比如代码里有一个字符串常量:String s = "hello",但是在类加载之前,"hello"还没有分配到内存空间,s里也就无法保存"hello"的真实地址,只能先使用一个占位符(即符号引用)来标记一下(这里存的是"hello"的地址),等到真正给"hello"分配内存空间后,就能使用真正的内存空间地址替代占位符~ 

2.3 初始化

执行类中的构造方法,对类进行初始化,加载父类、初始化静态变量、执行静态代码块……

3、何时触发类加载

(1) 第一次创建类的实例时;

(2) 使用了类的静态方法或静态属性;

(3)  使用了类的子类。

4、双亲委派模型

4.1 什么是双亲委派模型

JVM加载类,是由类加载器来负责的,JVM中自带了多个类加载器(程序猿也可以自己实现)。

描述这几个类加载器相互配合的工作过程就是双亲委派模型。 

        如果一个类加载器收到了类加载的请求, 它不会自己去尝试加载这个类,而是先把这个请求交给父类加载器去完成,每一个类加载器都是这样,因此所有的请求最终都会先交给最顶层的类加载器去完成,只有当父类加载器无法完成这个请求时(它的搜索范围中没有找到所需的类),子类加载器才会尝试自己去完成。

如果父类加载器无法完成这个请求,就会交还给子类加载器去完成。

4.2 双亲委派模型的优点

安全性:使用双亲委派模型可以保证Java的核心API不被篡改,如果没有使用双亲委派模型,而是每个类加载器加载自己负责的类就可能会带来一些问题,比如程序猿自己写了一个全限定名称为“java.lang.Object”的类,那么程序运行的时候,就会加载程序猿自己写的Object类,而不是标准库中的Object类,因此安全性就不能得到保证。

三、JVM的垃圾回收机制

1、什么是GC

        由于申请内存资源后,需要手动释放内存资源,否则会造成内存泄漏问题,但是手动释放内存资源最大的问题就是容易忘记释放,GC(Garbage Collection)是一种自动释放资源的机制,程序猿只需要负责申请内存,释放内存的工作,由JVM完成。

2、GC回收哪部分内存

        GC主要针对堆区来进行内存回收。

        栈区的变量,释放时机确定(出了作用域生命周期就结束),不必回收;程序计数器是固定内存空间,不必回收;方法区中的静态属性,在类加载之后一般是不会卸载的,所以也不需要进行处理。

3、判定垃圾的算法

在Java中,如果一个对象没有被任何引用指向的时候,就说明这个对象无法再被使用了,那么这个对象就是垃圾。

两种典型的判定对象是否存在引用的方法:

3.1 引用计数

        给每个对象都加上一个引用计数器,每当有一个引用指向这个对象时,计数器就+1;每当一个有引用不再指向这个对象时,计数器就-1,当计数器为0为,就说明这个对象不再被使用了。

但是,这种方法并不是JVM采取的方法,因为引用计数法无法解决对象的循环引用问题

循环引用的代码示例: 

public class Demo {
    public Demo demo;
    public static void demoGC(){
        Demo demo1 = new Demo();
        Demo demo2 = new Demo();
        demo1.demo = demo2;
        demo2.demo = demo1;
        demo1 = null;
        demo2 = null;
        //强制jvm进行垃圾回收
        System.gc();
    }
    public static void main(String[] args) {
        demoGC();
    }
}

3.2 可达性分析

        约定一些特定的对象——GC Roots作为起始点,每隔一段时间,就从GC Roots出发进行遍历,能够被访问到的对象就被称为“可达”,否则就是“不可达”。

        可达性分析是JVM中采用的判断对象是否存在引用的方法。

在Java中,可作为GC Roots的对象有以下几种:

(1) 栈上的引用类型变量;

(2) 常量池中的对象;

(3) 方法区中,静态的引用类型变量。

4、垃圾回收算法

4.1 标记清除

        算法分为“标记”和“清除”两个阶段:首先标记出所有可回收的对象,在标记完成后统一回收所有被标记的对象。

标记清除算法的缺点

(1) 效率问题:标记和清除这两个过程的效率都会带来额外的时间开销;

(2) 空间问题:标记清除后会产生大量的内存碎片,内存碎片太多的话,可能会导致程序在后续运行中需要给一个较大对象分配空间时,无法找到足够连续的内存。 

 

4.2 复制算法

        复制算法将可用内存按容量分为大小相等的两块空间,每次只使用其中的一块。当内存1需要进行垃圾回收时,会将内存1上还存活的对象复制到内存2上,然后再把内存1上的对象全部清理掉。这样做就不会产生大量的内存碎片。

复制算法的缺点

(1) 空间利用率更低,只有一半的内存被使用,另一半的内存空着。

(2) 如果内存上的存活对象比较多,可回收的对象比较少时,复制算法的效率就会大大降低。 

4.3 标记整理

        标记整理算法的标记过程和标记清楚算法的标记过程一样,而整理过程类似于顺序表中的删除元素操作,但搬运对象的过程也比较耗时。

4.4 分代回收

        分代算法是根据对象存活的周期而把内存划分为几个部分。Java堆中分为新生代和老年代。在新生代中,每次垃圾回收都会有大量对象被回收,只有少数对象存活,因此在新生代中使用“复制算法”;而老年代中对象存活率高,一般使用标记整理法。

哪些对象会进入新生代/老年代? 

新生代:一般刚创建的对象会进入新生代的伊甸区,如果经过一轮GC还存活的话会进入到新生代中的生存区;

老年代:刚创建的比较大的对象和经历了N次(一般是15次)GC后还存活的对象对象会从新生代进入到老年代。

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

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

相关文章

# Monaco Editor 使用

Monaco Editor 使用 文章目录Monaco Editor 使用安装依赖版本问题vue2Vue3webpack-dev-servermonaco-editor-webpack-pluginVersion Matrix集成步骤Vue2 配置 monaco-editor-webpack-plugin 插件Vue3 vue.config.js测试页面实例属性说明支持的语言类型报错解决控制台报错效果图…

自适应滤波器更新算法-EP2

文章目录1、变步长 SC-MPNLMS 频域分块算法1.1 算法原理1.2 算法代码1.3 算法优缺点2、集成多种自适应滤波算法的回声消除器1.1 算法原理1.2 算法代码1.3算法优缺点1.4 算法自适应准则3、新的变步长的LMS自适应滤波算法3.1算法原理3.2算法代码3.3算法优缺点参考文献本文接上一篇…

钉钉小程序入门3—钉钉扫码登录PC端网站

第一部分、准备材料🌲 公网环境 老版钉钉扫码中必须要配置一个域名才可以调试,新版支持IP配置调了。我是手机打开热点,电脑连接热点进行调试的,比老版要方便了不少。 查看本机IP地址方法: 如果使用的Windows&#xff…

MySQL高可用复制管理工具 —— Orchestrator使用

Orchestrator介绍 Orchestrator(orch):go编写的MySQL高可用性和复制拓扑管理工具,支持复制拓扑结构的调整,自动故障转移和手动主从切换等。后端数据库用MySQL或SQLite存储元数据,并提供Web界面展示MySQL复…

docker学习笔记2(狂神)

Docker的常用命令 然后我们来学我们最重要的镜像命令: docker images 查看所有本地的主机上的镜像 docker search搜索镜像: docker pull下载镜像: docker pull 镜像名[:tag] 指定版本下载: docker rmi删除镜像: 批量…

[附源码]Python计算机毕业设计Django市场摊位管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

m基于遗传优化的不同等级电动汽车充电站的选址方案matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 作为电动汽车的普及与推广,必要的基础配套服务设施、充电站的建设位置和选址规划对整体行业的发展起着重要的意义,本文中提出了一个不同等级电动汽车充电站的选址与求解算…

Zebec联合Visa推出实体借记卡持续利好生态,$ZBC表现强劲

Zebec生态从今年年初开始,持续的释放利好提振市场信心。此前,Zebec曾以 10 亿美元的完全稀释估值筹集了 850 万美元,该轮融资投资者包括 Circle Ventures、Shima 和 Resolute等知名 Web3 投资机构。这是 Zebec Protocol 继今年年初获得 2800 …

计算机系统基本概念

1.计算机的硬件结构 早期的计算机没有很复杂的图形功能,CPU的核心频率也不高,跟内存的频率一样,它们都是直接连接在同一个总线(Bus) 上的。由于IO设备诸如显示设备、键盘、软盘和磁盘等速度与CPU和内存相比还是慢很多…

QT:布局管理器消息盒子对话框

让组件在水平和垂直方向对齐 有三种常用布局管理器: 水平,QHBoxLayout 垂直,QVBoxLayout 网格,QGridLayout(使布局好的界面嵌套到主窗口) 1.让组件大小固定 修改属性:minimusize,maxmumsize 最小和最大组件…

使用setuptools构建python包

python包分发方式 源码包分发: 源码包安装过程是先解压,再编译。最后才安装,所以其是跨平台的,由于每次安装都需要进行编译,相对于二进制包安装方式来说安装速度较慢。 解压——编译——安装 源码包本质上是一个压缩…

CDGA|2023年数据治理发展前景预测步骤

CDGA|2023年数据治理发展前景预测步骤 数据治理发展前景预测,就是在数据治理市场调查获得的各种信息和资料的基础上,运用科学的预测技术和方法,对影响数据治理市场供求变化的诸因素进行调查研究,分析和预见数据治理发展趋势&…

《解构领域驱动设计》读书笔记

文章目录书籍信息开篇软件复杂度剖析复杂系统理解能力预测能力领域驱动设计概览基本概念控制软件复杂度领域驱动设计统一过程现存的不足领域驱动设计统一过程全局分析问题空间探索全局分析的 5W 模型高效沟通高效协作商业模式画布业务流程图服务蓝图用例图事件风暴学习循环价值…

windows系统下mysql的主从复制

使用一台物理机实现mysql的主从复制功能。 准备: 1、操作系统:Windows Server 2016 Standard 2、下载mysql免安装包: https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.17-winx64.zip 安装maser 1、解压mysql压缩包&…

Windows下安装hadoop2.7.4

Windows下安装hadoop 案例环境 该压缩包是已经简化配置后的 hadoop2.7.4下载地址文件分享 (weiyun.com) 安装步骤 解压压缩包 配置环境变量 在系统变量中添加 在path中添加 拷贝hadoop2.7.4\bin\hadoop.dll到目录C:\Windows\System32 配置文件 把/etc/hadoop/ 下目录的相…

玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一)

前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。 而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞&a…

管理RMAN备份_维护RMAN备份和仓库记录

1.RMAN备份和仓库维护概述 1.1.备份和仓库维护的目的 建议的维护策略是配置一个快速恢复区域,一个备份保留策略和一个归档 redo日志删除策略。在这种情况中,数据库按需要自动维护和删除备份与归档redo日志。然而,有时…

[附源码]Python计算机毕业设计Django水果管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

阿里P8专家爆出:入职阿里必备的598道java面试题,内含算法

前言 之前也给大家分享过很多的面试题和大佬的面试经验,相信大家也已经利用到了,也顺利找到了工作,并拿到了高薪。 今天就给大家分享阿里P8专家长期以来面试所问到的java面试题,总共有598道(含算法)&…

PCL 使用MLS 上采样

移动最小二乘法MLS(Moving Lest Squares)简要介绍_Figure 09的博客-CSDN博客_移动最小二乘法 深入理解移动最小二乘法曲面拟合代码(MLS2D.m)_残影丶的博客-CSDN博客_mls2d PCL 点云采样_Σίσυφος1900的博客-CSDN博客 上采样…