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

JVM面试总结

1.java内存模型

JMM是java的内存模型,JMM-也叫Java Memory Model,这里反应翻译成存储更好,因为工作内存指的不是内存.而是CPU寄存器,主内存才是内存.屏蔽了各种硬件和操作系统的内存访问差异-把硬件的细节封装起来,实现让java程序在各平台下都能达到一致的内存访问效果,它定义了jvm如何将程序中的变量在主存中读取

具体定义为:1)所有变量都存在主存中,主存是线程共享区域;

2)每个线程都有自己独有的工作内存,线程想要操作变量就必须从主存中copy变量到自 己的工作区,每个线程的工作内存是相互隔离的

3)由于主存和工作内存之间有读写延迟,且读写不是原子性操作,所以会有线程安全问题

相关问题--内存可见性

2.jvm的内存结构

1)堆.只有堆是线程共享的,JVM进行垃圾回收的主要区域,存放对象的信息,分为新生代和老年代,

线程私有区:

1)虚拟机栈:放了局部变量和方法调用信息 每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧都有方法的参数,局部变量,方法出口等信息,方法执行完毕后释放栈帧

2) 本地方法栈:为native修饰的本地方法提供空间,一般是c语言的方法

3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码,因为指令是字节码文件

程序想要运行,,JVM需要将字节码文件加载到内存上,程序就会一条条把指令从内存读取起来,放到cpu执行,也就要随时记住,当前执行的是哪一条,因为cpu是并发执行程序的,cpu是同时运行所有进程,而操作系统是以线程为单位基本调度执行,每个线程都得记录自己的执行为位置,所以每个线程都有自己的程序计数器

4)方法区:放的是"类对象"

.java-> ,class文件后会被加载到内存中,也就被jvm构建成了类对象

这里的类对象就是放到方法区中,类对象描述了这个类长什么样

类的名字,方法,成员,成员的名字和;类型,是什么权限,每个方法什么名字什么类型,方法里的指令

还有一个静态成员

staitc修饰的成员变量是类属性

普通的成员变量是"实例属性"

3,什么情况下会内存溢出

堆内存溢出:

1)对象一直创建而不回收

2)加载的类越来越多的时候

3)虚拟机栈的线程越来越多

栈溢出

方法调用次数过多,一般是递归不当造成

4.JVM垃圾回收机制

第一步先找垃圾/判断垃圾

第二步释放垃圾

第一步找垃圾:

1)基于引用计数(Phtyon采取的方法

针对每个对象,都会额外引入一小块内存,保存这个对象有多少个引用指向

这个内存不再使用,就释放了

引用计数为0,就不再使用了

通过引用计数来决定对象的生死.

引用计数简单可靠高效但是有缺点

  • 空间利用率低,每个new的对象都得搭配个计数器,如果对象很小,计数器占用的内存就很大,空间就浪费了

  • 循环引用的问题

第一步

第二步

第三步

第四步

此时此刻,两个对象的引用计数不为0.但是由于引用长在彼此身上,所以外界代码就无法访问到

这两个对象就被孤立了.及不能使用,也不能释放.这就是内存泄露

2)基于可达性分析(java采取的方案)

通过额外的线程,定期堆整个内存空间的对象进行扫描

有些起始位置(GCRoots)会类似于深度优先遍历一样,把可以访问到的对象都标记一遍

GCRoots分为三类

  • 栈上的局部变量

  • 常量池里的引用指向的对象

  • 方法区中的静态成员指向的对象

带有标记的就是可达对象,没有标记的就是不可达 就是垃圾

可达性分析的优点就是克服了引用计数的缺点:1.空间利用率低,2.循环引用问题

但是缺点:系统开销大.遍历一次比较慢

第二步,回收垃圾

三种策略:标记-清除 复制算法 3. 标记-整理

1.标记-清除

标记就是可达性分析的过程.清除就是直接释放内存

如果直接释放,被释放的内存是离散的,不是连续的,是分散开的,带来的就是内存碎片问题

2.复制算法

把内存分为两半,只使用一半.进行垃圾回收的时候,现将存活的对象复制到另一块区域,然后清空之前的区域,用在新生代

3.标记整理算法

与标记清除类似,但是在标记之后,把存活的对象向一端移动,然后清除边界外的垃圾对象,用在老年代

4.结合一起---分代回收

针对对象进行分类(根据对象的年龄进行分类)

什么是年龄 就是一个对象熬过一轮GC的扫描就长了一岁

1.刚创建出来的对象,就放在伊甸区

