【java面经thinking】一

news2024/11/25 4:33:27

目录

类加载过程

加载:

连接

初始化

GC回收机制(垃圾回收)

区域

判断对象是否存活

回收机制

HashMap

类加载器

加载标识

加载机制

缓存

自定义加载器:

JVM内存结构

常量池

string设置成final

按下网址发生

类加载过程

分为加载,连接和初始化的过程。

加载:

将.class文件的二进制字节流读入内存(jdk1.7之前是JVM内存,jdk1.8及之后为本地内存),并在内存中创建class对象

方法区分配内存问题:太小,OOM问题;太大,影响性能,内存泄露问题。

连接

验证,准备,解析

验证:保证字节流符合JVM规范,例如,检查类是否继承了final修饰的类,例如检查符号权限是否符合语法规定

准备:为类变量开辟空间并赋予默认值

基本类型(int)等的默认值为0;

引用类型默认为null;

解析:将class常量池中的符号引用转为直接引用

符号引用好比如test()方法,直接引用是偏移量例如地址0x123456

初始化

类的变量赋值

GC回收机制(垃圾回收)

对JVM内存进行标记,确定哪块内存会被回收。

区域

堆内存,方法区(jdk1.7以前),1.8以后改为元数据区

其它和线程共存亡

判断对象是否存活

引用计数法(为0可回收)

可达性分析法:GCroots对象到对象是否有引用链,finalize()方法可以拯救对象一次

GCroots:虚拟机栈,方法区类静态引用的对象,本地方法栈引用的对象

回收机制

标记清除法:标记就清除,会产生很多内存碎片,再次触发GC

标记整理法:标记清除后,将内存碎片连续。

复制算法:AB两块内存,先用再用

分代收集算法:年轻---复制算法,老年代---标记清除或者整理法

感觉像年轻和老人之间的缓冲区

HashMap

Map接口实现,就是字典嘛

遍历:

null对比

线程不安全:

jdk1.8以前

jdk1.8

hash冲突

内存泄露

无用的对象一直占内存,没有重写equels和hashcode方法,HashMap发现每次放进来的key的hash都不一样,然后就会不停地往集合里放新数据

类加载器

引导类加载器bootstrap:c语言实现,加载到的路径可以由System.getProperty(“sun.boot.class.path”)查看。

扩展类加载器extend:具体加载路径可通过System.getProperty(“java.ext.dir”)。

系统类加载器system:System.getProperty(“java.class.path”)查看加载路径

加载标识

判断一个类是否被加载的标识是:类全限定名+类加载器,例如pg包下的Person类被CL1类加载器加载到内存,唯一标识为(Person, pg, CL1)

加载机制

全盘负责:该类引用的类全都使用一个加载器加载,避免重复加载

双亲委派(父类委托):递归到顶级父类加载器加载, 将.class文件载入内存的过程由双亲委派机制完成的。
优点:避免多次加载类

安全,防止篡改API,核心API由引导类加载器加载

缓存

当jvm加载完成一个类是会将类放入jvm缓存中,加载流程为先去缓存区查看当前类是否被加载,如果没有则读.class文件并加载,如果加载则直接返回

自定义加载器:

如果打破双亲委派模型,那么你需要重写loadClass方法

JVM内存结构

在运行时数据区

程序计数器PCR:指向下一条将要执行的指令的地址。即线程执行流程是由 字节码解释器 来改变程序计数器的值来维持的。不存在内存溢出的。

堆:

栈:虚拟机栈是为我们的Java方法服务的,而本地方法栈则是为native方法服务的,二者功能基本相似,而我们平时所说的栈就是虚拟机栈。

嵌套调用类的执行过程可以看作栈。

方法区:为类被编译的数据加载到内存后的存储位置

在JDK1.7时,将字符串常量池与静态变量转移到了堆内存,在JDK1.8时取消了方法区,用元空间取代了方法区,元空间位于物理内存

常量池

string设置成final

按下网址发生

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

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

相关文章

C语言有关结构体的知识(后有通讯录的实现)

