jvm面试题目补充

news2025/2/28 21:30:57

jdk&jre

Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK(Java Development Kit)。

把Java API类库中的Java SE API子集 [1] 和Java虚拟机这两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境

HotSpot VM:

HotSpot指的就是它的热点代码探测技术

垃圾回收中的空间分配担保

为了减少垃圾回收时间

minor gc前,检查老年代最大连续可用空间是否大于新生代对象总大小,如大于,则进行minor gc;

如小于,检查是否开启了分配担保,未开启,直接full gc;

开启后,检查老年代最大连续可用空间是否大于历次晋升老年代对象大小,小于则进行minorgc,同时将新生代放不下的对象提前放到老年代中,大于则full gc

根节点枚举

在特定位置时就记录对象关系到OopMap中

暂停用户线程;使用OopMap存储:类加载完成时,将什么对象存储在什么位置取出来;即时编译时,将对象存储取出放到特定位置;不需要一字不漏的将gcroot从方法区等位置取出

安全点

在特定的位置生成OopMap记录,称为安全点;到安全点时,用户线程才停止,进行垃圾回收

用户线程主动式中断:主动轮询中断标识,为true时,中断

  • 循环的末尾
  • 方法返回前
  • 调用方法的 call 之后
  • 抛出异常的位置

安全区

用户线程sleep或者blocked状态时,无法响应系统的中断请求,挂起自己线程

某个区域内,引用关系不会发生变化,进行垃圾回收是安全的

记忆集和卡表

存在跨区域垃圾回收时,GC root并不是包含所有区域的root节点,非回收区域存在回收区域的指针时,才需要加入gc root节点;用于缩小gc root扫描范围

使用以下结构存储了这些引用关系

记忆集:是否存在非回收区域指向回收区域的指针

卡表是记忆集(一种抽象概念)的实现,一个卡表存在多个卡页,一个卡页存在一个(或多个对象)对象存在跨代指针时,记录变脏标志为1,后续将这个内存页的数据加入GC ROOT一并扫描

写屏障

卡表变脏时间:引用类型对象赋值时,卡表可能变脏

引用类型对象赋值后,使用写后屏障,更新卡表。

写前屏障在G1垃圾处理器后才使用到

三色标记:并发标记阶段(可达性分析)

gcroot向下遍历对象时的算法

按照是否被垃圾回收器访问过,分为白色(没被访问过,不可达),黑色(被访问过,所有引用都被访问过,不能直接指向白色,需通过灰色间接指向白色,原因是黑色是被遍历完成的,下次标记不能重新扫描引用,此时白色会被误清理),灰色(至少一个引用未被访问过,正在枚举过程中)

假设访问对象A,访问对象A的所有引用,变为灰色对象,访问完成时,将A变为黑色对象;所有对象遍历完成时,剩余的白色对象即为垃圾;

并发标记阶段,用户线程同步进行,对象的引用关系发生了变化,因此在重新标记阶段需要对变化的引用进行处理;

引用关系两种变化场景:

1 删除引用,黑色对象引用被删除,成为浮动垃圾,下次垃圾回收时回收即可;

2 新增引用,黑色对象下添加白色对象A->F,当原来引用白色的关系被删除时B.f=null,此时进行重新标记时,B变为黑色,F还是白色,会被误清理

解决方案

增量更新

从增量角度,A.f=F,增加引用时,添加写屏障,将黑色引用白色的引用关系记录一下,重新标记时,将引用关系重新扫描,实现方案是将A变为灰色,a的引用关系重新扫描

原始快照

从删除角度,在执行B.f=nul,插入一个写屏障,记录B.f,再进行置空操作,重新标记时,将B.F变为黑色对象,不管吧B.F是否还有引用都不会被清理,如果没有引用下次垃圾回收会清理掉。宁可放过,不可杀错的思想。

引用逃逸

如果一个对象的指针被多个方法或者线程引用时,那么我们就称这个对象的指针发生了逃逸。

gcroot包含静态类,synch锁定对象、常量池中对象

垃圾回收

fullgc场景

大对象(sql未分页等)分配

metaspace溢出,classloader未回收导致元空间溢出,发生full gc

内存泄漏,由于内存泄漏会导致内存溢出

