自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 情景题:生产者和消费者模型

基于数组的形式实现了生产者与消费者的模型,代码如下:public class ConsumerAndProducer { final Object[] items;// 生产队列 int putIndex; //生产者指针 int takeIndex; //消费者指针 int count;//产品总数 final ReentrantLock lock;//锁 private final Condition notEmpty; //对应消费者的condit

2022-01-03 10:00:19 1328 1

原创 CopyOnWrite线程安全集合

一、CopyOnWrite集合简介CopyOnWrite集合包括CopyOnWriteArrayList,CopyOnWriteSet和CopyOnWriteHashMap,但CopyOnWriteHashMap使用较少,并发环境大多采用性能更高的cpncurrentHashMap。其实现线程安全的核心思想是读写分离,即在写的时候,将底层的数组拷贝一份,然后修改拷贝的数组,再将修改后的数组通过原子操作的方式赋值给底层数组,以实现线程安全二、CopyOnWriteArrayList2-1 底层结构

2022-01-02 21:39:16 3103

原创 Lock公平锁与非公平锁的源码分析(以ReentrantLock为例)

一、类的结构简介Lock是一个接口,ReentrantLock则是这个接口的一个实现类,在ReentrantLock中有一个抽象内部类Sync,ReentrantLock中所有方法的实现均在这个抽象内部类中。而这个抽象内部类Sync又可以分为两个子类,分别为NonfairSync和FairSync。具体的结构图如下:在ReentrantLock的构造方法中,需要传入一个boolean型参数fair,内部类Sync将根据这个参数的值来创建对应的子类。 ...

2022-01-01 16:31:37 1054

原创 原子类Atomic

首先来看一段线程同步的代码:public class Example { private int a = 0; public synchronized void increment() { a++; } public synchronized void decrement() { a--; }}可以看到a++和a--均进行了同步操作。但是上面的代码换成这么写,性能会更好。public class AtomicExa

2021-12-26 11:28:11 371

原创 多线程部分

1.中断和线程阻塞1-1 阻塞首先需要说明的是,线程阻塞和中断并不是同一个概念,阻塞指的是要进入临界区的线程必须具备可以获得临界区资源的条件,才可以进入临界区,否则,需要在临界区外面阻塞等待。如上图,对于线程2和线程3,即为阻塞。1-2 进入阻塞的方式java中进入阻塞的方式有以下几种:1.Object,wait();//可传入一个long型参数,表示线程在一个特定的时间后会被唤醒,若不传,则永久阻塞,或需要由notify()来唤醒2.Thread.join();//可传入一

2021-12-25 21:37:42 442

原创 consul服务注册及与spingboot的整合

1.本地安装consul安装包可在官网下载2.本地启动consul进入本地的consul目录下,新建cfg目录作为config目录,data目录作为数据目录,然后输入//这里根据自己的实际路径来写,我这里写的是我的路径nohup /Users/cherunyu/IdeaProjects/consul/consul agent -config-dir=/Users/cherunyu/IdeaProjects/consul/cfg -data-dir=/Users/cherunyu/I

2021-12-24 10:30:55 1143

原创 设备管理部分

一、设备控制器电脑连接的输入,输出设备之间存在着差异,因此,操作系统需要对这些设备进行同一管理的时候,必须要通过一个部件来屏蔽这些设备之间的差异,因此每一个设备都存在一个设备控制器部件,用来处理设备之间的差异,比如硬盘的硬盘控制器,显示器的视频控制器等。从上面这幅图也可看出,跟CPU进行交互的其实是设备的控制器,而不是设备本身。二、寄存器设备控制器中有一个重要的部件——寄存器,寄存器是实现设备与CPU交互的重要部件。CPU通过寄存器来控制设备,要比直接控制设备本身方便得多寄存器的种类

2021-12-20 00:14:49 698

原创 文件系统部分(3)

一、硬链接与软链接在上一篇博文中提到过目录在磁盘中是以哈希表的形式存储的,通过文件/目录名取hash值,可以找到文件/目录对应的索引块,进而找到文件/目录对应的数据块。根据这个条件,我们来看硬链接和软链接。硬链接的结构图如下:也就是说对于/home/xiaolin/file,/home/jay/hardlink1,/tmp/hardlink2这三个文件,它们都指向了同一个索引结点,这个索引结点对应的数据块就是这个文件的内容,对于这样的连接,称为硬链接。在删除文件的时候,只有删除所有的

2021-12-12 16:26:44 389

原创 文件系统部分(2)

一、多级索引文件存储由于连续存储,链表非连续存储,索引非连续存储均存在着一定的弊端(具体内容可以参考上一篇博文),unix文件系统综合考虑以上各方式的优点和缺点采用了多级索引文件存储的方式。多级索引文件存储的结构图如下:对于小文件,文件头直接记录数据块的位置,对于较大的文件,以三级索引为例,文件头记录一级索引的位置,一级索引中会记录二级索引的位置,二级索引中会记录三级索引的位置,三级索引中记录着数据块的位置。这种方式最大的好处是,可以根据文件的大小灵活地采用不同的存储方式,若文件太.

2021-12-12 11:33:02 629

原创 文件系统部分(1)

一、文件系统的基本组成对于每一个文件,操作系统会为其分配两个数据结构——索引结点和目录项,二者的功能如下:- 索引节点,⽤来记录⽂件的元信息,⽐如 inode 编号、⽂件⼤⼩、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是⽂件的唯⼀标识,它们之间⼀⼀对应,也同样都会被存储在硬盘中,所以索引节点同样占⽤磁盘空间。- ⽬录项,⽤来记录⽂件的名字、索引节点指针以及与其他⽬录项的层级关联关系。多个⽬录项关联起来,就会形成⽬录结构,但它与索引节点不同的是,⽬录项是由内核维护的⼀个数据结构,

2021-12-12 00:04:06 906

原创 进程之间的通信方式

进程之间的通信方式包括管道,消息队列,共享内存,信号,信号量,socket六种方式,下面来对这6种方式分别进行介绍。一、管道管道的结构示意图如上所示,管道包含一个输入端和一个输出端,输入端将数据写入到管道中,输出端可以从管道中将数据读出。管道存在于内存中,并不存在于文件系统中,也就是说,管道其实是一段缓存,而且,在数据写入管道后,进程会阻塞,直到管道中的数据被读出位置可以在linux上面执行下面的指令进行测试$ mkfifo myPipe //创建管道$ echo "hello.

2021-12-11 20:54:52 2101

原创 kafka学习笔记

1.kafka是什么Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于 大数据实时处理领域。kafka同步处理和异步处理的模型:2.使用消息队列的优点异步处理的优点:1.解耦允许独立的修改写入mq和页面响应注册的代码2.可恢复性系统不会因为一部分的组件失效而是全部的系统功能都受到影响,及时系统挂掉,消息队列也可以处理数据3.缓冲可处理生产消息和消费消息的速度不一致的场景4.灵活性 & 峰值处理...

2021-12-10 15:35:02 1753 1

原创 进程与线程——线程部分2

线程的调度算法可分为两大类:1.非抢占式算法。直到一个线程运行结束,才会选择下一个线程进行任务调度。若当前线程没有运行结束,需要等待。2.抢占式算法。一个线程只运行一段时间,如果超出这个时间,不管当前线程有没有运行完,系统都会把它挂起,然后选择另一个线程进行任务调度。近一步细分可分为以下6种:1.先来先服务算法这个算法的逻辑很简单,采用一个队列记录所有的任务,先进入队列的任务将最先被执行。但这种调度方法有一个明显的缺点,设想一个问题,如果一个任务量很大的作业先于好几个任务量.

2021-12-06 23:42:22 356

原创 进程与线程——线程部分1

1.线程的概念在早期的操作系统中都是以进程作为独⽴运⾏的基本单位,直到后⾯,计算机科学家们⼜提出了更⼩的能独⽴运⾏的基本单位,也就是线程。2.多线程模型如图所示,对于一个进程的多个线程,每个线程都具有自己独立内存空间,这样在每个线程从进程的共享内存中读取数据后,只能操作自己内存空间中的那一部分数据,这样就不会在多线程操作时产生冲突问题。3.多线程的优点和缺点1)优点:⼀个进程中可以同时存在多个线程;各个线程之间可以并发执⾏;各个线程之间可以共享地址空间和⽂件等资源;2)缺点:

