JavaEE初阶复习(JVM篇)

JVM 

Java虚拟机

jdk java开发工具包

jre java运行时环境

jvm java虚拟机(解释执行 java 字节码)

java作为一个半解释,半编译的语言,可以做到跨平台. java 通过javac把.java文件=>.class文件(字节码文件)

字节码文件, 包含的就是java字节码, jvm把字节码进行翻译转化为不同系统上可以识别的cpu指令.

JVM的内存划分(面试题)

JVM本质上是一个进程

进程运行中, 要从操作系统这里申请一些资源(内存就是核心的资源)

JVM作为一个进程, 从系统中申请了一大块内存, 这一大块内存给java程序使用的时候, 又会根据实际的使用用途来划分出不同的空间(比如java定义变量的时候,就是使用JVM从系统这边申请到的内存)

JVM划分各区域的解释

1> 堆 代码中new出来的对象就都是在堆里面. 对象中持有的非静态成员变量, 也就是在堆里面(后面GC主要就是回收这里的引用)

2> 栈 

本地方法栈: jvm内部, 通过c++代码的调用关系和局部变量

虚拟机栈: 记录了java代码的调用关系和java里面的局部变量

此处的堆和栈和数据结构里面的不一样

3> 程序计数器: 主要存储下一条要执行的 java 指令的地址(每个线程都有自己的程序计数器和栈)

