<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[TiankkTT的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/TiankkTT</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; TiankkTT]]></copyright><item><title><![CDATA[Redis网络模型]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/131149697</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/131149697</guid><author>TiankkTT</author><pubDate>Sun, 11 Jun 2023 08:32:55 +0800</pubDate><description><![CDATA[当我们的客户端想要去连接我们服务器，会去先到IO多路复用模型去进行排队，会有一个连接应答处理器，他会去接受读请求，然后又把读请求注册到具体模型中去，此时这些建立起来的连接，如果是客户端请求处理器去进行执行命令时，他会去把数据读取出来，然后把数据放入到client中， clinet去解析当前的命令转化为redis认识的命令，接下来就开始处理这些命令，从redis中的command中找到这些命令，然后就真正的去操作对应的数据了，当数据操作完成后，会去找到命令回复处理器，再由他将数据写出。我们来梳理一下这张图。]]></description><category></category></item><item><title><![CDATA[Redis通信协议、过期回收策略]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/131025438</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/131025438</guid><author>TiankkTT</author><pubDate>Sat, 03 Jun 2023 20:45:11 +0800</pubDate><description><![CDATA[try {// 1.建立连接 String host = "服务器IP";// 2.获取输出流、输入流 writer = new PrintWriter(new OutputStreamWriter(s . getOutputStream() , StandardCharsets . UTF_8));// 3.发出请求 // 3.1.获取授权 auth 123321 sendRequest("用户名" , "密码");]]></description><category></category></item><item><title><![CDATA[Redis五大基本数据结构（原理）]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/130909267</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/130909267</guid><author>TiankkTT</author><pubDate>Sun, 28 May 2023 09:01:00 +0800</pubDate><description><![CDATA[对⼀个内部表示成long型的string执行append, setbit, getrange这些命令，针对的仍然是string的值（即⼗进制表示的字符串），而不是针对内部表⽰的long型进⾏操作。因此，在这些命令的实现中，会把long型先转成字符串再进行相应的操作。String的内部存储结构⼀般是sds（Simple Dynamic String，可以动态扩展内存），但是如果⼀个String类型的value的值是数字，那么Redis内部会把它转成long类型来存储，从⽽减少内存的使用。]]></description><category></category></item><item><title><![CDATA[Redis数据结构——QuickList、SkipList、RedisObjective]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/130788567</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/130788567</guid><author>TiankkTT</author><pubDate>Sun, 21 May 2023 08:36:22 +0800</pubDate><description><![CDATA[是一个节点为ZipList的双端链表。节点采用ZipList，解决了传统链表的内存占用问题。控制了ZipList大小，解决连续内存空间申请效率问题。中间节点可以压缩，进一步节省了内存。跳跃表是一个双向链表，每个节点都包含score和ele值。节点按照score值排序，score值一样则按照ele字典排序。每个节点都可以包含多层指针，层数是1到32之间的随机数。不同层指针到下一个节点的跨度不同，层级越高，跨度越大。增删改查效率与红黑树基本一致，实现却更简单。]]></description><category></category></item><item><title><![CDATA[Redis数据结构——动态字符串、Dict、ZipList]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/130649100</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/130649100</guid><author>TiankkTT</author><pubDate>Fri, 12 May 2023 19:55:09 +0800</pubDate><description><![CDATA[我们都知道Redis中保存的Key是字符串，value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过Redis没有直接使用C语言中的字符串，因为C语言字符串存在很多问题：
获取字符串长度的需要通过运算
非二进制安全
不可修改
Redis构建了一种新的字符串结构，称为简单动态字符串（Simple Dynamic String），简称SDS。
例如，我们执行命令：那么Redis将在底层创建两个SDS，其中一个是包含“name”的SDS，另一个是包含“虎哥”的SDS。Redis是]]></description><category></category></item><item><title><![CDATA[JAVA模拟堆]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/130529616</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/130529616</guid><author>TiankkTT</author><pubDate>Sat, 06 May 2023 16:05:13 +0800</pubDate><description><![CDATA[/存放堆中的数据 static int [ ] ph;//存放第k个插入点的下标 static int [ ] hp;//存放堆中点的插入次序 static int size;//存放堆中数据个数堆虽然是一种树，但在堆的存储中，通常使用数组存储。这是因为数组在从下标1开始存储值的时候，假设树根root为n，那么它的左子树为2n，右子树为2n+1。]]></description><category></category></item><item><title><![CDATA[LinkedBlockingQueue原理]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/130325218</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/130325218</guid><author>TiankkTT</author><pubDate>Sun, 23 Apr 2023 16:48:36 +0800</pubDate><description><![CDATA[主要列举 LinkedBlockingQueue 与 ArrayBlockingQueue 的性能比较。Dummy 节点用来占位，item 为 null。高明之处在于用了两把锁和 dummy 节点。]]></description><category></category></item><item><title><![CDATA[Java8 ConcurrentHashMap源码解析]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/130174614</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/130174614</guid><author>TiankkTT</author><pubDate>Sat, 15 Apr 2023 20:15:05 +0800</pubDate><description><![CDATA[可以看到实现了懒惰初始化，在构造方法中仅仅计算了 table 的大小，以后在第一次使用时才会真正创建。]]></description><category></category></item><item><title><![CDATA[ReentrantLock原理——公平锁与条件变量实现原理]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/130037867</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/130037867</guid><author>TiankkTT</author><pubDate>Sun, 09 Apr 2023 08:20:15 +0800</pubDate><description><![CDATA[每个条件变量其实就对应着一个等待队列，其实现类是 ConditionObject。]]></description><category></category></item><item><title><![CDATA[ReentrantLock原理--非公平锁、可重入、可打断性]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/129902140</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/129902140</guid><author>TiankkTT</author><pubDate>Sat, 01 Apr 2023 20:08:18 +0800</pubDate><description><![CDATA[先从构造器开始看，默认为非公平锁实现NonfairSync 继承自 AQS没有竞争时第一个竞争出现时Thread-1 执行了CAS 尝试将 state 由 0 改为 1，结果失败进入 tryAcquire 逻辑，这时 state 已经是1，结果仍然失败接下来进入 addWaiter 逻辑，构造 Node 队列图中黄色三角表示该 Node 的 waitStatus 状态，其中 0 为默认正常状态Node 的创建是懒惰的。]]></description><category></category></item><item><title><![CDATA[Java并发之AQS原理]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/129771352</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/129771352</guid><author>TiankkTT</author><pubDate>Sat, 25 Mar 2023 19:51:54 +0800</pubDate><description><![CDATA[全称是 AbstractQueuedSynchronizer，是阻塞式锁和相关的同步器工具的框架。特点：用 state 属性来表示资源的状态（分独占模式和共享模式），子类需要定义如何维护这个状态，控制如何获取锁和释放锁。]]></description><category></category></item><item><title><![CDATA[自定义线程池以及异步模式之工作线程]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/129641761</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/129641761</guid><author>TiankkTT</author><pubDate>Sat, 18 Mar 2023 19:55:50 +0800</pubDate><description><![CDATA[对于线程池ExecutorService的实现，学过JUC的都不会陌生，那么怎样去定义一个线程池呢？或者说怎样去实现一个线程池呢？这个问题相信很多人都没有想过。简单来说，线程池就是一个线程集合去处理一个工作阻塞队列中的任务，处理一个出队一个，下面就简单实现一个线程池。第一步：自定义拒绝策略接口@FunctionalInterface // 拒绝策略 interface RejectPolicy < T > {第二步：自定义任务队列。]]></description><category></category></item><item><title><![CDATA[偏向锁撤销]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/129465079</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/129465079</guid><author>TiankkTT</author><pubDate>Sat, 11 Mar 2023 16:20:20 +0800</pubDate><description><![CDATA[1> 测试延迟特性2> 测试偏向锁利用 jol 第三方工具来查看对象头信息处于偏向锁的对象解锁后，线程 id 仍存储于对象头中。3> 测试禁用在上面测试代码运行时在添加 VM 参数 -XX:-UseBiasedLocking 禁用偏向锁。4> 测试 hashCode。]]></description><category></category></item><item><title><![CDATA[synchronized原理（轻量级，锁膨胀，自旋，偏向锁）]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/129336663</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/129336663</guid><author>TiankkTT</author><pubDate>Sat, 04 Mar 2023 17:10:39 +0800</pubDate><description><![CDATA[如果一个对象虽然有多线程要加锁，但加锁的时间是错开的（也就是没有竞争），那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的，即语法仍然是。]]></description><category></category></item><item><title><![CDATA[对象分配策略]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/129223773</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/129223773</guid><author>TiankkTT</author><pubDate>Sun, 26 Feb 2023 10:03:59 +0800</pubDate><description><![CDATA[首先进入新生代的Eden区，此后要么是朝生夕死的对象，在某次Minor GC中被回收，要么在新生代中熬过15次Minor GC（默认晋级老年代的分代年龄阈值为15），当对象进入老年代后，就很难轻易被回收了。当然，总有对象死亡的一天，只是时间问题罢了。总体的流程就是这样，但细心的人会发现，文字所描述的过程跟图上有所差别，这里就不得不提一下JVM的动态对象年龄判定，和空间分配担保了。但在我们编码过程中，肯定不是所有的对象都会一直生存到最后，也会有一些特殊情况，而虚拟机也考虑到各种情况，也对其做出了应对。]]></description><category></category></item><item><title><![CDATA[CMS垃圾回收器]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/129107782</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/129107782</guid><author>TiankkTT</author><pubDate>Sun, 19 Feb 2023 09:52:41 +0800</pubDate><description><![CDATA[上述四个步骤中，初始标记和重新标记两个步骤会“Stop The Word”，也就是会暂停用户线程，如下图。CMS 的并发标记和并发清理阶段， 用户线程是还在继续运行的， 程序在运行自然就还会伴随有新。CMS无法处理浮动垃圾，CMS和用户线程并发运行期间预留的内存不够新对象分配，导致并发失败。的垃圾对象不断产生， 但这一部分垃圾对象是出现在标记过程结束以后，只能下次垃圾回收处理。并行：指多条垃圾收集器线程并行工作，此时用户线程处于等待状态。并发：指用户线程和垃圾回收线程同时工作（也可以交替工作）]]></description><category></category></item><item><title><![CDATA[对象的内存布局]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/128889949</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/128889949</guid><author>TiankkTT</author><pubDate>Sun, 05 Feb 2023 13:30:54 +0800</pubDate><description><![CDATA[HotSpot VM使用oop描述对象，oop字面意思是“普通对象指针”。它是指向一片内存的指针，只是将这片内存‘视作’（强制类型转换）Java对象/数组。对象的本质就是用对象头和字段数据填充这片内存。]]></description><category></category></item><item><title><![CDATA[String的不可变性]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/128694326</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/128694326</guid><author>TiankkTT</author><pubDate>Sun, 15 Jan 2023 14:37:04 +0800</pubDate><description><![CDATA[如果一个对象在创建之后就不能再改变它的状态，那么这个对象是不可变的（Immutable）。不能改变状态的意思是，不能改变对象内的成员变量，包括基本数据类型变量的值不能改变，引用类型的变量不能指向其他的对象，引用类型指向的对象的状态也不能改变。]]></description><category></category></item><item><title><![CDATA[JVM方法区的内部结构]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/128271774</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/128271774</guid><author>TiankkTT</author><pubDate>Sun, 11 Dec 2022 09:33:16 +0800</pubDate><description><![CDATA[而Java 中的字节码需要数据支持，通常这种数据会很大以至于不能直接存到字节码里，换另一种方式，可以存到常量池，这个字节码包含了指向常量池的引用。如果代码多，应用到的结构会更多！常量池表（Constant Pool Table) 是 Class 文件的一部分，用于存放编译期生成的各种字面量与符号应用，这部分内容将在类加载后存放到方法区的运行时常量池中。当创建类或者接口的运行时常量池时，如果构造运行时常量池所需的内存空间超过了方法区所提供的最大值，则 JVM 会抛 OutOfMemoryError 异常。]]></description><category></category></item><item><title><![CDATA[MinorGC、MajorGC、FullGC]]></title><link>https://blog.youkuaiyun.com/TiankkTT/article/details/128173138</link><guid>https://blog.youkuaiyun.com/TiankkTT/article/details/128173138</guid><author>TiankkTT</author><pubDate>Sun, 04 Dec 2022 15:28:21 +0800</pubDate><description><![CDATA[当我们学习到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]]></description><category></category></item></channel></rss>