JVM的几个面试重点

JVM的内存区域划分

JVM类加载机制

        前言

        Java程序最开始是一个 .java 的文件,JVM把它编译成  .closs 文件(字节码文件),运行 Java 程序, JVM 就会读取 .class 文件,把文件内容读取到内存中,构造出一个 .class 对象(类对象)

        1.加载

        JVM 加载 .class 文件的时候需要用到 “类加载器模块” ,JVM 中自带了三个类加载器模块

        分别是,Bootstrap ClassLoader(负责加载标准库中的类)

                        Extension ClassLoader(负责加载 JVM 扩展的库)

                        Application ClassLoader(负责加载第三方库)

        三个类加载器的优先级由高到低

        要加载 .class 文件,我们就需要先找到 .class 文件,此时我们就涉及到双亲委派模型

        什么是双亲委派模型

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

        假设我们现在需要加载一个 .class 文件,此时类加载的请求就会传给 Application ClassLoader (负责加载第三方库),但 Application ClassLoader 不会直接就尝试寻找并加载 .class 文件,而是把这个请求发送给自己的父类 Extension ClassLoader(负责加载 JVM 扩展的库),同理 Extension ClassLoader 也会把类加载的请求传给 Bootstrap ClassLoader(负责加载标准库中的类) , Bootstrap ClassLoader 没有父类了,才会真正的去搜索  .class 文件,并加载到内存中,如果 Bootstrap ClassLoader 没有查找到  .class 文件,就将类加载的请求传回给子类  Extension ClassLoader 进行加载,同理,要是  Extension ClassLoader 没有查找到  .class 文件,也会将类加载的请求传回给子类 Application ClassLoader 进行加载,经过这段流程的寻找,一般就能找到对应的  .class 文件

        2.验证

        找到  .class 文件以后还需要验证  .class 文件的格式是否符合约束要求

        3.准备

        准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值 的阶段。

        4.解析

        解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。

        5.初始化

        初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。初始化 阶段就是执行类构造器方法的过程。

        类在什么时候被加载

        懒汉模式,用到了才加载

        1.构造类的实例

        2.使用了类的静态方法,静态属性

        3.子类的加载会触发父类

        类加载了以后,后面就不必再次加载了

JVM垃圾回收机制

        很多编程语言都有垃圾回收的机制,Java也不例外,垃圾回收机制可以自动的将不再使用的对象进行销毁,释放对象所占用的内存空间

        在 JVM 的内存区域划分中,我们进行垃圾回收的主要位置是堆,因为栈和计数器是和线程共存亡的,当线程结束以后便会自动释放栈和计数器所占的内存,而我们实例化的对象都是放到堆中的

        进行垃圾回收,首先我们需要考虑哪些对象是死亡对象(垃圾),当一个对象没有被引用指向的时候,我们就可以认为这个对象是死亡对象,因为这个对象用户已经无法访问到它了

死亡对象的判断算法

        1.引用计数算法

        引用计数描述的算法为: 给对象增加一个引用计数器,每当有一个地方引用它时,计数器就+1;当引用失效时,计数器就-1;任 何时刻计数器为0的对象就是不能再被使用的,即对象已"死"。 引用计数法实现简单,判定效率也比较高,在大部分情况下都是一个不错的算法。比如Python语言就采 用引用计数法进行内存管理。 但是,在主流的JVM中没有选用引用计数法来管理内存,最主要的原因就是引用计数法无法解决对象的 循环引用问题

        

        2.可达性分析(Java中实际采取的方案)

        JVM 首先会遍历代码中所有的引用,根据引用找到对应的对象,将能通过引用访问到的对象标记成可达,完成整个遍历以后,没有被标记成可达的对象,也就是不可达,就相当于是垃圾了

        

        在分析完哪些对象是垃圾对象以后,我们就需要将这些垃圾对象进行回收,回收有以下的几种算法