2021-12-05 23:35:39 598

原创 进程和线程——进程部分

1.进程和线程的区别举个例子来说把,比如说你现在电脑上打开了QQ,微信,浏览器这三个应用。那么这三个应用,每一个就可以看做是一个进程。线程则可以看做是一个进程内部,有多个执行此程序的程序。而一个进程如果只用一个线程去执行的话,那么效率太低,系统的资源也没法利用。就好像同样是搬东西,两个人搬总比一个人搬要搬的快,这个多人搬东西的过程,就可以类比为多线程。进程是操作系统分配资源的基本单位,线程是操作系统调度的基本单位2.并发和并行的区别这个我认为是比较容易搞混的一点。借用小林图解里面的一副图来说

2021-12-05 21:29:15 916

原创 consul配置和使用

一、什么是consulConsul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。二、consul的功能1)服务发现:Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。2)健康检测:Consul的Client提供了健康检查的机制,可以通

2021-11-21 15:22:01 3594

原创 操作系统内存及内存管理方式

一、虚拟内存设想一个场景,如果两个进程都会内存进行写入操作,那么会发生一个问题,进程一在写入完数据后,进程二会将进程一写入的数据给覆盖掉,这是我们非常不愿意看到的,这样会造成程序的崩溃。为了解决这个问题,必须给每个进程分配不同的内存空间来进行操作,这样不同的进程在执行的时候就不会产生冲突了,而实现这一功能就需要引入虚拟内存。即操作系统会为每个进程分配一个虚拟内存,操作系统内部会维护一张表,用于记录虚拟内存和实际内存地址之间的映射。这样进程在执行数据写入的时候,操作系统可以通过虚拟地址和实际内存地