4> 元数据区(之前叫做方法区): 这里放一些辅助性,描述性质的属性(比如在硬盘上保存数据的本体,还有一些辅助信息: 文件的大小, 文件的位置,文件的拥有者,文件的修改时间...).比如类的信息,方法的信息(一个程序有哪些类, 每个类里面又包含哪些方法, 每个方法里面包含哪些指令.

堆, 元数据区(整个进程有一份) 栈, 程序计数器(每个线程有一份)

常考的笔试题

JVM的类加载机制(面试题)

类加载: java进程运行的时候, 需要把.class文件从硬盘读取到内存, 并进行一系列解析的校验解析的过程.

类加载的过程: 

1> 加载 把硬盘上的 .class 文件找到, 打开文件, 读取到文件的内容.(二进制的数据)

2> 验证 确认当前读到的文件内容是合法的 .class 文件(字节码) 格式.(里面有jvm开发的版本信息, 高版本的可以运行低版本的 .class)(校验.class 文件的格式是否符合 JVM 规范要求

3> 准备 给类对象, 申请内存空间(此时申请到的内存空间, 里面的默认值, 全都是0)

4> 解析 针对类中的字符串常量进行管理(java虚拟机将常量池里面的 符号引用 替换为 直接引用

的过程) 

class Test{ private String s = "hello"}  s里面包含的是"hello"的内存地址, 地址存的是内存的地址, 但是此时我们访问的是.class文件, 文件里面不存在地址的概念,  文件是放在硬盘上的, 因此我们.class文件里面的s存的是"hello"的相对偏移量,此时文件中填充的s的"hello"偏移量就是 符号引用 ,后续我们把.class放在内存里面,就会把"hello"加载到内存中, 此时"hello"就有地址了,此时内存中的s保存的是"hello"的内存地址, 此时就是 直接引用

5> 初始化: 针对类对象完成后续的初始化(执行静态代码的逻辑), 对对象的各个部分的属性进行赋值填充

双亲委派模型(加载环节)

描述怎么查找 .class 文件的策略

JVM的几个类加载器

BootstrapClassLoader: 负责查找标准库的目录

ExtensionClassLoader: 负责查找扩展库的目录( java 规范里面描述了标准库中应该有哪些功能)

ApplicationClassLoader: 负责查找当前项目的代码目录, 以及第三方库的目录

从下面开始,逐层先把搜索任务交给上层,直到没有上层为止, 然后从最上层开始进行搜索,如果找到了就进入打开文件, 读文件的操作.如果没有搜索到就去下层目录开始找.以此往下到最后一层, 如果没有找到就抛出 ClassNotFoundException 异常

JVM的垃圾回收算法(GC)面试题

我们主要GC的区域就是堆(new 对象的区域)

垃圾回收,主要回收的是对象, 每次垃圾回收的时候, 释放若干个对象

 垃圾回收机制

1> 识别出垃圾: 哪些是垃圾, 哪些不是垃圾(对象没有引用了,匿名对象除外)

判定整个对象后续是否需要继续使用(看整个对象是否被引用),如果一个对象都没有引用指向他, 就视为无法被代码中使用, 就可以视作垃圾.

创建的对象是放在堆, 引用的关系存放在栈

多个对象引用

如何计算引用?

1. 引入计数器 给每个对象安排一个额外的空间, 空间里面要保存当前整个对象有几个引用.

此时的垃圾回收机制,就是看整个引用计数是否为0,是0就可以释放了

问题1: 消耗额外的内存空间, 我们需要给每个对象都安排一个计数器

问题2: 引用计数可能会产生" 循环引用的问题 " . 此时, 引用计数就无法正确工作了

2. 可达性分析(JVM用的是这个)

相比于消耗一个空间来计算引用数目, 我们用时间来换空间

在写代码的时候, 会写很多的变量, 此时我们以这些对象变量为起点, 根据引用关系向下搜索,所有能够被搜索到的对象就不是垃圾了,搜索一圈也没有访问到的对象,就是垃圾.

比如我有若干个结点, 通过引用关系来构成二叉树, 我们从根结点开始遍历, 遍历它的左子树, 遍历完后遍历右子树, 直到叶子结点没有子节点为止, 此时我们遍历到的结点都不是垃圾 ,如果我们把某个结点的 left设置为null, left之前结点就遍历不到了, 此时就是不可达, 就是垃圾

2> 把标记为垃圾的对象的内存空间进行释放

释放的方式

a> 标记-清除

把标记为垃圾的对象直接释放掉(会产生内存碎片的问题: 产生很多小的 离散的 空闲内存空, 我们申请内存空间是申请的一块连续的内存空间)

b> 复制算法

不直接释放内存, 而是把不是垃圾的对象复制到内存的另一半里面, 然后释放掉原先一半的内存空间(总的内存变少了, 每次复制的对象如果很多, 那么复制的开销就会很大)

c> 标记 - 整理 

类似于 顺序表 删除中间元素(搬运)

分带回收

引入概念, 对象的年龄

JVM 中有专门的线程负责周期性扫描/释放

一个对象, 如果被线程扫描了一次, 就不是垃圾, 年龄+1(初始年龄是0)

JVM 中会根据对象年龄的差异, 把整个堆的内存分成俩大部分: 新生代(年龄小的对象) / 老年代(年龄大的对象)

新生代又分为伊甸区,生存区, 幸存区

1> 当new出一个新的对象, 就放在伊甸区.(伊甸区就会有, 很多的对象)

2> 第一轮GC: 之后大部分的对象都没了, 还存在的对象会被使用复制算法拷贝放在生存区

后续的GC扫描线程伊甸区和生存去都会扫描, 然后进行垃圾清理, 在生存区存活下来的对象会使用复制算法放在幸存区里面,每一次GC的扫描,对象的年龄都会+1

3> 如果在生存区里面经历若干轮GC, 还存在的对象, 就会被拷贝到老年区

4> 老年区扫描的频次大大低于其他区域, 扫描线程主要扫描的还是新手区

5> 在老年区里面的对象没有引用后, 就会被JVM按照标记整理的方式进行搬运处理掉.

垃圾收集器

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

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

相关文章

2.pycharm保姆级安装教程

一、pycharm安装 1.官网上下载好好软,双击打开 2.下一步 3.修改路径地址 (默认也可以) 4.打勾 5.安装 不用重启电脑 二、添加解释器 1.双击软件,打开 2.projects – new project 3.指定项目名字,项目保存地址,解释器 4.右击 – …

zk基础—4.zk实现分布式功能二

大纲 1.zk实现数据发布订阅 2.zk实现负载均衡 3.zk实现分布式命名服务 4.zk实现分布式协调(Master-Worker协同) 5.zk实现分布式通信 6.zk实现Master选举 7.zk实现分布式锁 8.zk实现分布式队列和分布式屏障 4.zk实现分布式协调(Master-Worker协同) (1)Master-Worker架构…

Java 实现 字母异位词分组

在这篇博客中,我们将详细解析如何使用 Java 代码来解决 字母异位词分组这个经典的算法问题。我们会逐步分析代码逻辑,并探讨其时间复杂度及优化思路。 题目描述 给定一个字符串数组 strs,请将字母异位词组合在一起。字母异位词是指由相同字…

【Ragflow】10. 助理配置参数详细解析/模型响应加速方法

概述 Ragflow的助理配置中,有很多参数,尽管官方文档给出了一定程度的解释,但不够详细。 本文将对各项参数进行更详细的解释说明,并进一步挖掘某些参数中隐含的潜在陷阱。 助理设置 空回复 含义:输入的问题若未能在…

Mac Apple silicon如何指定运行amd64架构的ubuntu Docker?

如何指定运行amd64架构的ubuntu Docker 下面这个docker命令如何指定运行amd64架构的ubuntu Docker? docker run -it -v $(pwd):/workspace ubuntu:20.04 bash这个命令已经非常接近正确运行一个基于 amd64 架构的 Ubuntu 容器了,但如果你想明确指定运行…

ColPali:基于视觉语言模型的高效文档检索

摘要 文档是视觉丰富的结构,不仅通过文本传递信息,还包括图表、页面布局、表格,甚至字体。然而,由于现代检索系统主要依赖从文档页面中提取的文本信息来索引文档(通常是冗长且脆弱的流程),它们…

使用C++实现HTTP服务

天天开心!!! 阅读本篇文章之前,请先阅读HTTP基础知识 传送门----> HTTP基础知识 文章目录 一、CWeb服务器(核心代码WebServer.cpp)二、静态文件结构三、编译和运行四、访问测试 一、CWeb服务器&#xff…

Reactive编程入门:Project Reactor 深度指南

文章目录 4.2.1 创建 Flux 和 MonoFlux 基础创建方式高级创建模式Mono 创建方式 4.2.2 订阅与数据处理基础订阅模式数据处理操作符 4.2.3 核心操作符深度解析flatMap 操作符zip 操作符buffer 操作符 高级组合模式复杂流处理示例背压处理策略 测试响应式流性能优化技巧 React 编…

【万字总结】前端全方位性能优化指南(完结篇)——自适应优化系统、遗传算法调参、Service Worker智能降级方案

前言 自适应进化宣言 当监控网络精准定位病灶,真正的挑战浮出水面:系统能否像生物般自主进化? 五维感知——通过设备传感器实时捕获环境指纹(如地铁隧道弱光环境自动切换省电渲染) 基因调参——150个性能参数在遗传算…

PQ以及有关索引的笔记Faiss: The Missing Manual

参考Faiss 索引结构总结: 为了加深记忆,介绍一下Inverted File Index(IVF)的名字由来: IVF索引的名字源自“倒排文件”(Inverted File)的概念。在传统的信息检索中,倒排文件是一种索…

win10彻底让图标不显示在工具栏

关闭需要不显示的软件 打开 例此时我关闭了IDEA的显示 如果说只是隐藏,鼠标拖动一个道理 例QQ 如果说全部显示不隐藏

关税核爆72小时!跨境矩阵防御战紧急打响

一、T86崩塌:全球贸易链的至暗时刻 (配图:美国海关系统深夜弹出红色警报) 5月2日凌晨2:17,杭州某光伏企业的供应链系统突然发出刺耳警报——其价值1800万美元的逆变器模块被划入34%关税清单。这场代号"黑天鹅突…

蓝桥杯Java B组省赛真题题型近6年统计分类

困难题 题号题型分值代码量难度通过率内容2024-F解答1581困难0.12最短路问题 Dijkstra 期望2024-G解答20116困难0.19模拟 暴力 搜索 DFS 剪纸 枚举2023-H解答2070困难0动态规划2022-H解答20109困难0.032022-J解答25141困难0搜索2021-H解答2041困难0.18二分 思维 规律2021-I解答…

【网络流 图论建模 最大权闭合子图】 [六省联考 2017] 寿司餐厅

题目描述: P3749 [六省联考 2017] 寿司餐厅 题目描述 Kiana 最近喜欢到一家非常美味的寿司餐厅用餐。 每天晚上,这家餐厅都会按顺序提供 n n n 种寿司,第 i i i 种寿司有一个代号 a i a_i ai​ 和美味度 d i , i d_{i, i} di,i​&…

前端面试题(三):axios有哪些常用的方法

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 中发送 HTTP 请求。它提供了一些常用的方法来处理不同类型的请求。以下是 Axios 中常用的一些方法: 1. axios.get() 用于发送 GET 请求,从服务器获取数据。 axios.get(/api/d…

python match case语法

学习路线:B站 普通的if判断 def if_traffic_light(color):if color red:return Stopelif color yellow:return Slow downelif color green:return Goelse:return Invalid colorprint(if_traffic_light(red)) # Output: Stop print(if_traffic_light(yellow)) …

LLaMA-Factory大模型微调全流程指南

该文档为LLaMA-Factory大模型微调提供了完整的技术指导,涵盖了从环境搭建到模型训练、推理和合并模型的全流程,适用于需要进行大模型预训练和微调的技术人员。 一、docker 容器服务 请参考如下资料制作 docker 容器服务,其中,挂…

【HCIA】静态综合实验练习笔记

实验拓扑图如下: 实验配置思路如下: 1、网段划分、配置IP地址 2、配置DHCP,使客户端获得ip地址 3、配置静态明细路由,内网全网通 4、配置空接口防环 5、配置优先级,实现选路最佳 6、配置缺省路由,实现公网通…

大数据(4.5)Hive聚合函数深度解析:从基础统计到多维聚合的12个生产级技巧

目录 背景一、Hive聚合函数分类与语法1. 基础聚合函数2. 高级聚合函数 二、6大核心场景与案例场景1:基础统计(SUM/COUNT)场景2:多维聚合(GROUPING SETS)场景3:层次化聚合(ROLLUP&…

RTOS基础 -- NXP M4小核的RPMsg-lite与端点机制回顾

一、RPMsg-lite与端点机制回顾 在RPMsg协议框架中: Endpoint(端点) 是一个逻辑通信端口,由本地地址(local addr)、远程地址(remote addr)和回调函数组成。每个消息都会发送到特定的…