jvm面试题目补充

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.mzph.cn/news/709723.shtml

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

相关文章

CUDA C:查看GPU设备信息

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 了解自己设备的性能是很有必要的,为此CUDA 运行时(runtime)API给用户也提供了一些查询设备信息的函数,下面的函数用于查看GPU设备的一切信息。 …

MyBatis 学习(二)之 第一个 MyBatis 案例

目录 1 配置 MyBatis 方式 1.1 XML 配置文件 1.2 Java 注解配置 1.3. Java API 配置 2 在 MySQL 中创建一张表 3 创建一个基于 Maven 的 JavaWeb 工程 4 编写 User 实体类 5 创建 Mybatis 全局配置文件 6 编写一个 DAO 或 Mapper 接口 7 编写 SQL 映射配置文件&#…

找不到mfc140.dll怎么办?教你五种mfc140.dll丢失的解决方法

当计算机系统中mfc140.dll文件丢失时,可能会引发一系列运行问题,影响到系统的正常功能及应用程序的稳定执行。具体来说,由于mfc140.dll是Microsoft Visual C Redistributable Package的重要组成部分,它的缺失会导致依赖于该动态链…

如何用好应用权限,保护隐私数据?银河麒麟桌面操作系统V10 SP1 2303 update2新功能解析

为您介绍银河麒麟桌面操作系统V10 SP1 2303 update2隐私设置和权限管理功能,为您的个人数据安全保驾护航。 说到个人数据隐私,在科技重塑生活本质的数字世界,个人信息遭受持续威胁。2018年,某国际知名社交平台因安全系统漏洞而遭…

深入解析Mybatis-Plus框架:简化Java持久层开发(六)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 上一章介绍了新增的操作,后续删除,更新,查询的操作相对新增要复杂一些,因为有些方法的使用涉及到了条件&…

学习使用paddle来构造hrnet网络模型

1、首先阅读了hrnet的网络结构分析,了解到了网络构造如下: 参考博文姿态估计之2D人体姿态估计 - (HRNet)Deep High-Resolution Representation Learning for Human Pose Estimation(多家综合)-CSDN博客 最…

vue 部署后修改配置文件(接口IP)

近期,有一个项目,运维在部署的时候,接口ip还没有确定,而且ip后面的路径一直有变动,导致我这里一天打包至少四五次才行,很麻烦,然后看了下有没有打包后修改配置文件修改接口ip的方法,…

大话设计模式——4.装饰模式(Decorator Pattern)

1.定义 1)可以在不改动原有对象代码的情况下扩展对象的功能,通过聚合的方式相较于继承更加灵活。 2)UML图 2.示例 汽车有很多装饰可选,如座椅、音响、轮胎等都可以进行自定义组装 1)抽象汽车对象 public interfac…

数据结构------栈(Stack)和队列(Queue)

也是好久没写博客了,那今天就回归一下,写一篇数据结构的博客吧。今天要写的是栈和队列,也是数据结构中比较基础的知识。那么下面开始今天要写的博客了。 目录 栈(Stack) 队列(Queue) 喜欢就点…

AI论文速读 | 立场观点:时间序列分析,大模型能告诉我们什么?

题目:Position Paper: What Can Large Language Models Tell Us about Time Series Analysis 作者:Ming Jin ; Yifan Zhang ; Wei Chen ; Kexin Zhang ; Yuxuan Liang ; Bin Yang ; Jindong Wang ; Shirui Pan ; Qingsong Wen 机构:莫纳什大…

form 表单 转换为json-多种(通用/多维数组) 全方案

JSON 在 JavaScript 中重要,因其轻量、通用、易读,适用于数据交换、存储和传输。 为什么写这个文章,废话不多,直接近主题。 一、通用 一般采用jquery编写 var key $(#"cyberwin_form_card_newadd").serialize(); 结…

类和对象(2)——距离C++又近了一步

目录 一、构造函数 1.1声明和定义构造函数 1.2成员名和参数名 1.3构造函数的使用 1.4初始化列表 二、析构函数 2.1析构函数的概念 2.2析构函数的性质 三、拷贝构造函数 四、赋值运算符重载 4.1运算符重载 4.2赋值运算符重载 一、构造函数 我们知道,C中…

项目解决方案: 实时视频拼接方案介绍

目 录 1、实时视频拼接概述 2、适用场景 3、系统介绍 3.1拼接形式 3.1.1横向拼接 3.1.2纵向拼接 3.2前端选择 3.2.1前端类型 3.2.2推荐配置 3.3后端选择 3.3.1录像回放 3.3.2客户端展示 4、拼接方案介绍 4.1基于4K摄像机的拼接方案 4.1.1系统架构…

Pytorch从零开始实战19

Pytorch从零开始实战——生成手势图像 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——生成手势图像环境准备模型选择模型训练模型分析总结 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytorch2.0.1cu118&…

webrtc

stun服务 阿里云服务器安全组添加端口开放 webrtc-streamer视屏流服务器搭建 - 简书

Prometheus-监控远程linux的主机

一、本地访问 1、访问 http://8.137.122.212:9090/2、查看监控的主机 默认只监控了本机一台主机 这里的IP地址原本是‘localhost’,为了方便我将‘localhost’换成了主机的IP地址 现在看只监控了本机一台主机 3、查看监控数据 通过http://8.137.122.212:9090/m…

RT-Thread studio上创建一个STM32F103的CAN通讯功能

前言 (1)如果有嵌入式企业需要招聘湖南区域日常实习生,任何区域的暑假Linux驱动实习岗位,可C站直接私聊,或者邮件:zhangyixu02gmail.com,此消息至2025年1月1日前均有效 (2&#xff0…

1.1 编程环境的安装

汇编语言 汇编语言环境部署 第二个运行程序直接双击安装一直下一步即可MASM文件复制到D盘路径下找到dosbox安装路径:C:\Program Files (x86)\DOSBox-0.74找到该文件双击打开它,修改一下窗口大小 把这两行改成如下所示 运行dos,黑框中输入mou…

C#,数值计算,求解微分方程的吉尔(Gear)四阶方法与源代码

1 微分方程 微分方程,是指含有未知函数及其导数的关系式。解微分方程就是找出未知函数。 微分方程是伴随着微积分学一起发展起来的。微积分学的奠基人Newton和Leibniz的著作中都处理过与微分方程有关的问题。微分方程的应用十分广泛,可以解决许多与导数…

【Web安全靶场】sqli-labs-master 21-37 Advanced-Injection

sqli-labs-master 21-37 Advanced-Injection 第一关到第二十关请见专栏 文章目录 sqli-labs-master 21-37 Advanced-Injection第二十一关-Cookie注入第二十二关-Cookie注入第二十三关-注释符过滤的报错注入第二十四关-二次注入第二十五关-过滤OR、AND双写绕过第二十五a关-过滤…