自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 初识Netty——Netty的特性

对于NIO,的SocketChannel,在非阻塞模式下,它会直接返回连接结果,如果没有连
接成功,也没有发生IO异常,则需要将SocketChannel 注册到 Selector上监听连接结果。如果已经连接超时,但
是服务端仍然没有返回 TCP握手应答,则关闭连接,如果在超时期限内处理完成连接操作,则取消连接超时定时任务。用于客户端的登录、握手和安全认证,一旦链路建立成功,就将链路注册到后端 subReactor线程池的I/O线程上,由I/O线程负责后续的I/O操作。用于接收客户端请求的线程池职责如下。

2024-05-25 22:02:44 572

原创 初识Netty——服务端、客户端创建

需要注意的是,SocketChannel 执行 connect()操作后有以下三种结果:(1)连接成功,返回True(2)暂时没有连接上,服务端没有返回ACK 应答,连接结果不确定,返回False;当轮询到就绪的channel之后,就由reactor线程NioEventloop执行channelpipeline的相应方法,最终执行channelhandler。设置并绑定reactor线程池。上的Channel,Selector 的轮询操作由绑定的 EventLoop 线程 run 方法驱动,在一。

2024-05-25 21:58:53 709

原创 初识Netty——编解码技术、私有协议栈

解码器原理分析:LineBasedFramcDecoder的工作原理是它依次遍历 ByteBuf 中的可读字节,判断看是
否有“\n”或者“\r\n”,如果有,就以此位置为结束位置,从可读索引到结束位置区间的
字节就组成了一行;息给客户端,应用层链路建立成功。,待发送的消息不能丢失,等链路恢复之后,重新发送这些消息,保证链路中断期间消息不。地址,从中取得发送方的源地址信息,通过源地址进行白名单校验,校验通过握手成功,服务端接收到客户端的握手请求消息之后,如果 IP 校验通过,返回握手成功应答。

2024-05-25 21:55:22 633

原创 初识Netty——I/O技术简介

步骤四:判断是否连接成功,如果连接成功,则直接注册读状态位到多路复用器中,
如果当前没有连接成功(异步连接,返回 false,说明客户端已经发送 sync 包,服务端没
有返回 ack 包,物理链路还没有建立)步骤十二:对 ByteBuffer 进行编解码,如果有半包消息接收缓冲区 Reset,继续读取
后续的报文,将解码成功的消息封装成 Task,投递到业务线程池中,进行业务逻辑编排。步骤六:多路复用器监听到有新的客户端接入,处理新的接入请求,完成 TCP 三次
握手,建立物理链路,示例代码如下。

2024-05-25 21:52:59 898

原创 UNIX网络编程基础

套接字对:一个TCP的套接字对是定义该连接的两端的四元组:本地ip地址,本地tcp端口号,外地IP地址,外地tcp端口号,套接字对唯一的标识一个网络上的TCP连接。三个参数排列组合共有六个exec函数,其中只有execve函数调用的是内核函数,其他用的都是execve的库函数。两个队列之间的元素可以相互转换,表示不同的状态,backlog参数视为这两个队列总和的最大值,Timeout参数指定poll函数返回前等待多久,是一个毫秒数的正值。Socket成功时返回一个小的非负整数值,成为套接字描述符。

2024-05-24 17:35:39 315

原创 计网夯实基础——HTTP协议篇

页面当然不是凭空显示出来的,根据指定的URL,浏览器从服务器那边获取内容和一些资源,像这种通过发送请求来获取服务器资源的浏览器,统称为客户端(client)为了解决TCP连接断开的问题,在之后的HTTP版本中出现了持久连接,它使得多数请求可以以管线化的方式进行发送(能并发发送多个请求,不用一个一个来)204 No Content 请求处理成功,但返回的响应报文中没有实体的主体部分,一般在只需要客户端往服务器发送信息的情况下使用。协议是不保存状态的协议,不具备保存之前发送过的请求或响应的功能。