一、结构体的声明 1.1 结构体的定义 结构体是一些值的集合,这些值被称为成员变量。结构的每个成员可以是不同的类型 1.2 结构体的声明 这里以描述一个学生为例: struct stu {char name[10];//名字int age;//年龄char id[20];//学号char sex[5];//性别 }…

TIM定时器(标准库)

目录 一. 前言 二. 定时器的框图 三. 定时中断的基本结构 四. TIM定时器相关代码 五. 最终现象展示 一. 前言 什么是定时器? 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。 TIM定时器不仅具备基本的定时中断功能,而且…

【LeetCode】708. 循环有序列表的插入

目录 一、题目二、解法完整代码 一、题目 给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环非降序的。 给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的…

2024免费mac苹果电脑清理垃圾软件CleanMyMac X4.15.8

对于苹果电脑用户来说,设备上积累的垃圾文件可能会导致存储空间变得紧张,影响电脑的性能和使用体验。尤其是那些经常下载和安装新应用、编辑视频或处理大量照片的用户,更容易感受到存储空间的压力。面对这种情况,寻找一种有效的苹…

springboot3使用Excel导入数据库数据

一、导入依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.3.0</version></dependency> 二、…

Xilinx远程固件升级(二)——STARTUPE2原语的使用

通过&#xff08;一&#xff09;可以看出&#xff0c;对于远程固件升级实际上是通过调用flash不同区域的bit实现&#xff0c;通过golden image和update image共同保障了系统的稳定性。在项目中如果将flash的时钟直接绑定FPGA后进行约束&#xff0c;在综合编译时是无法通过的。这…

Spark:DataFrame介绍及使用

1. DataFrame详解 DataFrame是基于RDD进行封装的结构化数据类型&#xff0c;增加了schema元数据&#xff0c;最终DataFrame类型在计算时&#xff0c;还是转为rdd计算。DataFrame的结构化数据有Row&#xff08;行数据&#xff09;和schema元数据构成。 Row 类型 表示一行数据 …

MySQL 8.4修改初始化后的默认密码

MySQL 8.4修改初始化后的默认密码 &#xff08;1&#xff09;初始化mysql&#xff1a; mysqld --initialize --console &#xff08;2&#xff09;之后,mysql会生成一个默认复杂的密码&#xff0c;如果打算修改这个密码&#xff0c;可以先用旧密码登录&#xff1a; mysql -u…

Redis set类型 zset类型

set类型 类型介绍 集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中 1&#xff09;元素之间是⽆序 的 2&#xff09;元素不允许重复 ⼀个集合中最多可以存储 个元素。Redis 除了⽀持 集合内的增删查改操作&#xff0c;同时还⽀持多…

【图书推荐】《R语言医学数据分析实践》

本书重点 梅俏、卢龙、丁健、张晟、黄龙、胡志坚、张琼瑶、林志刚等业内专家联袂推荐。 以公共医学数据为例&#xff0c;精选大量的实用案例&#xff0c;深入浅出地介绍统计建模分析方法。 帮助读者解决医学数据分析中遇到的实际问题。 通过实际操作引导读者入门科研论文数…

生信分析流程:从数据准备到结果解释的完整指南

介绍 生物信息学&#xff08;生信&#xff09;分析是一个复杂的过程&#xff0c;涉及从数据准备到结果解释的多个步骤。随着高通量测序技术的发展和生物数据的迅猛增长&#xff0c;了解和掌握生信分析的标准流程变得尤为重要。这不仅有助于提高分析的准确性&#xff0c;还能优…

HarmonyOS NEXT 应用开发实战(五、页面的生命周期及使用介绍)

HarmonyOS NEXT是华为推出的最新操作系统&#xff0c;arkUI是其提供的用户界面框架。arkUI的页面生命周期管理对于开发者来说非常重要&#xff0c;因为它涉及到页面的创建、显示、隐藏、销毁等各个阶段。以下是arkUI页面生命周期的介绍及使用举例。 页面的生命周期的作用 页面…

7-I2C与AHT20温湿度传感器

I2C与AHT20温湿度传感器 嵌入式领域另一种常见的通信IIC通信&#xff0c;并用其与AHT20传感器进行交互&#xff0c;获取房间的温度与湿度。 I2C有一条用于传递数据的数据线称为SDA&#xff08;Serial Data&#xff09;&#xff0c;另一条是用于提供同步时钟脉冲的时钟线SCL&am…

看图识微分与导数概念。

可建立如草图所示的局部坐标系。增量Δydy余项是草图中曲线的方程&#xff0c;微分dyydx&#xff08;是关于dx的一次函数&#xff09;是草图中切线的方程。草图形象直观地显示曲线Δy不切线dy。

安全可靠测评结果公告(2024年第1号)

大家可以选择对应的数据库&#xff0c;中央处理器&#xff0c;供参考&#xff1b;尤其是 水资源安可系统 智慧农业安可系统 智慧水利安可系统、智慧水务安可系统&#xff0c;企业安可系统 等参考使用

# 在执行 rpm 卸载软件使用 nodeps 参数时,报错 error: package nodeps is not installed 分析

在执行 rpm 卸载软件使用 nodeps 参数时&#xff0c;报错 error: package nodeps is not installed 分析 一、问题描述&#xff1a; 在执行 rpm 卸载软件使用 nodeps 参数时&#xff0c;报错 error: package nodeps is not installed 如下图&#xff1a; 二、报错分析&…

Java项目分层思路

Java项目分层思路 一、前言二、了解常见的术语1. 应用开发中使用的术语2. 建模和架构设计层面术语总结 三、如何划分1. 单个module2. 多个module 一、前言 每个人、每个开发团队的规范习惯都不太一样&#xff0c;没有固定标准&#xff0c;合适的才是最好的。 二、了解常见的术…

Python Django 查询集的延迟加载特性

Django 查询集的延迟加载特性 一、引言 在 Django 的开发过程中&#xff0c;查询集&#xff08;QuerySet&#xff09;是我们与数据库进行交互的重要工具。查询集提供了一种高效的方式来检索和操作数据库中的数据&#xff0c;且能够进行懒加载&#xff08;Lazy Loading&#x…

Gin框架教程02:AsciiJSON

什么是 AsciiJSON&#xff1f; AsciiJSON 是 Gin 框架中的一个方法&#xff0c;用于生成仅包含 ASCII 字符的 JSON。对于非 ASCII 字符&#xff08;例如汉字、特殊符号&#xff09;&#xff0c;AsciiJSON 会将其转义为 Unicode 表示&#xff08;如 \uXXXX&#xff09;&#xff…

使用CSS+SVG实现加载动画

使用CSSSVG实现加载动画 效果展示 CSS知识点 SVG元素使用SVG相关CSS属性运用 整体页面布局 <section><div class"box"><div class"loader"><svg><circle cx"40" cy"40" r"40"></circl…