2021-11-21 10:11:53 2218 1

原创 操作系统内核

一、内核的含义内核是计算机的应用程序和外部设备之间的连接桥梁,内核可让应用程序只需要关心如何与内核交互而不用去关心如何与外部设备之间进行交互。二、内核的功能1)管理进程、线程,决定哪个进程、线程使⽤ CPU,也就是进程调度的能⼒;2)管理内存,决定内存的分配和回收,也就是内存管理的能⼒;3)管理硬件设备,为进程与硬件设备之间提供通信能⼒,也就是硬件通信能⼒;4)提供系统调⽤,如果应⽤程序要运⾏更⾼权限运⾏的服务,那么就需要有系统调⽤,它是⽤户程序与 操作系统之间的接⼝。三、内核态

2021-11-20 14:43:25 1663

原创 mybatis源码分析部分

1.mybatis原理及启动过程这部分可以参考​​​​​​mybatis的实现及mybatis在spring和springboot中的实现_流光亦流连的博客-CSDN博客_springboot中mybatis如何实现数据注入schema为了方便后续的讲解,把mybatis启动过程的代码再拿出来写一遍:public class testStart { @Test public void testStart() throws IOException {//1.mybatis...

2021-10-30 16:06:28 147

原创 WEB页面的请求过程

在网页上输入一个url地址后会发生什么?1.DHCP部分前面有提到过,子网的IP地址大多是临时的IP地址,因此,若要请求WEB页面,对于我们的客户端首先需要一个IP地址,这个IP地址的获取需要通过DHCP服务。有关DHCP请求步骤的讲解可以参考链路层寻址_流光亦流连的博客-CSDN博客DHCP动态主机配置协议_流光亦流连的博客-CSDN博客这里只简单地介绍一下步骤:1.1 首先我们的电脑需要找到一台DHCP服务器,此时需要发送一条DHCP请求,源地址为0.0.0.0,目的IP地址

2021-10-30 14:27:58 508

原创 链路层寻址

事实上,主机和路由器并没有链路层的地址,链路层的地址由对应的网络适配器(即网络接口)掌管。如图所示,一个适配器可以通过交换机关联多个链路层,每个适配器的MAC地址都是不一样的,当一个适配器发送一个帧时,适配器会将目的MAC地址带上,交换机在接收到适配器发来的帧后,以广播的形式将帧发送给所有与它相连的适配器,适配器在接收到帧后,会检验目的MAC地址是否为自己,如果不是,则丢弃帧,如果是,则将数据报按照协议向上传递。IP地址与MAC地址的映射通过ARP表来进行维护,即源主机和目的主机的IP地址各对.

2021-10-27 23:32:09 1932

原创 链路层的差错检测技术和多路访问技术

一、差错检测技术与运输层和网络层一样,链路层也有自己的差错检测技术。链路层的差错检测技术通常有以下三种:1.奇偶校验该检测方法的原理是对于d比特的数据,在最后加上1比特的检验比特位,通过调节检验比特位的值使得这d+1比特的数据中1的个数为偶数,接收方检测这d+1比特的数据,判断1的个数,如果不是出现奇数个1,则数据出错。但这种方法无法检验出出现偶数个1的差错。但经过实验研究证明,出现偶数个错误的概率很低,大多情况下,链路层只会出现单个数据错误。但现在该方法已经由一维检验拓展到了.

2021-10-27 21:58:28 603

原创 DHCP动态主机配置协议

某组织一旦获得了一块地址,它就可以为本组织内的主机与路由器接口逐个分配IP地址。但是在分配IP地址时,分配给子设备的IP地址可能是固定的,也可能是临时的。其中临时IP地址的分配对应着动态主机配置协议(DHCP)。DHCP在实际应用场景中有着深刻的应用场景。试想,一个设备很多且流通性较强的组织,如果给每一个子设备都分配一台IP地址,则IP地址可能存在用完的情况,因此给所有子设备一个临时的IP地址是一个很好的解决方案。除了IP地址的分配外,DHCP还允许一台主机获得它的子网掩码,默认网关(即第一跳的路由

2021-10-25 14:42:06 1021

原创 IPv4 & IPv6

现在网络层的IP地址主要有两种版本,一是IPV4,二是IPV6,下面来对这两个版本的IP地址的相关内容进行总结1.IPV4的报文格式1)版本号 4比特 规定了数据包的IP协议版本2)首部长度 4比特 确定IP数据报中载荷实际开始的地方3)服务类型 8比特 用于区别不同类型的IP数据包4)数据报长度 16比特 IP数据报的总长度,即IP数据报理论最大程度655365)标识,标志,片位移 共32比特 与IP分片有关,IPV6中已经移除,仅存在于IPV4中6)寿命 8比特...