2024-05-24 17:22:32 593

原创 计网夯实基础——UDP协议篇

UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都会产生一个UDP数据报,并组装成一份待发送的IP数据报,这与面向字节流的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系(主要是在传输层就进行分段了,因此不会受IP分片的影响)。至于UDP的校验和,这里注意下区别就好了,UDP对首部和数据部分都进行校验,而IP首部的校验和仅对IP的首部进行校验,顺带提下TCP,TCP的校验和也是对首部和数据部分都进行校验,另外,UDP的校验和是可选的,而TCP的是必选的。

2024-05-24 17:15:04 278 1

原创 计网夯实基础——IP、ICMP协议篇

到了这里有一个问题自然就明了了,TCP分段的原因是MSS,IP分片的原因是MTU,由于一直有MSS<=MTU,很明显,分段后的每一段TCP报文段再加上IP首部后的长度不可能超过MTU,因此也就不需要在网络层进行IP分片了。首部长度是指首部占32bit字的数目,因为4位的最大值为15,因此首部最长为60字节,也即是说选项部分的最大值为40字节,不够4的倍数,要用0填充,使数据部分的起始地址为4的倍数。首部的每一行是一个32位字的单位,最高位在左边,为0bit,最低位在右边,为31bit。

2024-05-24 17:11:46 397 1

原创 计网夯实基础——TCP协议篇

假设不采用三次握手,这时服务端只要发送了确认,新的连接就建立了,但由于客户端比你更没有发出建立连接的请求,因此不会理会服务端的确认,也不会向服务端发送数据,而服务端却认为新的连接已经建立了,并在一直等待客户端发送数据,这样服务端就会一直等待下去,直到超出保活计数器的设定值,而将客户端判定为出了问题,才会关闭这个连接。2、B收到连接释放报文段后即发出确认释放连接的报文段,该报文段中,ACK=1,确认号为ack=u+1,其自己的序号为v,该序号等于B前面已经传送过的数据的最后一个字节的序号加1。

2024-05-24 17:07:39 709 1

原创 计网夯实基础——概念篇

它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。它们读取这个包的"标头",找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。

2024-05-24 17:03:39 913 1

原创 redis基础——AOF持久化

套接字准备好执行一些操作,每个套接字都会产生一个文件事件,一个服务器会连接多个套接字,所以可能会出现多个并发文件事件。因为存在一个AOF重写缓冲区记录了所有的写操作,所以不害怕存在不一致,只需要最后进行一次比对写入就可以了。I/O多路复用程序负责监听多个套接字并向文件事件分派器传送相应的套接字(通过队列每次分派一个套接字)处理时间事件的时间比预定的100ms满了30ms,因为不会出现抢占,所以只能等前面的结束。文件事件分派器接受到套接字之后,根据套接字产生的文件事件类型,调用相应的事件处理器。

2024-05-23 21:58:52 149 1

原创 redis基础——RDB持久化

Check_sum是一个8字节无符号整数,保存校验和,用来检测RDB文件是否出现错误或损坏。设置保存条件:服务器状态中有个属性saveparam用来保存设置的条件。Db_version长度为四字节,记录了RDB文件的版本号。Key_value_pairs保存数据库中的所有键值对数据。不想办法将存储在服务器的键值对数据保存到磁盘中,那就会丢。EOF 长度一字节,标志着RDB文件正文的结束。RDB文件的载入时是服务器启动时自动完成的。Redis部分用来检查载入的是不是RDB文件。Dbnum保存一个数据库号码。

2024-05-23 21:32:22 214 1

原创 redis基础——数据结构

