
后端
文章平均质量分 80
逐渐呆滞
黑奴
展开
-
Redis网络模型
当我们的客户端想要去连接我们服务器,会去先到IO多路复用模型去进行排队,会有一个连接应答处理器,他会去接受读请求,然后又把读请求注册到具体模型中去,此时这些建立起来的连接,如果是客户端请求处理器去进行执行命令时,他会去把数据读取出来,然后把数据放入到client中, clinet去解析当前的命令转化为redis认识的命令,接下来就开始处理这些命令,从redis中的command中找到这些命令,然后就真正的去操作对应的数据了,当数据操作完成后,会去找到命令回复处理器,再由他将数据写出。我们来梳理一下这张图。原创 2023-06-11 08:32:55 · 842 阅读 · 2 评论 -
Redis通信协议、过期回收策略
try {// 1.建立连接 String host = "服务器IP";// 2.获取输出流、输入流 writer = new PrintWriter(new OutputStreamWriter(s . getOutputStream() , StandardCharsets . UTF_8));// 3.发出请求 // 3.1.获取授权 auth 123321 sendRequest("用户名" , "密码");原创 2023-06-03 20:45:11 · 2586 阅读 · 2 评论 -
Redis数据结构——动态字符串、Dict、ZipList
我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:获取字符串长度的需要通过运算非二进制安全不可修改Redis构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称SDS。例如,我们执行命令:那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含“虎哥”的SDS。Redis是原创 2023-05-12 19:55:09 · 803 阅读 · 1 评论 -
ReentrantLock原理——公平锁与条件变量实现原理
每个条件变量其实就对应着一个等待队列,其实现类是 ConditionObject。原创 2023-04-09 08:20:15 · 171 阅读 · 0 评论 -
LinkedBlockingQueue原理
主要列举 LinkedBlockingQueue 与 ArrayBlockingQueue 的性能比较。Dummy 节点用来占位,item 为 null。高明之处在于用了两把锁和 dummy 节点。原创 2023-04-23 16:48:36 · 677 阅读 · 0 评论 -
Java8 ConcurrentHashMap源码解析
可以看到实现了懒惰初始化,在构造方法中仅仅计算了 table 的大小,以后在第一次使用时才会真正创建。原创 2023-04-15 20:15:05 · 463 阅读 · 0 评论 -
偏向锁撤销
1> 测试延迟特性2> 测试偏向锁利用 jol 第三方工具来查看对象头信息处于偏向锁的对象解锁后,线程 id 仍存储于对象头中。3> 测试禁用在上面测试代码运行时在添加 VM 参数 -XX:-UseBiasedLocking 禁用偏向锁。4> 测试 hashCode。原创 2023-03-11 16:20:20 · 689 阅读 · 0 评论 -
synchronized原理(轻量级,锁膨胀,自旋,偏向锁)
如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是。原创 2023-03-04 17:10:39 · 877 阅读 · 0 评论 -
对象分配策略
首先进入新生代的Eden区,此后要么是朝生夕死的对象,在某次Minor GC中被回收,要么在新生代中熬过15次Minor GC(默认晋级老年代的分代年龄阈值为15),当对象进入老年代后,就很难轻易被回收了。当然,总有对象死亡的一天,只是时间问题罢了。总体的流程就是这样,但细心的人会发现,文字所描述的过程跟图上有所差别,这里就不得不提一下JVM的动态对象年龄判定,和空间分配担保了。但在我们编码过程中,肯定不是所有的对象都会一直生存到最后,也会有一些特殊情况,而虚拟机也考虑到各种情况,也对其做出了应对。原创 2023-02-26 10:03:59 · 559 阅读 · 2 评论 -
CMS垃圾回收器
上述四个步骤中,初始标记和重新标记两个步骤会“Stop The Word”,也就是会暂停用户线程,如下图。CMS 的并发标记和并发清理阶段, 用户线程是还在继续运行的, 程序在运行自然就还会伴随有新。CMS无法处理浮动垃圾,CMS和用户线程并发运行期间预留的内存不够新对象分配,导致并发失败。的垃圾对象不断产生, 但这一部分垃圾对象是出现在标记过程结束以后,只能下次垃圾回收处理。并行:指多条垃圾收集器线程并行工作,此时用户线程处于等待状态。并发:指用户线程和垃圾回收线程同时工作(也可以交替工作)原创 2023-02-19 09:52:41 · 487 阅读 · 0 评论 -
对象的内存布局
HotSpot VM使用oop描述对象,oop字面意思是“普通对象指针”。它是指向一片内存的指针,只是将这片内存‘视作’(强制类型转换)Java对象/数组。对象的本质就是用对象头和字段数据填充这片内存。原创 2023-02-05 13:30:54 · 194 阅读 · 0 评论 -
String的不可变性
如果一个对象在创建之后就不能再改变它的状态,那么这个对象是不可变的(Immutable)。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型变量的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。原创 2023-01-15 14:37:04 · 363 阅读 · 0 评论 -
JVM方法区的内部结构
而Java 中的字节码需要数据支持,通常这种数据会很大以至于不能直接存到字节码里,换另一种方式,可以存到常量池,这个字节码包含了指向常量池的引用。如果代码多,应用到的结构会更多!常量池表(Constant Pool Table) 是 Class 文件的一部分,用于存放编译期生成的各种字面量与符号应用,这部分内容将在类加载后存放到方法区的运行时常量池中。当创建类或者接口的运行时常量池时,如果构造运行时常量池所需的内存空间超过了方法区所提供的最大值,则 JVM 会抛 OutOfMemoryError 异常。原创 2022-12-11 09:33:16 · 507 阅读 · 0 评论 -
MinorGC、MajorGC、FullGC
当我们学习到JVM堆时,我们避免不了与GC打交道,其中大家经常混淆Minor GC、Major GC、Full GC,年轻代GC、老年代GC,本篇主要介绍Minor GC、Major GC、Full GC的区别。JVM堆内存被分为年轻代(Young Generation)和老年代(Old Generation)还有永久代和元空间,jdk1.8之前称为永久代,1.8之后称为元空间。Minor GC1.年轻代年轻代是所有新对象产生的地方,当年轻代内存空间被用完时,就会触发垃圾回收,这个垃圾回收叫做Minor G原创 2022-12-04 15:28:21 · 292 阅读 · 0 评论 -
JVM栈帧
栈帧是栈中的一个栈元素,是一中用于帮助虚拟机执行方法调用与方法执行的数据结构,当前线程中,每执行一个方法就会往栈中插入一个栈帧。栈帧本身是一种数据结构,封装了方法的局部变量表、动态链接信息、方法返回地址(即返回到方法的调用者)以及操作数栈Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,换句话说,每个线程都会有一个栈,所以对于栈帧来说不存在并发调用的情况。原创 2022-11-27 10:17:26 · 373 阅读 · 0 评论 -
JVM运行时数据区域之PCRegister和虚拟机栈
如果线程正在执行的是一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;是完全由具体的虚拟机实现自行决定的事情。与程序计数器一样,Java 虚拟机栈(Java Virtual Machine Stack)也是线程私有的,长度的 long 和 double 类型的数据会占用两个变量槽,其余的数据类型只占用一个。Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据。拟机规范》的规定,Java 虚拟机所管理的内存将会包括以下几个运行时数据区域,如图。原创 2022-11-20 10:39:10 · 481 阅读 · 0 评论 -
实现延迟队列的几种途径
延时队列相比于普通队列最大的区别就体现在其延时的属性上,普通队列的元素是先进先出,按入队顺序进行处理,而延时队列中的元素在入队时会指定一个延迟时间,表示其希望能够在经过该指定时间后处理。从某种意义上来讲,延迟队列的结构并不像一个队列,而更像是一种以时间为权重的有序堆结构。原创 2022-11-13 08:51:54 · 2907 阅读 · 0 评论 -
线程安全的使用ArrayList和HashMap
如果你看过源码,那么你肯定知道ArrayList和HashMap是线程不安全的,它们二者都采用了fast-fail机制。但之前小组考核的时候,学长问了我如何线程安全的使用HashMap,那时候确实直接呆滞了,话不多说,那么如何线程安全的实现二者呢?原创 2022-11-05 21:32:25 · 428 阅读 · 0 评论 -
Java中的语法糖
语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。可能对于第一次听说语法糖的人来说,百度出来的简介并不能让你有一个比较清晰的认知,只知道是一种语法,并且是方便程序员的使用。那我换一种说法,Switch语句相信大家都有认知,类型泛型擦除也有一定的了解,那么为什么Java语言能做到呢?这就是语法糖的实现了。原创 2022-10-30 09:13:20 · 441 阅读 · 0 评论 -
横向越权与纵向越权
其原理是由于Web应用没有做权限控制,或仅仅在菜单上做了权限控制,导致恶意用户只要猜测其他管理页面的URL,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。对于一个请求,或者说一个接口,经常使用url拼接的方式去传递参数,如果攻击者在浏览的时候提前知悉了url的参数以及拼接顺序,那么他就可以在任意账号去随意执行你的接口。越权又分为横向越权和纵向越权。即预先定义不同的权限角色,为每个角色分配不同的权限,每个用户都属于特定的角色,横向越权指的是攻击者尝试访问与他拥有相同权限的用户的资源。原创 2022-10-23 14:20:30 · 5027 阅读 · 0 评论 -
ArrayList扩容机制
继Springsecurity后,框架的学习暂时告一段落,现在回过头来学习Java的一些源码有些许感悟。从学习编程语言开始,我们都是先学习了数组,之后才是集合。众所周知,数组在定义的时候,一般都需要定义数组的空间大小,而ArrayList集合却并不需要。之前也浑然不在意,直到后来听别人问我,为什么集合在引用的时候可以不去传入空间大小?我无言以对,那时候才知道了ArrayList的自动扩充这个概念。原创 2022-10-09 10:50:17 · 1373 阅读 · 1 评论