内存管理(一):CPU寻址
内存管理(一):内存寻址总线总线分工:
数据总线:负责数据实际传输
地址总线:负责传输数据地址
控制总线:负责传输控制信号
取数据的时候CPU通过地址总线传输地址给内存,内存返回的数据通过数据总线传递给CPU
数据总线和地址总线决定因素:
数据总线:CPU位数 -> 寄存器位数 -> 数据总线位数
地址总线:内存地址信号引脚数 -> 地址总线位数
大部分情况下:CPU位数 != 地址线位数,像8086CPU数据总线有16条,地址线有20条
年份
1978
1985
1993-2006
200至今
处理器CPU
8086
80386
Pentium系列
Core系列
CPU位数
16
32
32、64
64
地址总线位数
20
32
32、36、39
40、48可扩展
处理器名字:如果是Intel 32位体系结构叫x86,Intel 64位扩展体系结构叫X86-64
8086的分段寻址CPU存储的位数是16位,它的寄存器只有16位,但是地址总线却有20位。如果不做特殊处理的话,CPU只能访问64KB内存,后面的内存无法访问到。
分 ...
JVM垃圾回收
jvm垃圾回收所谓垃圾就是指运行程序中没有任何指针指向的对象
标记算法当一个对象没有被没有被引用的时候就可以被回收。可以使用引用计数和可达性分析算法来标记一个对象为垃圾回收
引用计数记录对象背引用的情况,如果其他对象引用该对象,引用计数+1;如果引用失效,引用计数-1。如果一个对象的引用计数为0,则该对象可以被回收
优点:
实现简单,判定效率高,回收没有延长性
缺点:
需要一个引用计数器,需要额外空间开销
每次引用都要更新计数器,增加时间开销
无法处理循环引用问题,这是一个致命缺陷,导致java不使用这类算法
可达性分析基本思路就是人以根对象集合为起点,按照从上到下的方式搜索根对象集合所连接的目标对象是否可达。搜索走过的路径叫引用链,如果一个对象没有任何引用链相连,则是不可达的,标记为垃圾。
注意:由于java用的是可达性分析算法,分析工作必须在一个能保证一致性快照中进行。这也是GC为什么要Stop The World的原因
GC Rootsjava中哪些对象可以被作为GC Roots呢
虚拟机栈或本地方法栈中引用的对象
方法区静态属性引用的对象
方法区中常量引用的 ...
JVM运行时数据区
jvm运行时数据区简单了解一下运行时数据区在jvm中的位置。对于运行时数据区
方法区、堆空间是属于线程共享的
程序计数器、栈、本地方法栈是属于线程私有的,每个线程都有一份
程序计数器(Program Counter Register)用于存储指向下一条jvm指令的地址,由执行引擎读取下一条指令。
它是一块很小的内存空间,几乎可以忽略不记,也是运行速度最快的存储区域。
每个线程都有一份,线程私有。
如果当前是native方法,则是未指定值(undefined)
虚拟机栈
java虚拟机栈,每个线程创建的时候都会创建一个虚拟机栈,其内部保存了一个个栈针,每个栈针对应一次java方法调用。
随线程的创建而创建,随线程的消亡而消亡
jvm直接队java栈的操作只有两个,就是“压栈”和“出栈”,每个方法执行,伴随着进栈,执行结束出栈
在一个活动的线程中,在一个时间点上,只有一个活动的栈针,这个活动栈针是栈顶的栈针,叫做当前栈针,该栈针对应的方法叫当前方法,定义该方法的类叫当前类
不存在垃圾回收问题
栈针内部结构
局部变量表 定义为一个数组,主要用于存储方法参数和定义内的局部变量。包 ...
2022年度总结
2022年度总结学习方面评价一下今年,整体上并没有很多突出的阶段性成就。主要因为需要去准备面试的东西,因为我背东西的能力实在太差了,这方面不是我的优势。
技术今年花费最多时间的估计就是我的第二门语言go了。从开始接触go的简单语法,后面使用go刷算法题,并接触go的底层。底层主要是看《go程序员面试宝典》开始的。并写了一些小项目,比如miconvert,mydb等。写得不是很明白。当然,到后面go语言也稍稍落下了。因为go的岗位不是那么多。java依旧是我主要学习的语言。借着看go底层,我也开始慢慢接触java底层的学习了,开始接碰源码了。其实有些源码并不是很难,慢慢看是可以理解透彻的。不过有一说一,java的东西确实是多啊。
面试题是今年开始准备背面试题的,因为它,我明白一个程序员拥有一个好的记忆力是多么重要。然而我的记忆力是我所有技能里面最弱的,不然我的英语也不会一直学不明白。不过在最近几个月我是逐渐明白模拟面试的重要性了,重点是需要对知识的一个输出,梳理自己的知识,并输出。通过模拟面试用嘴巴输出,或者通过博客来输出。希望这方面明年有所进步吧。
输出关于输出,今年是有突破的。是今年 ...
类加载
类加载一个类通常需要经过:类加载–> 使用 –> 卸载 的阶段。
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口
类加载过程包括三个阶段:加载(loading) + 连接(Linking) + 初始化(Initialization)。如下图
类加载过程加载查找类的字节码,并创建该类的class对象
通过一个类的全限定名获取定义此类的二进制字节流
通过这个字节流所代表对的静态存储结构转化为方法区的运行时数据结构
在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
连接
校验(Verify)
校验时为了检验class文件的字节码是否符合虚拟机的要求,且不危害虚拟机
文件校验:检验字节流是否符合class文件格式的规范,比如说JAVA规定class ...
最短路径
最短路径介绍一个顶点到另一个顶点的最短的距离,叫最短路径。
Dijkstra(迪杰斯特拉)Dijkstra 算法是求一个图中一个点到其他所有点的最短路径的算法,基于「贪心」、「广度优先搜索」、「动态规划」,时间复杂度是O(n2)
用文字比较难描述,下面用图来讲。目标:找到顶点 0 到所有顶点的最小距离
首先我们需要一个数组来记录起始顶点到所有顶点的距离。初始情况,先将所有距离设置为无穷
更新顶点 0 到顶点 0 的距离为 0。标记顶点 0 ,设置 0 为顶点 0 到顶点 0 的最小距离
从顶点 0 出发,找到相邻的未被标记的顶点为 1、3。
顶点 0 经过顶点 0 到达顶点 1 的距离为 3。比数组中的无穷要小。更新数组
顶点 0 经过顶点 0 到达顶点 3 的距离为 5。比数组中的无穷要小。更新数组
从未标记的所有顶点中,找到一个距离最小的顶点,进行标记。这里的 [3,无穷,5,无穷] 中 3 最小。
从顶点 1 出发,找到相邻的未被标记的顶点为 3,2,4。
顶点 0 经过顶点 1 到顶点 2 的最短距离为:3 + 6 = 9,比无穷小,更新数组
顶点 0 经 ...
最小生成树
最小生成树介绍生成树:给定一个无向连通图,在其子图中,如果任意顶点都是连通的,且是一个树结构,则这个树就是生成树。
最小生成树:在一个图的所有生成树中,边的权值之和最小的生成树就是最小生成树。
例如:
其最小生成树
prim(普里姆)算法prim算法是一种贪心算法,主要思路是:
先随意找一个顶点,并加入集合
从该只有一个点的集合出发,找到一个离该集合最近的顶点并加入到集合中
然后继续找离集合最近的顶点,加入集合,直到所有点都在集合中
例如:
先随便找一个点,比如我找的是顶点 5,将顶点 5 加入集合中
现在找到和集合相连的点
其中顶点 3 离集合最近,距离为 3。将顶点 3 加入到集合中
继续找与集合内顶点直接相连的顶点
其中顶点 1 离集合最近,将顶点 1 加入到集合中
继续找和集合直接相连的顶点
顶点 2 离集合最近,将顶点 2 加入集合中
最后将顶点 6 加入到集合中
得到最小生成树
相关例题1584. 连接所有点的最小费用 - 力扣(Leetcode)