描述的是多个节点长度都在254附近,此时一个大于254的节点加入进来,那么前面所说的Previous-entry-length就会从一字节变为五字节,跟多米诺骨牌一样导致全体节点都需要扩容升级,删除节点同样也会导致此操作。记录了节点的content所保存的数据类型以及长度:一字节两字节或五字节长,值的最高位为00、01、10的是字节数组编码;一个键(key)和一个值(value)关联,字典中的每个键都是独一无二的,这数据结构也是redis中应用最广泛的,除了用来表示数据库之外,还用来实现哈希键。

2024-05-23 21:13:57 254 1

原创 MySQL杂谈——设计案例及其注意点

索引案例学习优化排序。

2024-05-22 23:00:19 196 1

原创 MySQL杂谈——索引的创建

唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。在MySQL中,一个好的索引对于查询时间的提升非常重要,能够将查询性能提高几个数量级,因此学习索引的原理及其优化技巧与注意事项是非常重要的。需要注意的是索引并不总是最好的方案,对于小表来说,全表扫描可能要比索引更高效,对于中大表来说,索引带来的性能提升就比较大了。索引列的顺序对于查询性能的提升也是比较重要的,并且索引列的顺序跟平时写SQL也是相关的。这是一种特殊的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。

2024-05-22 22:40:08 230 1

原创 MySQL杂谈——表设计与数据类型的选择和优化

MySQL会把这俩当作一个独立的对象处理,当值太大时,InnoDB会专门使用外部存储区域来存储,此时每个值在行内要划出来1-4个字节存储一个指针,然后在外部存储区域存储真正的值。枚举最不好的地方是,字符串列表是固定的,添加或删除字符串必须使用alter table,这是开销很大的一个操作,除非只在末尾添加新元素,因为这样不用重建整张表。需要注意的是MySQL可以指定类型宽度,如int(11),但这只是在显示的时候给你看的,真正存储中int(1)和int(20)是一样的。这是个值得思考的问题。

2024-05-22 22:00:50 430 1

原创 MySQL杂谈——概念架构篇

延迟更新索引键 在创建表的时候,如果指定了DELAY_KEY_WRITE 选项,不会将修改的索引数据立刻写入磁盘,而是会写到内存中的键缓冲区,只有在清理缓冲区或者关表的时候才会将对应的索引块写入磁盘。表锁:是MySQL中的最基本的锁策略,它开销最小,它会锁定整张表,一个用户要对表进行写操作时,要先获得写锁,这会阻塞其他用户对表的操作,只有没有写锁的情况下,其他用户才嗯那个获得读锁,而读锁之间不互相阻塞。在处理并发问题时,通过实现一个由两种类型的锁组成的锁系统来解决问题,共享锁(读锁)和排他锁(写锁)。

2024-05-22 20:25:25 673 1

原创 Jvm调优篇(3)——性能调优

Jvm内存消耗过多会导致频繁的GC,CPU消耗增加,应用的线程的执行速度下降,甚至会造成OOM,最终导致进程退出。Linux在操作文件时,会将文件放入文件缓存区,直到内存不够或者系统要释放内存给用户进程使用,再查看Linux内存状况时经常会发现可用的物理内存不多,但cached用了很多,这是Linux提升文件IO速度的一种方式。最后,可以初步了解到,Java应用的问题主要就是出现在三个方面:CPU、IO、内存,另外还有一些不在此问题里的资源够用但还是慢,这时需要重点关注锁的问题。

2024-05-10 17:19:18 605

原创 Jvm调优篇(2)——线程资源同步及交互机制

值得一提的是,jdk提供了一些开源工具让用户在程序运行的时候对线程进行监控和分析,具体什么工具前面也有提到,需要在实际开发环境中进行实践。由Java内存模型能看出来,一个简单的i++操作,实际上在内存中的步骤并不简单,每一个线程都有一个工作内存,当它需要操作主内存的变量时,并不像代码中写的那么简单,包含了一系列步骤。Java采用多线程的方式来处理大量的并发请求,在这个情况下,程序的复杂程度远高于单线程时,尤其在多核和多cpu情况下,最明显的问题是线程之间共同管理的资源竞争和线程间的交互操作。