垃圾回收

        1.直接释放

        直接释放对象,很简单干脆,但是存在内存碎片问题

        因为在申请内存的时候,都是申请的连续的内存空间,直接释放内存的话就会破坏原有的连续性,产生内存碎片,随着程序运行得越来越多,内存碎片也会越来越多,越来越碎,这样就会出现明明有内存但是无法申请的情况,这是一个很严重的问题

        2.复制算法

        把一个内存分两份,用一份丢一份(用双倍的空间来存储对象),存储对象的时候用两倍的空间存储,一开始将对象统一存放在左边的空间,当要进行垃圾回收的时候,就将不需要回收的对象复制到右边,然后再将左边的内存全部释放,下一次进行垃圾回收就将复制到左边,把右边的内存全部释放,这样就能解决内存碎片问题

        但是,该算法会浪费一半的空间,而且要频繁进行对象的复制,会大大影响效率

        3.分代算法(GC)(当前JVM采用)

        当前 JVM 垃圾收集都采用的是"分代收集(Generational Collection)"算法,这个算法并没有新思想,只 是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代。在新生代中,每 次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象存活率高、没 有额外空间对它进行分配担保,就必须采用"标记-清理"或者"标记-整理"算法。

        将整个堆分为三个部分:1.新生代,2.幸存区,3.老年代

       JVM 会周期性的遍历三个部分中的对象

        一开始创建的对象放到新生代,遍历新生代中的对象,将垃圾对象进行释放(大多数的对象活不过第一轮GC遍历),不是垃圾对象的就复制到幸存区中

        幸存区分为两个部分,采用的是复制算法,在幸存区经过多轮GC遍历还没有成为垃圾对象被回收的对象就会被复制到老年代,老年代中的对象是不容易被回收的对象,所以进行GC遍历的频率也较低

        

        

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程与高并发

1.线程创建的3种方式 2.线程的状态切换步骤 3.线程的5中状态 Java中的线程的生命周期大体可分为5种状态。 1. 新建(NEW):新创建了一个线程对象。 2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的sta…

通义大模型使用指南之通义千问

一、注册 我们可以打开以下网站,用手机号注册一个账号即可。 通义大模型 (aliyun.com) 二、使用介绍 如图,我们可以看到有三个大项功能,通义千问、通义万相、通义听悟。下来我们体验一下通义千问的功能。 1、通义千问 通义千问主要有两个功能…

北邮22级信通院数电:Verilog-FPGA(6)第六周实验:全加器

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 先抄作业!!!&am…

人工智能算法PPT学习

YOLO You only look once 是一种图像识别算法,速度较快。高效、灵活、泛化性能好,在工业中较为受欢迎。 图像金字塔 一幅图像的多个不同分辨率的子图构成的图像集合。是通过一个图像不断的降低采样率产生的,最小的图像可能仅仅有一个像素点…

如何在Ubuntu下安装RabbitMQ服务并异地远程访问?

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

Elasticsearch 8.X 分词插件版本更新不及时解决方案

1、关于 Elasticsearch 8.X IK 分词插件相关问题 球友在 ElasticSearch 版本选型问题中提及:如果要使用ik插件,是不是就使用目前最新的IK对应elasticsearch的版本“8.8.2”? https://github.com/medcl/elasticsearch-analysis-ik/releases/ta…

强大的虚拟机软件 VMware Fusion Pro 13中文最新 for mac

VMware Fusion Pro是一款虚拟化软件,它允许在Mac电脑上同时运行Windows和其他操作系统,而无需重启电脑,它采用了领先的虚拟化技术,能够保证在Mac电脑在同时运行多个操作系统时表现出极高的效率和稳定性。 VMware Fusion Pro具有以…

计算机网络的七层结构、五层结构和四层结构

为什么要分层: 这个就和我们平常写程序一样,高内聚、低耦合。将网络进行分层我们就可以根据每一层的功能分开开发设计,将复杂的网络问题分解为更简单和清晰的小问题,方便设计、实现和标准化。无需在意其他层是如何实现的&#xff…

maven仓库改国内源