2021-10-25 14:03:00 723

原创 网络层与路由器

一、网络层作用网络层的作用主要有以下三点:1.转发。当一个分组到达路由器的某一输入链路时,该路由器必须将该分组移动到适当的输出链路。2.路由选择。当分组从发送方流向接收方时,网络层必须决定这些分组所采用的的路由或路径。这里面可以把路由选择理解为网络层通过相应的控制算法给出分组数据转发的最优路径,转发则可以理解为路径规划完毕后执行的转发动作。二、路由器2.1 路由器组成路由器由以下4个组件构成:1.输入端口:输入端口将执行以下几个重要的功能。它在路由器中执行终结入物理.

2021-10-10 18:14:08 1177

原创 TCP流量控制与拥塞控制

在介绍流量控制和拥塞控制之前首先不妨来想一下,接收方的接收能力受制于哪些因素。最重要的两个因素就是接收能力和网络情况。这两个因素就分别对应的流量控制和拥塞控制。一、TCP流量控制可以把流量控制理解为接收方的接收能力有限,因此要对发送方发送数据的数量进行控制。前面在TCP的报文格式中,我有介绍过,报文中存在一个接收窗口的字段,该字段的大小与流量控制有关。发送方的数据到达接收方后,会首先存于接收方的缓存中,接收方以一定的速度从缓存中将数据取出,同时接收方会在给发送方的报文中将其当前缓存中空闲空间的大

2021-10-08 22:58:06 649

原创 TCP和UDP