jvm参数设置不合理

内存溢出

不断创建对象时,gc root存在引用关系时,堆空间不足时会发生内存溢出

确认oom对象是否是必要的,即内存泄漏还是内存溢出,内存泄漏需要使用工具判断引用链,内存溢出需要判断堆大小相关配置

StackOverflow

虚拟机容量太小,栈帧太大,都会引起新的栈帧无法分配内存

线程请求栈的深度大于虚拟机允许的最大深度时

oom

创建线程时无法获得内存时会出现oom(jvm实现上不允许栈自动扩容,理论上允许)

方法区(类型信息(类名,父类,修饰符,实现的接口列表等)、域(属性)、方法、常量、静态变量,运行时的常量池,编译后的代码缓存)

垃圾回收主要包含:常量池和类的卸载

jdk1.6 PerGen OOM

jdk1.7 java heap

jdk1.8 metasapce oom

本地直接内存

使用NIO时,日志内容较少

永久代和方法区的关系?和元空间的关系?

收集器的分代设计扩展到方法区时,用永久代的概念实现方法区的垃圾回收,效果不理想,因此从jdk7开始逐步将永久代的字符串常量池和静态变量等移出(堆中),jdk8中永久代消失,将剩余内容(主要是类型信息)移动到直接内存metaspace元空间中

gc和内存溢出的关系

分配空间时,发现空间不足(应用空闲时也会)时会进行gc,gc后空间还不够,抛出内存溢出相关异常

减少GC开销的措施 

 (1)不要显式调用System.gc()  此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。 

 (2)尽量减少临时对象的使用  临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。 

 (3)对象不用时最好显式置为Null  一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。 

 (4)尽量使用StringBuffer,而不用String来累加字符串  由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer是可变长的,它在原有基础上进行扩增,不会产生中间对象。 

 (5)能用基本类型如Int,Long,就不用Integer,Long对象  基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。 

 (6)尽量少用静态对象变量  静态变量属于全局变量,不会被GC回收,它们会一直占用内存。

 (7)分散对象创建或删除的时间  集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片,从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC的机会。

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

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

相关文章

缓存一致性问题的解决策略

缓存一致性问题的背景和概念介绍 在一个系统中,我们通常使用数据库来存储数据,以保证数据的持久性。但是,由于数据库的读写速度相对较慢,如果每次请求都直接访问数据库,会降低系统的响应速度。为了提高系统的性能&…

进行模型测量这种量出来坡面的是平面面积还是真实面积?

斜面面积,不是表面积。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。 #DasViewer##实景三维##三维重建##三维模型…

产品经理学习-产品运营《什么是SOP》

目录 什么是SOP 如何执行SOP 执行SOP的重点 什么是SOP SOP就是项目流程操作的说明书 日常工作中的例行操作: 例行操作是指,在每一天,针对每一个用户,在每个项目之中,都必须完成的操作,这些必须完成的操…

Java 的静态代理和动态代理

文章目录 1. 代理设计模式1.1 为什么需要代理设计模式1.2 代理设计模式1.2.1 概念1.2.2 名词解释1.2.3 代理开发的核⼼要素 2. 静态代理2.1 编码2.2 静态代理存在的问题 3. 动态代理3.1 Spring动态代理的概念3.2 动态代理细节分析3.3 动态代理的实现3.3.1 JDK 动态代理3.3.2 CG…

apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$@“

[TOC](apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$”) 1、问题描述 apache 启动报错 apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$” 2、问题分析 参考链接: https://stackoverflow.com/questions/43726930/apache…

我的服务器为什么会被攻击?

时常的网站运行中,很多站长可能会遇到网站被黑客攻击的情况,其中同行之间恶性竞争,不正当的竞争关系,导致互联网关系越来越差,攻击的方式多种多样,网站遭受攻击的频次也越来越高。其次,就网络黑…

CUDA编程 - 用向量化访存优化 elementwise 核函数 - 学习记录

Cuda elementwise 一、简介1.1、ElementWise1.2、 float4 - 向量化访存 二、实践2.1、如何使用向量化访存2.2、Cuda elementwise - Add2.3、Cuda elementwise - Sigmoid2.3.1、简单的 Sigmoid 函数2.3.2、ElementWise Sigmoid float4(向量化访存) 2.4、C…

