- 博客(78)
- 资源 (5)
- 收藏
- 关注
原创 万字长文详述 - 带你了解Jvm虚拟机运行时数据区
JVM虚拟机,对大部分Java程序员而言,是既熟悉又陌生的存在,Java程序在虚拟机的自动内存管理机制帮助下,减少了绝大部分的内存管理工作。但也正是因为如此,虚拟机如果出现了内存溢出或者泄露的情况,问题排查、BUG修复也成了一项异常艰苦的工作。本系列,是基于《JVM高级特性与最佳实现第3版》这本书,整理的个人学习笔记,旨在学习过程中,结合其他许多资料和博客,对以往模糊不清晰的知识点予以深度梳理。首先看一下运行时数据区域的定义。说到运行时数据区域,必须了解的一本著作是。
2024-06-17 21:24:39
952
原创 【设计模式-12】代理模式的代码实现及使用场景
代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用,代理模式是一种结构性的设计模式。代理模式的结构比较简单,核心是代理类。抽象接口:声明的一个接口,保证被代理的对象和代理对象的类都可以实现抽象接口。被代理角色:真实的需要被代理的对象,也就是真正实现业务逻辑的角色。代理角色:代理模式的核心角色,代理类内部会对真实的被代理类进行引用,同时会增强或者删除某一些功能。
2024-06-17 18:51:10
480
原创 【设计模式-10】适配器模式的代码实现及使用场景
适配器模式通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作,又被称为包装器模式,是一种结构性的设计模式。同时适配器模式可以实现客户端和目标接口的解耦,进一步提高目标接口的可复用性。适配器模式可以分为对象的适配器模式和类适配器模式两种,对象适配器模式中,适配器和目标接口是关联关系,类适配器中,适配器和目标接口是继承关系,在实际开发中,对象适配器的使用频率更高一些。目标接口:客户端正在使用的接口,也可以是抽象类,一般基于开闭原则是不能修改的。被适配者。
2024-01-26 18:34:54
688
原创 【设计模式-11】享元模式的代码实现及使用场景
享元模式运用共享技术实现大量相似对象的复用。系统可以只创建少量的对象,对象中某些属性是相同的不变的,这些不变的属性称为内部状态,同时依靠客户端传入一些外部属性,来区分不同的对象,这些变化的属性成为外部状态。享元模式是一种结构性设计模式。享元模式的原理很简单,其实就是在堆中创建少量对象,通过改变对象的内部属性,而不改变对象的内存地址,实现对象的复用。在享元模式中,存储这些共享实例的地方称为享元池,比如26个英文字母在内存中会被无数次使用到,这个时候每个字母就可以记录到特定享元池中。
2024-01-26 18:34:19
356
原创 【设计模式-9】装饰模式的代码实现及使用场景
装饰模式可以动态的为某些对象增加一些额外的职责,在某些程度上,装饰器模式类似于继承,但是比继承更加灵活,可以在不改变一个对象本身功能的基础上额外增加新行为。装饰模式是一种对象结构性的模式。在定义中,我们提到了继承,通过继承的方式,子类可以在父类的功能上做增加,但这是在编译期间,需要修改子类来完成的。装饰模式可以在运行期间动态的包装原始对象,实现“装饰”的效果。装饰模式的实现需要以下4个角色。组件接口:组件接口是所有被装饰的类和装饰器抽象类共同要实现的接口标准,接口中会定义装饰的行为方法。组件实现。
2024-01-22 18:17:18
868
原创 【设计模式-8】组合模式的树形结构实现原理和代码演示
组合模式是针对树形结构而发展出来的一种设计模式,树形结构是由节点对象组合而成的对象,呈现“个体-整体”的结构,这种模式可以使客户端在操作树形结构的整体或者个体节点对象时,能做出统一的响应,这种整体和个体的概念对客户端来说也是不可见的。组合模式可以很好的做到,复杂树形对象的层次结构与客户端解耦的目的,是一种结构性的设计模式。抽象构件:一般是接口或者抽象类,声明了子类的方法和属性。子类可以是一个叶子构件 ,也可以是一个容器构件。叶子构件。
2024-01-22 14:53:31
899
原创 【设计模式-7】门面模式(外观模式)的代码实现和应用场景
门面模式客户端和多个子系统的通信会通过一个统一的外观角色进行,这个角色为子系统中的一组接口提供了一个一致的入口,它是一种结构性的设计模式。根据单一职责的描述,在软件中会将一个系统划分成为若干个子系统,这有利于降低整个系统的复杂性。但多个系统之间存在同步或者异步的交互关系,拓扑结构极为复杂,为了解决这种情况,一个常见的设计方式便是引入一个外观的角色,使得外部客户端与子系统之间的相互依赖关系达到最小。
2024-01-11 20:33:32
620
原创 【设计模式-6】建造者模式的实现与框架中的应用
建造者模式将一个复杂对象的构建和表示分离,使得同样的构建过程可以创建不同的表示。建造者模式一步一步地创建一个复杂的对象,它允许用户通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的构造细节。官方的表达还是挺难理解的,总体意思就是,构建过程固定,构建使用的每个组件都可以通过继承或者实现 呈现出多态的特性,这依赖于抽象建造者接口和具体的建造者实现类两个组件来表示。产品:复杂的产品类,建造者的最终产物,构建过程相对复杂,需要很多组件组装而成。抽象建造者。
2024-01-11 12:28:03
1280
原创 【设计模式-5】抽象工厂模式的代码实现及使用场景
抽象工厂模式:为创建一组对象提供了一种解决方案,与工厂方法模式相比,抽象工厂模式中的工厂角色不只创建一种产品,而是负责一个产品簇对象的生产。抽象工厂模式是一种创建型的设计模式。它声明了一组用于创建一个产品簇的方法,每个方法对应一种产品,它可以是接口或者抽象类。它实现了在抽象工厂中声明的创建具体产品的方法,生成一组具体的产品,这些产品组成一个产品簇,每种产品都属于一个产品等级。它是每种产品的抽象,可以是接口或者抽象类,声明产品的业务方法。
2024-01-05 21:04:27
1277
原创 【Redis-04】Redis命令在客户端与服务器之间的执行流程
Redis本质上是一个数据结构服务器,支持键值对类型存储的内存管理系统,可以用作数据库、缓存和消息中间件,在我日常的开发中,基本上使用redis作为缓存中间件。在Redis中有两个重要的角色,一个是服务器server,一个是客户端client,他们是一对多的关系,服务器会保存每个与之相连接的客户端的状态信息。本文会从这两个角色,分析客户端和服务器中一些比较重要的属性结构,以及一个命令从客户端发送到服务器接受、处理并返回的实现原理。
2024-01-04 09:49:42
1287
原创 【Redis-09】Redis哨兵机制的实现原理-Sentinel
Sentinel是Redis高可用性的解决方案:由一个或者多个Sentinel实例组成的哨兵系统监视多个主从服务器,并实现主从服务器的故障转移。 Sentinel本质上只是一个运行在特殊模式下的Redis服务器,使用以下命令可以启动并初始化一个Sentinel实例: 下面我们看一下,启动一个Sentinel实例后,它做了哪些初始化步骤吧。 首先Sentinel也是一台Redis服务器,所以启动后的第一步就是初始化服务器,但是这里的初始化和之前我们普通的Redis服务器不太一样,有些步骤不需要执行,例如载
2024-01-04 09:48:06
1565
1
原创 【设计模式-2】原型模式的原理、代码实现及类图展示
原型模式也是一种创建型的涉及模式,实现和原理总体比较简单,一句话总结呢,就是可以实现用已有的对象创建新的对象,而不是用类来实例化对象,这样可以起到提升效率的目的。众所周知,类的实例化可以创建对象,但其实这是一个比较耗时耗力的工作,尤其是在大量实例化对象的业务场景下,可能会对系统的性能造成很大的影响。这时候,原型模式就可以很好的解决问题,用已有的对象来生成对象的副本,这里已有的对象就是原型对象,副本对象就是拷贝对象。
2024-01-02 12:32:55
1369
原创 【网络面试(6)】IP协议对网络包的转发
在前面的博客中,我们提到过,网络传输的报文是有真实的数据包和一些头部组成,目前我们了解的头部就有TCP头、IP头、MAC头,而且这三个头部信息都是在应用程序委托给协议栈之后,被写入的相关信息,这些头部都是跟网络包的转发和传递有关系的。前面我们学习了TCP协议对网络包的拆分、重发、三次握手四次挥手等机制,本篇博客来看一下,在IP协议中,如何借助于IP头部和MAC头部实现对网络报文转发的。
2024-01-01 00:10:36
1215
原创 【网络面试(5)】收发数据及断开服务器(四次挥手)
前面了解到服务器和客户端在创建套接字,建立连接后,就可以进入到下一步,双发可以互相发送和接收数据,本篇博客就来学习一下这个过程。我们印象里,发送数据应该是我们在浏览器输入网址,敲击回车的一瞬间,发送动作就完成了,回头服务器处理完成将数据发送客户端,浏览器解析出来,这就是反过来接收的过程。
2024-01-01 00:08:36
1465
原创 【网络面试(4)】协议栈和套接字及连接阶段的三次握手原理
一直对操作系统系统的内核协议栈理解的比较模糊,借着这一篇博客做一下简单梳理, 我觉得最直白的理解就是,内核协议栈就是操作系统中的一个网络控制软件,就是一段程序代码,它负责和网卡驱动程序交互,实现消息的发送和接收。在探究协议栈内部原理之前,先从整体上看下TCP/IP软件采用的分层结构。在这张图中,可以看到从上往下的层级结构中,上面的部分会向下面的委派工作,下面的部分实际来执行。
2024-01-01 00:06:20
842
原创 【网络面试(3)】浏览器委托协议栈完成消息的收发
前面的博客中,提到过很多次,浏览器作为应用程序,本身是不具备向网络中发送网络请求的能力,要委托操作系统的内核协议栈来完成。协议栈再调用网卡驱动,通过网卡将请求消息发送出去,本篇博客就来探讨一下这个过程是如何实现的。虽然我们说,浏览器是委托内核协议栈完成了收发消息的动作,但实际上,他们两个并不是直接交互的,和之前DNS解析器一样,浏览器会调用操作系统Socket库中的很多程序组件依次来完成上面提到的4个阶段,所以Socket库起到非常重要的作用。
2023-12-31 22:28:03
645
原创 【网络面试(2)】DNS原理-域名和IP地址的查询转换
从上一篇博客我们得知浏览器是如何生成了HTTP消息了,但是浏览器作为应用程序,是不具备向网络中发送请求的能力,而是需要委托给操作系统的内核协议栈来发送请求。在委托协议栈之前,浏览器还要做的一件事情就是将域名转换为IP地址。在了解这个过程之前,我们先来学习一下IP地址相关概念。
2023-12-31 22:26:51
1866
原创 【网络面试(1)】浏览器如何实现生成HTTP消息
我们平时使用的浏览器有很多种,微软的edge,苹果的safari,谷歌的chrome等等,他们的功能是类似的。浏览器其实是一种综合性的客户端软件,具备访问多种服务器的能力,通常我们只要输入网址,也就是URL,就可以访问到目标网站。这里非常重要的就是URL
2023-12-31 22:25:11
1309
原创 【面试题】HTTP 协议中 URI 和 URL 的区别
回到Web上,假设所有的Html文档都有唯一的编号,记作html:xxxxx,xxxxx是一串数字,即Html文档的身份证号码,这个能唯一标识一个Html文档,那么这个号码就是一个URI。URL是以描述人的位置来唯一确定一个人的。所以不论是用定位的方式还是用编号的方式,我们都可以唯一确定一个人,都是URl的一种实现,而URL就是用定位的方式实现的URI。拿人做例子,假设这个世界上所有人的名字都不能重复,那么名字就是URI的一个实例,通过名字这个字符串就可以标识出唯一的一个人。
2023-12-31 22:22:49
810
原创 类的加载顺序问题-demo展示
然后再执行构造器的代码(步骤1.3),首先输出 3,接下来输出 a = 5, b=0,这里有些同学会有疑问,为什么 b 是0呢?大家注意看,前面类加载的时候,我们只是执行了步骤1,而 静态属性b的赋值要到步骤3种才能执行,所以这里b是没有被赋值的,默认是0。在f1方法里面,AooTest又一次被实例化了,所以如果前面被实例化的步骤一样,实例代码块输出2,构造器输出3,接下来输出输出 a = 5, b=6,这里注意,b在前面已经赋值了,所以与上面的输出不同。4、然后回到前面的图,执行步骤2,输出1。
2023-12-31 22:18:15
609
原创 【设计模式-4】工厂方法模式-代码实现及使用场景
工厂方法模式定义一个用于创建对象的工厂接口,让子类决定创建哪种类型的产品对象,使得具体产品对象的创建延迟到抽象工厂的子类中进行。工厂方法模式又称工厂模式,是一种创建型模式。抽象产品角色:它定义了产品接口,是工厂生产具体产品的父类,可以是接口或抽象类。具体产品角色:它实现了抽象产品接口,是工厂类生产的具体产品对象。抽象工厂角色:抽象工厂接口声明了工厂方法,用于返回产品,是工厂方法模式的核心,所有的具体工厂都要实现抽象工厂接口。具体工厂角色。
2023-12-31 22:14:35
893
原创 【Redis-06】深入源码彻底搞懂Redis两种持久化方式-RDB和AOF
Redis是基于内存的数据结构服务器,保存了大量的键值对数据,所以持久化到磁盘是非常必要的,Redis提供了两种持久化的方式,分别是RDB和AOF。下面我们看下这两种持久化方式的具体实现原理。
2023-12-31 22:11:39
1481
原创 【Redis-08】Redis主从复制的实现原理
在Redis中,可以通过slaveof命令或者设置那么,127.0.0.1:6379就会成为从服务器,127.0.0.1:6380就是主服务器,主从服务器通过复制会保存相同的数据,这就是。今天我们探讨的重点是,主从服务器之间是如何实现数据复制的,以及slaveof这个命令的实现原理。
2023-12-31 22:10:12
1078
1
原创 【Redis-05】Redis如何实现保存键值对的保存及过期键的管理策略
Redis服务器在启动之初,会初始化RedisServer的实例,在这个实例中存在很多重要的属性结构,同理本篇博客中介绍的数据库实现原理也会和其中的某些属性相关,我们继续看一下吧。
2023-12-31 22:02:31
1305
原创 【Redis-07】Redis最重要的时间事件serverCron函数
Redis服务器中的serverCron函数默认每100ms执行一次,这个函数负责管理服务器中的部分资源,并保持服务器自身的良好运转状态。接下来,我们就来梳理一下serverCron函数执行期间做了哪些重要的事情。
2023-12-31 21:59:18
433
原创 【Redis-10】Redis集群的实现原理和实践
Redis集群是Redis提供的分布式数据库方案,通过分片来进行数据共享,实现复制和故障转移的功能。
2023-12-31 20:14:51
1279
原创 【设计模式-1】图文并茂:单例模式的使用场景及7种代码实现
确保一个类只有一个实例,而且自行实例化并且自行向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法,单例模式是一种对象的创建型模式。某一个类(单例类)只能有一实例;单例类必须自行创建这个实例;单例类必须向整个系统提供这个唯一的实例。OK,有了这三点,其实就把创建单例模式的步骤罗列出来了,我们先看一下单例模式的类图,有个模糊的概念。类图还是比较简单清晰的,自关联关系,下面我们来看下为什么要用单例模式呢?
2023-12-31 19:58:51
1212
原创 【程序设计】程序设计的七大原则
当然原来的类不是一定不能修改,如果对原来的代码很熟悉,涉及场景比较少、风险可控的情况下是可以修改的,或者代码面临重构,开闭原则就可以暂时放弃。接口隔离原则强调的是一个类对另一个类的依赖应该建立在最小的接口上,我们针对每一类业务要建立单独的接口,接口中的方法尽量少,而不需要复杂臃肿的接口,这也符合单一职责。继承会破坏类之间的封装性,父类的内部细节暴露给子类,称之为白箱操作,而通过组合/聚合的方式,将已有对象纳入到新对象中,使得对象的功能可以被调用,这种行为称为黑箱操作。其实就是关联和依赖的关系。
2023-12-31 19:56:34
1232
原创 【Redis-02】Redis数据结构与对象原理 -上篇
Redis本质上是一个数据结构服务器,使用C语言编写,是基于内存的一种数据结构存储系统,它可以用作数据库、缓存或者消息中间件。我们经常使用的redis的数据结构有5种,分别是:string(字符串)、list(列表)、hash(哈希)、set(集合)、sorted set(有序集合),下面基于redis 5.0 版本查看这5种数据结构的底层实现原理。
2023-12-31 19:36:12
1502
原创 【Redis-03】Redis数据结构与对象原理 -下篇
在数据量比较多的时候,有序集合使用了 dict + zskiplist两种结构共同来实现。dict用于保存数据与分值之间的对应关系,key=成员对象,value=分值,这也是为什么数据值如果相同,后者会覆盖前者的原因。 而zskiplist用于使用分数来查找数据,也支持范围内的查找。虽然zset同时使用了字段和跳跃表,但是这两种数据结构都会通过指针来共享相同的元素和分值,所以不会产生重复的数据,也不会额外占用内存。
2023-12-31 19:32:33
1308
原创 【Redis-01】RedisObject基本原理及各属性结构的作用
我们知道,redis常用的5种类型底层都是通过redisObject去封装的。这几个属性都很重要,下面就看下他们各自代表什么含义以及有什么作用。
2023-12-29 18:11:10
1065
原创 【程序设计】UML类图概述
类图是14种UML(统一建模语言)中的一种,是面向对象程序的核心建模工具,能够描述接口、类以及他们之间的协同关系,显示项目中这些概念的静态结构。 本文是我参考多篇博客整理而成,意在帮助自己开发过程中绘制更为清晰和规范的图示,使得整个软件设计有更好的可读性和理解性,降低开发的风险,同时也方便与其他研发同事的沟通交流。
2023-12-29 10:37:30
1111
原创 【网络面试(9)】Web服务器处理Http请求消息及与客户端交互的原理
这一篇,我们看一下请求消息的终点,Web服务器的程序结构。我们都知道,服务器会同时接收多个客户端的请求,做出响应并返回程序结果。但是仅一个服务器程序就处理多个客户端的请求是很难得,因此服务器会启用多个程序或者多个线程来实现这种一对多的关系。
2023-12-27 20:38:53
862
原创 【网络面试(8)】防火墙原理、正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器
作为一个程序员,其实很少去了解http请求消息在到达服务器之前,所经过的众多组件的,今天借着机会聊一聊标题中提到的正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器等内容。
2023-12-19 12:28:12
1714
原创 【网络面试(7)】聊聊集线器、交换机和路由器
好了,到现在我们已经知道了,MAC模块经过最后一步对网络数据包的加工,添加了头部的报头、起始帧分界符合尾部的帧校验序列后,就会把包向以太网中发送了。从现在开始,数据包就正式离开计算机,进入到网络传输的步骤了。要想将网络包传输到目的地,中间过程经过集线器、交换机和路由器,也就是本篇博客要聊的三个大件,我们只需要知道他们的大体功能以及如何帮助我们转发网络包的就可以。
2023-12-05 12:38:44
1168
原创 【Redis-03】面试题之Redis数据结构与对象-RedisObject(下篇)
Redis数据结构与对象,RedisObject对象,简单动态字符串sds,字典dict,压缩列表ziplist,跳跃表skiplist,整数集合intset,快速列表quicklist,面试题
2022-12-02 17:58:57
1247
原创 【Redis-02】面试题之Redis数据结构与对象-RedisObject(上篇)
Redis数据结构与对象,RedisObject对象,简单动态字符串sds,字典dict,压缩列表ziplist,跳跃表skiplist,整数集合intset,快速列表quicklist,面试题
2022-12-02 17:27:55
1928
chm.zip-chm常用基本文档
2019-09-02
lib.zip-常用的依赖包,包括poi一类
2019-09-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人