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的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉…...
[数据结构]: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月】
文章目录一、简答题(历年真题)18年10月-22年10月历年简答题出题情况分析2018年10月2019年4月2019年10月2020年8月2020年10月2021年4月2021年10月2022年4月2022年10月二、综合题(历年真题)2018年10月2019年4月2019年10月2020年8月2…...
计算机SCI期刊投稿,除了投稿信,还要做什么准备? - 易智编译EaseEditing
投稿信的准备 期刊的编辑往往需要一些有关作者及其论文的信息。 而作者也希望给编辑提供一些有助于其全文送审及决策的信息。 这些信息都应该包括在投稿信中。 投稿信应包括以下几方面的内容: 文题和所有作者的姓名;稿件适宜的栏目; 为什么此论文适合于在该刊而…...
Allegro如何刷新封装和库里的封装同步操作指导
Allegro如何刷新封装和库里的封装同步操作指导 在做PCB设计的过程中,有时会因为库里的封装有更新,所以PCB上使用到了这个封装时候需要和库里的同步,如下图 如何刷新,具体操作如下 点击Place点击Update Symbols...
基于Vue3手写选课组件(含时区切换,拖拽选择)
环境说明 基于vue3vite 无关联别的ui框架,组件化 初次使用vue3,技术菜,大佬勿喷 main.ts "moment": "^2.29.4","moment-timezone": "^0.5.41",import moment from moment; import momentTz from &…...
准备好了吗?加入 GDE 成长计划,成为下一位谷歌开发者专家!
谷歌开发者专家 (Google Developer Experts,GDE),又称谷歌开发者专家项目,是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…...
搭建帮助中心的 8 个最佳工具
网站帮助中心的作用通过向客户表明您了解他们所面临的问题以及如何提供帮助来建立信任;通过回答常见问题来改善客户服务,增强专业的品牌形象;通过减少重复发送给支持人员的电话和电子邮件,节省时间和金钱;增强您在搜索…...
LQB小板焊接V3版本的小板原理图,PCB图,注意事项和步骤
第一部分,这个部分,可以不焊接,直接用买的下载器进行下载代码,外接一个下载器,网上大概是10元左右,以后学习stm32的芯片的时候,这个下载器就是一个串口转换器,也可以使用。。 当然也…...
华为OD机试真题Python实现【翻转单词顺序】真题+解题思路+代码(20222023)
翻转单词顺序 题目 输入一个英文文章片段 翻转指定区间的单词顺序,标点符号和普通字母一样处理 例如输入字符串 I am a developer. 区间[0,3]则输出 developer. a am I 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输入 使用换行隔…...
微机原理和计算机组成原理复习
1:冯诺依曼机器的主要特点? 1)计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成; 2)指令和数据存储在存储器中,并可以按地址访问; 3)指令和数据均以二进制表示&…...
mysql5.7.33安装配置教程【保姆级安装教程】
MySQL5.7.33安装教程 1、官方网站下载 点击这里跳转页面下载 1.1、看下你是什么系统,系统是64位还是32位 2、解压到D盘跟路径或者其下面纯英文路径 2.1、可见它没有data、log等文件夹,不需手动添加(下面执行命令自动初始化)!! …...
每天都和时间序列打交道,我总结了这篇文章!
Datawhale干货 作者:戳戳龍,上海交通大学,量化算法工程师前言🔴 平时工作中每天都在和时间序列打交道,对时间序列分析进行研究是有必要的🟡 分享和交流一些自己的在时序处理方面的心得,提供一…...
【Leetcode——重排链表】
文章目录一、重排链表思路1.思路2.总结一、重排链表 对于这道题,有两种思路: 思路1. 1.使用一个线性表,存储链表中的每个节点,然后按照题目的条件,来链接线性表的各个节点即可。 使用左下标和右下标来定位线性表中的…...
HCIP总结(一)
抽象语言---编码---二进制---电信号----处理电信号 (电脑工作流程) OSI参考模型 ----OSI/RM (核心思想:分层) 应用层----提供各种应用服务,将抽象语言转换成编码,提供人机交互的接口 表示层----将编码转换成二进制 …...
华为OD机试真题Python实现【黑板上色】真题+解题思路+代码(20222023)
题目 疫情过后希望小学终于又重新开学了,3 年 2 班开学第一天的任务是将后面的黑板报重新制作, 黑板上已经写上了N个正整数,同学们需要给这每个数分别上一种颜色, 为了让黑板报既美观又有学习意义,老师要求同种颜色的所有数都可以被这个颜色中最小的那个数整除, 现在帮小…...
C++中的利器——模板
前文本文主要是讲解一下C中的利器——模板,相信铁子们在学完这一节后,写代码会更加的得心应手,更加的顺畅。一,泛型编程想要学习模板,我们要先了解为什么需要模板,我们可以看看下面这个程序。int add(int&a…...
k8s控制器
目录 一、控制器简介 二、控制器类型 1、RC和RS 2、Deployment 3、DaemonSet 4、Job 5、CronJob 6、StateFulSet 7、HPA 一、控制器简介 在kubernetes中,按照Pod的创建方式可以将其分为两类: 自主式:kubernetes直接创建出来的Pod,…...
中牟网站制作/系统优化的方法
如何在电脑上面建立Python工作环境?本文会解答这个问题。Python是一门计算机编程语言,通过给计算机下达精确的指令以完成相应的任务或者事情。人类掌握Python后,就可以利用这个工具告诉计算机给人类做什么以及怎么做。人类想要学习和利用Pyth…...
做一个购物网站/昆明关键词优化
下面是一个判断整数是否为素数的C语言函数: #include <math.h>int isprime(int n) {if (n < 1) return 0;for (int i 2; i < sqrt(n); i) {if (n % i 0) return 0;}return 1; }...
企业所得税2020最新/深圳seo优化电话
直接取value即可。 refurl:http://bbs.csdn.net/topics/300110528...
上海购物网站建设/链接搜索
maven项目,maven-install总是出现这个错误,气死了, 查阅资料终于找到解决办法: 原因 这是由于缺少maven-resources-plugin-2.4.3.jar文件。这个文件是在{user.home}\.m2\repository\org\apache\maven\plugins\maven-resources-plugin\下。{user.home}是maven的配置路径…...
惠州做棋牌网站建设哪家公司收费合理/百度营销后台
文章目录**1. 概述****2. String类的特点****3. 常见操作方法****3.1 构造方法****3.2 判断功能****3.3 获取功能****3.4 转换功能****3.5 其他功能****4. String类练习**4.1 把数组中的数据按照指定个格式拼接成一个字符串**4.2 字符串反转****4.3 统计大串中小串出现的次数**…...
wordpress 更改标题/平台推广公众平台营销
文章目录一、栈实现计数器思路1、两个栈来保存字符2、比较优先级和计算3、过程会使用到的函数3.1、boolean recognize(char ch)区别是数字还是操作符3.2、int priority(char ch),用来比较优先级3.3、int operateNum(int num1, int num2, char ch)二、用代码实现三、…...