2.如果伊甸区的对象熬过一轮gc扫描就会被拷贝到幸存区(复制算法

3.在后续的几轮CG中,幸存区额度对象就会在两个幸存区之间来回拷贝(复制算法

每一轮都会淘汰一波

4.在持续若干轮后,进入老年代(标记-整理

5.特殊情况

大对象,占用内存多的对象直接进入老年代,因为大对象拷贝开销大,不适合使用复制算法

5.典型的垃圾回收器

1).CMS收集器

标志就是STW时间短

他基于可达性分析:

1)初始标记找到GCRoots.速度很快,会引起短暂的stw

2)并发标记,虽然速度慢,但是可以和业务线程并发执行,不会引起STW

3)重新标记,因为2)中的业务线程可能会影响并发标记的结果,针对2)的结果进行微调.会引起stw但是快

4)回收内存,也是和业务进程并发

2).G1收集器

唯一的全区域的垃圾回收期

把整个内存分成了很小的区域--Region

给这些Region进行了不同的标记

然后扫描的时候一次那个扫描若干个Region,不追求一轮GC就扫描,

6.类加载的过程

是运行环境的时候一个重要核心功能,

目标:把.class文件加载到内存中,构建成类对象

1)Loading环节

找到对应的.class文件,打开并读取.class文件,同时初步生成一个大概的类对象

Loading最关键的一个环节,就是读取解析class文件

把读取解析得到的信息初步填写到类对象中

2)Linking环节

建立多个实体之间的联系

① Verification 检验

检验读到的内容格式是否和规范规定的格式是否完全匹配.如果发现读到的数据格式不符合规范.就会类加载失败,并抛出一个异常

② Preparation 准备

正式为类中定义的变量,就是静态变量,分配内存并设置变量初始量的阶段

第一步给静态变量分配内存

第二步,给它设置到0值

第三步,给它在内存上设置编号,为了最后一个阶段做准备

③Resolution 解析

java虚拟机将常量池的符号引用替换为直接饮用的过程,也就是初始化常量的过程

因为.class文件的常量是集中防止的,每个常量都有一个编号

resolution阶段需要根据编号找到对应内容并填充到类对象中

3)initializing 初始化

真正的对类对象进行初始化,尤其针对静态成员

7.双亲委派机制

JVM提供了专门的对象,叫类加载器,负责进行类加载

找文件的过程也是通过类加载器来负责的

.class文件可能放置的位置有很多,有的要放到jdk目录里,有的要放到项目目录里

还有在其他特定位置

因此,JVM里面提供了多个类加载器,每个类加载器负责了一个片区

默认的类加载器 主要有三个

1)BootStrapClassLoader -负载加载标准库中的类

2)ExtensionClassLoader -负责加载JDK拓展的类

3)ApplicationCLassLoader-负责加载当前目录中的类

当一个类加载器收到类加载请求时,会先把这个请求交给父类加载器处理,若父类加载器找不到该类,再由自己去寻找。

该机制可以避免类被重复加载,还可以避免系统级别的类被篡改

8.jdk,jre和jvm

  • jdk:java开发工具包.包括jre(java运行环境),java工具,java基础类库

  • jre:java运行环境,包括jvm标准实现以及java核心类库

  • jvm:java虚拟机,一种抽象化的计算机

9.对象头中的信息

对象头有两个部分,一部分是MarkWork,存储对象运行时的数据,比如对象的hashcode,GC分代年龄,GC标记,锁的状态,获取到锁的线程ID等;

另外一部分是表明对象所属类,如果是数组,还有一个部分存放数组的长度

相关文章:

JVM面试总结

1.java内存模型JMM是java的内存模型,JMM-也叫Java Memory Model,这里反应翻译成存储更好,因为工作内存指的不是内存.而是CPU寄存器,主内存才是内存.屏蔽了各种硬件和操作系统的内存访问差异-把硬件的细节封装起来,实现让java程序在各平台下都能达到一致的内存访问效果,它定义了…...

C语言——文件操作

文章目录0. 思维导图1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭4. 文件的顺序读写4.1 字符/字符串写入(出)4.2 格式化写入(出)4.3 二进制输入&#…...

使用aim7测试内核性能变化

aim7是一个功能强大的性能测试套件,可以用来测试内核的性能变化情况,尤其是在修改内核源码后,用来测试补丁对内核性能的影响情况。aim7测试结果中有一个重要的统计项:jobs/min,即每分钟完成的任务数量,可以…...

C++——内存管理

一,为什么要有内存管理因为在C/C中各个内置类型或者是自定义类型的大小都不一样,而如何让各个类型在内存中合理分布就非常有必要,由此我们就需要有内存管理。我们来看看下面这个程序中的各个变量都是如何分布的int globalVar 1; static int …...

AOP的另类用法 (权限校验自定义注解)

👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 AOP的另类用法 (权限校验&&自定义注解) 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉&#x1f649…...