今天准备复现漏洞环境,发现太慢,需要配置国内源 file -> settings 搜索maven 修改settings.xml,这里的需要修改两个文件 1.上图的settings.xml文件 2.idea的maven模块 settings.xml文件将原来的注释掉,然后把阿里的添加上&…

保姆级阿里云ESC服务器安装nodejs和服务器node服务管理工具PM2安装使用

一、安装Node到服务器 1. 创建node文件夹 默认 /opt 下边 /opt/node 也可建到其他地方,如/usr/local/node 等 创建后切换到文件夹下 cd /opt/node cd /opt/node2. 下载node并解压 使用命令下载node wget https://nodejs.org/dist/v18.12.0/node-v18.12.0-linux-…

PLC单按钮启停算法汇总

单按钮启停在三菱PLC里可以通过简单的取反指令"ALT"实现,西门子PLC如何实现ALT指令,请参考下面文章链接,这篇博客我们汇总常用的单按钮启停实现方法,希望大家读了本篇博客后有所收获。 博途ALT指令 博途S7-1200/1500PLC 取反指令(ALT)-CSDN博客SMART PLC的ALT指…

从0开始学云计算之服务器:服务的定义,特点,应用场景,分类

服务器定义 服务器是计算机的一种。它比普通计算机运行速度更快、负载更高且价格更高。 服务器的英文名称为“Server”,是指在网络上提供各种服务的高性能计算机。作为网络的节点,存储、处理网络上80%的数据、信息,因此也被称为x络的灵魂。 …

UDP网络通信反复发收

package UDP2;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;/* * 完成UDP 通信快速入门 实现发1收1*/ public class Client {public static void main(String[] args) throws Exception{// …

2023-1024‍节日(内含表白代码)

文章目录 一、前言二、代码实现三、动态展示四、总结 一、前言 1024可以是计算机操作系统的进制单位,也可以是🧑‍💻程序员们的特殊纪念日。 每年10月24日被行业认定为“程序员节”。 今天,正是一年一度的“1024程序员节”在此纪…

CVE-2022-41082:Microsoft Exchange 反序列化类型混淆 RCE 漏洞简单分析

简介 漏洞编号:CVE-2022-41082漏洞类型:类型混淆软件名称:Microsoft Exchange模块名称:Exchange 服务 powershell 接口模块历史漏洞:易受攻击的流行软件影响的版本:Microsoft Exchange Server 2019 2016 2…

【Git】升级MacOS系统,git命令无法使用

终端执行git命令报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun安装这个东东,?需要42小时 最终解决: 下载安装 https…

【OpenCV实现鼠标绘图,轨迹栏做调色板,图像的基本操作】

文章目录 鼠标绘图轨迹栏做调色板图像的基本操作 鼠标绘图 在OpenCV中操作鼠标事件 函数:cv.setMouseCallback() 目的是在鼠标双击的地方画一个圆。首先,我们需要创建一个鼠标回调函数,该函数会在鼠标事件发生时执行。鼠标事件包括左键按下…

python基础语法(4)

基础语法 前言文件文件是什么文件路径文件操作1.打开文件2. 关闭文件3.写文件4. 读文件5.上下文管理器 库使用库标准库第三方库 前言 本文基于pycharm编译器,也可以使用Anaconda 里的编译器,将讲解一些python的一些基础语法知识,是对上篇文章…

Kubernetes技术与架构-网络 3

Kubernetes集群支持为Pod或者Service申请IPV4或者IPV6的地址空间。 kube-apiserver --service-cluster-ip-range<IPv4 CIDR>,<IPv6 CIDR> kube-controller-manager --cluster-cidr<IPv4 CIDR>,<IPv6 CIDR> --service-cluster-ip-range<IPv4 CI…

论坛介绍|COSCon'23 开源百宝箱(T)

众多开源爱好者翘首期盼的开源盛会&#xff1a;第八届中国开源年会&#xff08;COSCon23&#xff09;将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01;各位新老朋友们&#xff0c;欢迎到成都&a…