2024-05-10 16:58:13 260

原创 Jvm调优篇(1)

解释执行的效率比较低,为了提升执行性能,jdk将字节码编译成机器码的支持,在编译上,jdk提供了两种模式:client(c1)和server(c2).c1为轻量级,作少量性能开销比高的优化,占用内存少,适合桌面交互应用。逃逸分析是c2优化的基础,逃逸分析是指根据运行情况来判断方法中的变量是否会被外部读取,若不会则认为方法是逃逸的,基于逃逸分析c2会在编译时做标量替换、栈上分配和同步削除等操作。调优之前,需要先知道jvm的结构和代码从加载到运行的基本步骤和流程。有了一些前置知识,之后才能进行调优部分的学习。

2024-05-10 16:38:46 152

原创 Java虚拟机进阶之路——虚拟机字节码执行引擎

法表中的地址入口和父类相同方法的地址入口是一致的,都指向父类的实现入口。开始的局部变量槽,参数表分配完毕后,再根据方法体内部定义的变量顺序和作用域分配其余的变量槽。指令为例,这个指令只能用于整型数的加法,它在执行时,最接近栈顶的两个元素的数据类型必须为。调用则要复杂许多,它可能是静态的也可能是动态的,按照分派依据的宗量数可分为单分派和多分派。另外在概念模型中,两个不同栈帧作为不同方法的虚拟机栈的元素,是完全相互独立的。动态分派是执行非常频繁的动作,而且动态分派的方法版本选择过程需要运行时在接收者类型的。

2024-05-09 21:05:10 675 1

原创 Java虚拟机进阶之路——类加载机制

接口与类的区别:前面六条中的第三条,当一个类被初始化时,要求其父类全部已经被初始化过了,但一个接口在初始化时,并不要求其父接口全部被初始化过,只有在用到父接口的时候(如引用父接口里的常量),才会进行初始化。对于任意一个类,它的唯一性必须由这个类本身和它的类加载器共同确定,比较两个类是否相等,只有在这两个类是由同一个加载器加载进来的情况下才有意义,否则,只要加载器不一样,那类必定不相等。类初始化是类加载的最后一个步骤,在这个阶段Java虚拟机才开始真正执行类中的Java源代码,将主导权交给程序。

2024-05-09 20:49:11 852 1

原创 Java虚拟机进阶之路——类文件结构

如下图所示:常量池容量(偏移地址: 0x00000008) 为十六进制数0x0013,则十进制为19,由于0(0算一个值)空出来,则这里有18个长常量索引范围为1-18,在Class文件格式规范制定之时, 设计者将第0项常量空出来是有特殊考虑的, 这样做的目的在于, 如果后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义, 可以把索引值设置为0来表示。而虚拟机是怎么做到这些事情的呢?类型的数据,由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项。

2024-05-09 20:35:34 827 1

原创 Java虚拟机进阶之路——垃圾收集器及其选择策略、内存分配策略

垃圾收集器的选择策略以及jvm内存分配策略

2024-05-09 16:16:36 1026

原创 Java虚拟机进阶之路——内存回收与垃圾收集算法

关于jvm的垃圾回收和相关算法

2024-05-08 23:56:00 935 2

原创 Java虚拟机进阶之路——内存区域与内存溢出异常

(几乎所有不代表全部,如果一个对象确定不会在一个方法中发生逃逸的化,那么这个对象可以被分配在栈上,并且随着栈帧弹出而消亡,不需要GC)并且它是垃圾收集器管理的区域。类型,它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)、和returnAddress类型(粗略理解为返回值地址)。从内存分配的角度看,所有线程共享的Java堆可以划分为多个线程私有的分配缓冲区,此举目的是提升内存分配时的效率,并且能够提升垃圾回收效率,但要注意的是,

2024-05-07 22:26:09 549 1

空空如也

空空如也

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

TA关注的人

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