一、UDPUDP是一种不可靠,无连接的服务。在发送方一侧,直接将来自应用进程的数据交给网络层,在接收方直接将网络层的数据交给应用进程。UDP仅做了运输协议最少的工作,除了多路复用/分解功能及少量的差错检测外,几乎没有对IP增加别的东西。同时,UDP在发送报文段之前,发送方和接收方的运输层实体之间并没有进行握手,因此UDP不需要在发送方和接收方之间建立连接也可以发送。1.1 UDP的报文结构...

2021-10-08 21:09:15 715

原创 TCP网络编程

1.建立一个客户端和一个服务端(对应client()和server())2.生成socket需要服务端的端口号和ip地址造出服务端的ip地址和端口号.这里因为是同一台主机,服务端和输出端的IP地址相同,通过inetAddress.getLocalHost()获取IP地址,端口号可显示指定3.运用socket,getInputStream/getOutputStream获取socket的输出/输入流4.创建读取本地文件的流(FileInputStream/FileOutputStream)用于

2021-10-08 17:10:53 85

原创 DNS域名解析

一、DNS简介识别主机的方式有两种:分别是通过主机名和IP地址。路由器在转发的时候需要对应主机的IP地址,因此,必须要有一种可以将主机名转换为IP地址的服务功能。DNS是一个由分层的DNS服务器实现的分布式数据库,它使得一个主机能够查询分布式数据库的应用层协议,进而将用户提供的主机名转换为IP地址。二、DNS工作机理概述举个例子,在我们输入www.baidu.com之后,DNS是如何解析www.baidu.com对应的IP地址的呢?1.首先,当我们接入互联网时,互联网服务提供商(I.

2021-10-07 23:59:52 506

原创 WEB和HTTP

一、HTTP协议简介Web的应用层协议是超文本传输协议(HTTP),它是Web的核心。HTTP需要由客户端程序和服务端程序共同实现。在现实场景中,可以设想我们通过浏览器浏览某个网站的场景,在这个过程中Web浏览器就是客户端,其实现了HTTP客户端;而Web服务器就是服务端,用于存储Web对象,其实现了HTTP的服务端。HTTP协议定义了Web服务器请求Web页面的方式,以及服务器向客户端传输Web页面的方式,其交互过程中通过请求和相应的方式来进行。服务器通过HTTP报文请求向服务端请求页面中所包

2021-10-04 00:13:50 1360

原创 线程安全的实现方法

1.互斥同步互斥同步是一种常见也是最主要的并发正确性保障手段,同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被线程使用。互斥实现方式有互斥量,临界区,信号量等手段。JAVA里面最常见的互斥同步就是synchronized,synchronized关键字经javac编译后,会在同步块的前后形成monitorenter和monitorexit两个字节码指令。这两个字节码指令都需要一个明确的reference对象来解锁:对于static方法锁住的是class对象;对于非static方

2021-09-28 23:54:35 1349

原创 JAVA多线程的相关状态调用

一、JAVA多线程的实现多线程的实现主要以下三种模式:1.内核线程实现内核线程是指直接由操作系统内核支持的线程,这种线程由内核完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。程序一般不会直接使用内核线程吗,而是使用内核线程的一种高级接口,即轻量级线程,将轻量级线程与内核线程直接按照1:1的关系进行创建。具体的原理如图所示在这种模型下,每个轻量级进程都成为一个独立的调度单元,即使其中一个轻量级进程阻塞了,也不会影响整个进程仅需工作,但创建轻量.

2021-09-28 21:45:45 78

原创 JAVA内存模型

一、JAVA内存模型简介JAVA内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节。这里的变量,包含实例字段,静态字段和构成数组对象的元素。这些变量都存在主内存中,多线程模式下,主内存是被多个线程所共享的,因此主内存中的变量存在线程安全问题,为此,JAVA内存模型中为每个线程添加了自己的工作内存。每个线程在工作时,从主内存中拷贝操作需要用到的变量的副本,存储在自己的工作内存中。二、内存之间的交互操作主要有以下8个基本操作

2021-09-28 20:47:54 58

原创 JAVA泛型

泛型的本质是参数化类型或者参数化多态和应用,即可以操作的数据类型指定为方法签名中的一种特殊参数。JAVA选择的泛型实现方式叫做“类型擦除式泛型”。具体来说就是泛型只在源码中存在,在编译后的字节码文件里,全部泛型都被替换为了原来的裸类型,并且在相应的地方插入了强制转型的代码。可以结合下面这段代码来理解。public void test1(){ ArrayList<String> ilist = new ArrayList<>(); Arra

2021-09-28 19:33:36 186

原创 静态分派与动态分派

JAVA语言的三大特性为:继承,封装,多态。分派调用过程将会揭示多态特性的一些最基本的体现,如重写和重载。一、静态分派在介绍静态分派前,先来看一段一段代码public class StaticDispatch { static abstract class Human{ } static class Man extends Human{ } static class Woman extends Human{ } public voi

2021-09-27 23:55:02 553

原创 JAVA虚拟机栈帧结构

在JAVA虚拟机中以方法作为最基本的执行单元,“栈帧”则是用于支持虚拟机方法调用和执行的数据结构。它也是虚拟机运行时数据区中的栈中的栈元素。从JAVA程序的角度来看,同一时刻,同一条线程里面,在调用堆栈的所有方法都同时处于执行状态。但对于执行引擎来讲,在活动线程中,只有栈顶的方法才是在运行的,即只有栈顶的方法是生效的,其被称为“当前栈帧”,与这个栈帧所关联的方法被称为"当前方法",执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。栈帧中存储着方法的局部变量表,操作数栈,动态连接和方法返回地址。下

2021-09-27 21:27:05 179

原创 类与类加载器

一、类加载器实现"通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到JAVA虚拟机外部去实现以便让程序自己决定如何获取所需的类"功能的应用程序被称为类加载器。二、双亲委派机制JAVA虚拟机的类加载器可分为以下几类:1.启动类加载器:这个类加载器使用C++语言实现的,负责加载存放在$JAVA_HOME/lib目录下的类,或者被-Xbootclasspath参数所指定的路径中存放且能够被JAVA虚拟机识别的类库加载到虚拟机的内存中。启动类加载器无法被JAVA程序直接引用,自定义加载器

2021-09-26 19:57:50 155

原创 虚拟机类加载机制

类的生命周期可以分为加载,验证,准备,解析,初始化,使用和卸载7个阶段。其中验证,准备,解析三个部分统称为连接。其中类的加载,验证,准备,初始化,卸载这五部的顺序是确定的,但解析阶段则不一定,它在某些情况下可以等到初始化阶段后在开始,主要是为了支持JAVA语言的动态绑定特性。1.类的加载加载过程中JAVA虚拟机需要完成三件事:1)通过一个类的全限定名来获取定义此类的二进制字节流。2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3)在内存中生成一个代表这个类的j.

2021-09-26 15:50:47 54

原创 经典垃圾收集器

一、Serial收集器通过名字就可以知道这是一个单线程收集器,这里的单线程并不仅仅指它会用一个线程去完成垃圾收集工作,更重要的是强调它在垃圾回收时,必须要暂停其他所有的工作,直到垃圾回收结束。其运行示意图如下:尽管Serial收集器在垃圾收集的过程中会伴随着长时间的STOP THE WORLD,但它仍是HotSpot虚拟机运行在客户端模式下的默认新生代收集器,它相比于其他垃圾收集器,最大的优势在于简单高效,而且它的额外内存消耗是所有垃圾收集器里面最小的。由于客户端分配给虚拟机的内存并不会

2021-09-25 21:21:14 46

原创 HotSpot垃圾回收算法的细节分析

一、根节点枚举根据之前的博文,我们已经了解了可达性分析算法,那么这个算法具体是怎么在HotSpot中实现的呢?首先,JVM需要标记直接与GC roots相连的对象,但这个过程必须要暂停其他用户进程,即stop the world(以下简称STW)。因为与GC roots直接相连的对象是可达性分析算法准确性的关键,关系着对象能否被正确地进行标记。但用户线程停顿下来之后,并不需要检查完所有上下文和全局引用的位置来找到被GC roots直接引用的对象,这太费时间了。为了提高效率,JVM中会维护一个Oo

2021-09-15 09:51:41 173

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除