[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 快速排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代…...

运算符——“Python”

各位CSDN的uu们你们好呀,好久没有更新Python文章了,今天,小雅兰的内容就是Python中的操作符啦,那么现在,就让我们进入Python的世界吧 注释 注释是什么 注释的语法 注释的规范 输入输出 和用户交互 通过控制台输出 通…...

2022 IoTDB Summit:华为王超《Apache IoTDB 在华为云的实践》

12 月 3 日、4日,2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本,并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例,深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…...

C 语言网络编程 — PF_NETLINK sockets

目录 文章目录目录PF_NETLINK socketsPF_NETLINK sockets Linux 提供了 4 种 User Process 和 Kernel 之间进行通信的 IPC(Inter-Process Communicate,进程间通信)方式: /procioctlsysfsPF_NETLINK sockets(Netlink …...

广州银行冲刺A股上市:不良贷款规模突破100亿元,不良率飙升

又一家城商行平移申报IPO。近日,广州银行股份有限公司(下称“广州银行”)递交招股书,准备在深圳证券交易所主板上市。本次冲刺上市,广州银行计划募资约94.79亿元,国泰君安证券为其保荐机构。 截至目前&…...

【C++】bsearch函数的使用及二分法查找介绍

写程序的时候,肯定避免不了需要从集合中找到符合条件的元素,一般情况下,最简单也最常用的就是循环遍历元素,这种方法虽然写的简单,但是小数据量还行,但是数据过大的话,这样效率就低了。循环的时…...

分布式系统中的补偿机制设计问题

我们知道,应用系统在分布式的情况下,在通信时会有着一个显著的问题,即一个业务流程往往需要组合一组服务,且单单一次通信可能会经过 DNS 服务,网卡、交换机、路由器、负载均衡等设备,而这些服务于设备都不一…...

类成员的方法

初识对象 生活中或是程序中,我们都可以使用设计表格、生产表格、填写表格的形式组织数据进行对比,在程序中: 设计表格,称之为:设计类(class) 打印表格,称之为:创建对象 …...

华为OD机试真题Python实现【端口合并】真题+解题思路+代码(20222023)

端口合并 题目 有M(1<=M<=10)个端口组, 每个端口组是长度为N(1<=N<=100)的整数数组, 如果端口组间存在 2 个及以上不同端口相同, 则认为这 2 个端口组互相关联,可以合并 第一行输入端口组个数 M,再输入 M 行,每行逗号分隔,代表端口组。 输出合并后的端口组…...

自考本科计算机网络原理(04741)历年大题真题【18年10月-22年10月】

文章目录一、简答题&#xff08;历年真题&#xff09;18年10月-22年10月历年简答题出题情况分析2018年10月2019年4月2019年10月2020年8月2020年10月2021年4月2021年10月2022年4月2022年10月二、综合题&#xff08;历年真题&#xff09;2018年10月2019年4月2019年10月2020年8月2…...

计算机SCI期刊投稿,除了投稿信,还要做什么准备? - 易智编译EaseEditing

投稿信的准备 期刊的编辑往往需要一些有关作者及其论文的信息。 而作者也希望给编辑提供一些有助于其全文送审及决策的信息。 这些信息都应该包括在投稿信中。 投稿信应包括以下几方面的内容&#xff1a; 文题和所有作者的姓名;稿件适宜的栏目; 为什么此论文适合于在该刊而…...

Allegro如何刷新封装和库里的封装同步操作指导

Allegro如何刷新封装和库里的封装同步操作指导 在做PCB设计的过程中,有时会因为库里的封装有更新,所以PCB上使用到了这个封装时候需要和库里的同步,如下图 如何刷新,具体操作如下 点击Place点击Update Symbols...

基于Vue3手写选课组件(含时区切换,拖拽选择)

环境说明 基于vue3vite 无关联别的ui框架&#xff0c;组件化 初次使用vue3&#xff0c;技术菜&#xff0c;大佬勿喷 main.ts "moment": "^2.29.4","moment-timezone": "^0.5.41",import moment from moment; import momentTz from &…...

准备好了吗?加入 GDE 成长计划,成为下一位谷歌开发者专家!

谷歌开发者专家 (Google Developer Experts&#xff0c;GDE)&#xff0c;又称谷歌开发者专家项目&#xff0c;是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…...

搭建帮助中心的 8 个最佳工具

网站帮助中心的作用通过向客户表明您了解他们所面临的问题以及如何提供帮助来建立信任&#xff1b;通过回答常见问题来改善客户服务&#xff0c;增强专业的品牌形象&#xff1b;通过减少重复发送给支持人员的电话和电子邮件&#xff0c;节省时间和金钱&#xff1b;增强您在搜索…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...