【java面经thinking】一

news/2024/10/20 2:22:34/

目录

类加载过程

加载:

连接

初始化

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.ppmy.cn/news/1538738.html

相关文章

七、结构型(桥接模式)

桥接模式 概念 桥接模式是一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们可以独立变化。它通过使用组合关系而非继承来实现接口和实现的解耦,从而提高系统的灵活性和可扩展性。 应用场景 多个维度的变化:当一个系统…

Linux下CMake入门

CMake的基础知识 什么是 CMake CMake 是一个跨平台的构建工具,主要用于管理构建过程。CMake 不直接构建项目,而是生成特定平台上的构建系统(如 Unix 下的 Makefile,Windows 下的 Visual Studio 工程),然后…

FireFox简单设置设置

文章目录 一 设置不显示标签页1原来的样子2新的样子3操作方法 二 设置竖直标签页栏1 效果图2 设置方法 三 设置firefox不提醒更新 一 设置不显示标签页 1原来的样子 2新的样子 3操作方法 地址栏输入 about:config搜索icon,双击选项列表中browserchrome.site icons的值&#…

百度搜索引擎(SEO)优化师的未来将何去何从?

百度搜索引擎(SEO)优化师的未来将何去何从? 作为一名SEO专家(林汉文),在过去的三年里,我深感自己与快速变化的百度SEO圈子逐渐脱节。然而,在最近重拾旧业,重新审视SEO特…

postman变量,断言,参数化

环境变量 1.创建环境变量 正式环境是错误的,方便验证环境变化 2.在请求中添加变量 3.运行前选择环境变量 全局变量 能够在任何接口访问的变量 console中打印日志 console.log(responseBody);//将数据解析为json格式 var data JSON.parse(responseBody); conso…

软件供应链十年:探索开源的增长、风险和未来

回顾软件供应链状况报告的 10 年既是一个里程碑,也是一次行动号召。在过去十年中,开源消费改变了软件开发的世界。我们看到了前所未有的创新,但也出现了新的挑战,特别是在管理软件供应链的安全性和完整性方面。 在 Sonatype&…

DHASH感知算法计算视频相邻帧的相似度

一个朋友想用python来读取视频帧,根据帧和帧之间相似度判断剪辑痕迹;但是最后发现并没什么用…… 原理就是遍历地读取图像相邻帧,将图像相邻帧前处理后,缩小什么的,计算d_hash,然后计算其汉明距离,然后把汉…

动手学深度学习60 机器翻译与数据集

1. 机器翻译与数据集 import os import torch from d2l import torch as d2l#save d2l.DATA_HUB[fra-eng] (d2l.DATA_URL fra-eng.zip,94646ad1522d915e7b0f9296181140edcf86a4f5)#save def read_data_nmt():"""载入“英语-法语”数据集"&qu…