Facebook与社交创新:数字时代的社交构建者

在当今数字化时代,社交媒体已经成为人们日常生活中不可或缺的一部分。而在这个庞大的社交网络中,Facebook作为其中的巨头之一,不仅扮演着连接人们的桥梁,更是社交创新的领导者和推动者。本文将探讨Facebook在数字时代的社交构建中…

算法打卡day3|链表篇|Leetcode 203.移除链表元素、 707.设计链表 、 206.反转链表

链表基本概念 定义 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。其…

leetcode.无重复字符的最长字串(刷题日记)

自从刷题开始之后,就突然有种感觉。 就是在刷完题之后当时是知道方法了,但是当再次遇到知道就又不会做了,就只好打开解题观摩大佬的代码,你别说,每次都感觉自己是s13。 所以我就想通过写博客来总结一下每次做完新的题…

十一、计算机视觉-膨胀操作

文章目录 前言一、什么是膨胀二、膨胀操作的实现1.引入库 三、膨胀的原理 前言 上节我们学习了腐蚀操作,本节我们讲一下膨胀操作,膨胀和腐蚀实际上是相反的操作。上节我们把云峰这2个字周围没用的像素去掉了,但是云峰这2个字也变细了&#x…

C#,弗洛伊德-瑞文斯特(Floyd-Rivest)算法与源代码

Robert W. Floyd 1 Floyd-Rivest 算法 Floyd-Rivest 算法是一种选择算法,用于在不同元素的数组中找到第k个最小元素。它类似于快速选择算法,但在实际运行中有更好的运行时间。 和 QuickSelect 一样,该算法基于分区的思想工作。对数组进行分…

SINAMICS V90 指导手册 第2章 2.2_系统配套表

V90 PN配套表一共有三张,分别是200V低惯量配套表、400V高惯量配套表和400V带直型连接器的配套表。其中200V电压等级低惯量伺服功率范围从0.05-2kW,额定扭矩从0.16-6.37Nm,电缆长度分别是3m、5m、10m、20m四种型号;400V电压等级带直…

《数据治理简易速速上手小册》第4章 数据安全与合规性(2024 最新版)

文章目录 4.1 数据安全的基本原则4.1.1 基础知识4.1.2 重点案例:在线零售商的数据加密4.1.3 拓展案例 1:医疗机构的访问控制4.1.4 拓展案例 2:金融服务提供商的数据备份和恢复 4.2 遵循数据合规性的策略4.2.1 基础知识4.2.2 重点案例&#xf…

如何在项目中考虑非功能需求

软件的非功能需求指的是除了软件的功能需求以外,软件需要满足的一些其他需求。常见的非功能需求包括: 性能需求:软件需要在特定的时间内完成特定的任务,例如响应时间、吞吐量等。可靠性需求:软件需要在各种环境下都能…

MySQL基础(二)

文章目录 MySQL基础(二)1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…

电机应用中的大功率电阻器?

在这篇文章中,我们将考虑电机应用中的电阻器。 交流、直流和专用电机用于广泛的应用。一些电机应用相对简单,唯一需要关注的是电机的启动和关闭。在这里,成本、简单性和可靠性是主要问题,而电机控制电阻器是常见的解决方案。 在…

水印相机小程序源码

水印相机前端源码,本程序无需后端,前端直接导入即可,没有添加流量主功能,大家开通后自行添加 源码搜索:源码软件库 注意小程序后台的隐私权限设置,前端需要授权才可使用 真实时间地址拍照记录&#xff0c…

多线程系列(九) -ReentrantLock常用方法详解

一、简介 在上一篇文章中,我们介绍了ReentrantLock类的一些基本用法,今天我们重点来介绍一下ReentrantLock其它的常用方法,以便对ReentrantLock类的使用有更深入的理解。 二、常用方法介绍 2.1、构造方法 ReentrantLock类有两个构造方法&…

(undone) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵

参考视频1:https://www.bilibili.com/video/BV1H64y1T7zQ/?spm_id_from333.337.search-card.all.click 参考视频2(正定矩阵):https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_…