Logback使用自定义的MDCAdapter Logback默认的MDCAdapter不支持父子线程传递,而使用TTL线程给MDC put则会产生清理的难题。所以要覆盖Logback的MDC Adapter。
如何做性能优化 之前也做了几次的性能优化,每次的过程好像大体上都差不多,所以就此总结一下。如果有哪里不到位的地方,欢迎及时指正。性能优化的过程,我认为可以分为三个阶段:收集监控信息和资料确定改进措施,验证及调整总结最佳实践这里我们主要对前两个部分进行展开。收集监控信息和资料监控信息无论在什么领域,监控都是流程中优化的关键。我们需要从上层下层的顺序去监控,采集到我们需要的信息,然后才能进行优化。应用层本层需要观察到优化的方法每一步的时间,从而逐个击破地进行优化。需要固定的监控点位置有三种:API
TCP的三次握手和四次挥手 TCP的三次握手和四次挥手为什么需要三次握手呢?我们从图中分析 一下:发送端发送SYN,接收端确认自己接收正常,对方发送正常接收端发送SYN/ACK,发送端确认自己接收正常,对方发送正常。发送端发送ACK来建立链接,发送端和接收端都进入Established的状态。如果不是三次握手会怎么样?没有第三步的情况,会出现接收端不知道自己的ACK有没有发送正常,无法进入数据传输阶段。四次挥手从三次握手也会比较容易懂:发送端发送完了数据,想要关闭链接,于是发一下FIN。接收端收到FIN之
Guava Cache缓存机制说明 在日常使用本地缓存的时候,我们经常会选择GuavaCache,使用起来很方便。不过也会有一些疑惑,主要的疑问点有:如何实现的LRU缓存, LFU又是如何实现的单个key失效大量请求会造成雪崩吗失效key的处理是怎么样的Cache命中率查看那么接下来就让我们一起来看看吧。LRU缓存是如何实现的一切我们从CacheBuilder看起,因为这个类是我们经常用来构建GuavaCache的入口。public <K1 extends K, V1 extends V> Cache<.
Testable-Mock增强之路 最近我们又在热火朝天的搞起来了单元测试。但谈到单元测试,总是不可避免的涉及到Mock,如何方便地Mock,是一个很大的难题。之所以会是这样的原因,主要是因为Mock的时候希望尽量不侵入原有代码,而且可以任意对部分,包括私有方法进行Mock。在比较工具之后,我选择了最近火热的testable-mock框架,但是在使用的过程发现如果我想进行流程测试,并不是一个测试类对应一个被测类,这样的方式去Mock,有没有办法去增强一下呢? 我们定义一个全局的类,将我们依赖RPC Mock进去,并且支持数据模板的配置
字节码增强总结 经常遇见字节码就懵逼,ASM, CGLIB, Instrument, Aspect, Spring AOP这些都是啥关系,有什么作用。今天就让我们来试着总结一下。一切还要从Instrument讲起Instrument是JVM提供的一个可以修改已加载类的类库,专门为Java语言编写的插桩服务提供支持。在JDK 1.6以前,instrument只能在JVM刚启动类时生效,而在JDK 1.6之后,instrument支持在运行时对类定义的修改。我们看一下instrument的类库都包括什么:Instrum
如何把算法讲明白 在高中的时候发现自己的数学还可以,但是大学之后就不太行了,包括后来学习算法或者给人讲一个普通的算法时候也会很难让人理解和明白。所以自己在想的是,如何将算法或者数学讲明白。理清本质算法的定义:In mathematics and computer science, an algorithm (/ˈælɡərɪðəm/ (About this soundlisten)) is a finite sequence of well-defined, computer-implementable instru
RingBuffer vs Netty零拷贝 为什么会将这两个放在一起原因是这两个缓存比较都是高性能,也比较容易联想到一起,容易搞混。RingBuffer的原理RingBuffer是Disruptor的核心组件,是一个高性能的队列。那么谈到队列,那么首先想到的就会是创建线程池使用的ArrayBlockingQueue和LinkedBlockingQueue。那么这两个有什么缺点呢? 通过阅读代码我们可以得知,ArrayBlockingQueue内部结构是数组,线程安全使用的锁,LinkedBlockingQueue的内部结构是双向链表,线程
JVM Remembered Set图解 为什么要有Remembered Set?因为在JVM的分代收集器里,会存在老年代引用年轻代的情况,这样YGC的时候就必须扫描老年代,这样岂不是编程了FULL GC?所以前人就想了一个办法,精细化管理。将老年代进行分页,就像操作系统的分页一样。当老年代指向年轻代的时候,就把对应的区域更新成脏页,需要进行扫描。有了存储的地方了,怎么写呢?具体的机制是写屏障,但这里的名字也和其他的有重合。这里可以理解为当更新对象的reference时,就像AOP一样,会更新Remembered Set。结构分析Rem
ThreadLocal存储、泄露、TTL线程传递详解 为什么要有ThreadLocal我们知道Java线程的出现是为了共享资源,但在线程运行的过程中,他们也希望能够独享某些资源。ThreadLocal结构和内存泄露分析这里其实有点难以理解。这里来说一下要点。每个Thread有自己的属性threadLocals,是ThreadLocalMap类型ThreadLocalMap是一个EntryTable,Entry拥有对threadlocal的弱引用和valueThreadLocal的实例对象拥有两个引用,一个是它本身的强引用ThreadLocalR
CPU高速缓存原理梳理 为什么要用CPU高速缓存?原因本质是局部性原理,体现在两个方面。时间局部性: 如果一个信息最近被访问,那么很可能会被再次访问空间局部性: 如果一个地址被读取,那么它临近的地址也很可能会被访问。所以相当于我们从时间上缓存了将要执行的指令,从空间上我们缓存将要读取的数据来加速性能。当然速度上肯定是,寄存器>高速缓存>主内存为什么多级呢?我们知道CPU通常都是三级缓存,L1,L2,L3。我们如果想的话,如果性能和成本都足够的话,那么一级就行了。所以还是资本的原因,精细化管理
Collection集合介绍 Collection从接口上一共包括了三种数据结构,Set,List,Map关键点介绍:HashSet是依赖于HashMap实现的,值是固定的LinkedHashSet是继承了HashSet,使用HashSet的构造函数,通过无意义的参数区分,使用的是LinkedHashMapTreeSet是有序唯一的集合,红黑树结构ArrayList内部是Object[]集合LinkedList是双向链表LinkedHashMap保存了一个双向链表。Linked会保证遍历时候的顺序,不过大多数场景都是没
ConcurrentHashMap 1.7和1.8结构图解 在1.7中使用锁的方法是ReetrantLock.在1.8如果数数组元素是不加锁,使用的是UnSafe的compareAndSet方法,如果非数组元素,那么就会使用Synchronized关键字进行加锁。
线程池原理简单解析 记得在4年前面试的时候,在追问为什么要用线程池呢?很简单的回答了因为线程池不用重复创建线程,重复创建线程是一个比较对性能有影响的动作。那么线程池的原理是什么呢? 这个问题一直没问题,今天就简单总结一下。总的结构无论是使用Executors还是Guava的ThreadFactory去构建线程池,都构建的是ThreadPoolExecutor,所以这个就是我们这次分析的目标。ctl变量首先不得不提一个神奇的变量ctl,这里我们简单理解它包含了两个部分: 线程池状态前3位和线程池worker数量。可以参见
JVM架构及内存模型详解 JVM架构及内存模型详解JVM内存架构JVM架构主要分成了三个部分:JVM内存模型,主要包括了方法区、堆、虚拟机栈、程序计数器、本地方法栈。在下面进行展开。执行引擎,包括最核心的解释器和GC垃圾回收器,还包括了JIT编译器。本地方法接口和库JVM内存模型这里我们将结合着第二张图一起来看。方法区在JVM的规范里是存储一些常量的区域,主要是类常量。因为运行时也可以产生常量,比如我们最常用的String,所还包括了Runtime Constant Pool。最后它还包括了Code Cac
Spring boot `@Configuration` 和`@AutoConfiguration`的顺序研究 背景最近在实现一个功能,AutoConfiguration如果发现应用project定义了就不再生成。工程目录结构如下: monitor是要deploy的工具包,demo是测试的module.Root -- demo -- monitor在demo Module中代码如下:package com.xxx.yyy.config;public class ProjectConfig { @Bean public XXX config() { return new XXX();
商品系统设计(四) - 架构设计 商品系统架构上面主要讲了一些商品系统的设计,接下来我们从大的方面来讲一下商品系统应该如何架构。首先商品从业务上可以区分成,类目管理模块和商品模块。商品模块又细分为写管理模块和读管理模块。写管理模块负责商品的写入、搜索,主要运营端的管理,读模块主要负责提供高性能强一致性的读服务。下面分别展开来讲这两个模块。写管理模块架构我们在设计架构的时候,通常会涉及到应用架构,数据架构,技术架构等三个部分。这里我们再根据时间顺序,分为代码架构,数据架构,部署架构,运维架构。代码架构以DDD的思想触发,单位职
商品系统设计(三) - Saas化的商品系统 多商家的商品系统某天早上小A很兴奋地说到,有几个我的朋友商家都觉得我们的app用起来很棒,那么我们有没有办法让他们也使用呢?小D想了想,好像有点难。因为这次的功能不是一个点而是一个面,所以需要考虑一下。小A说,好的。D哥尽快给我答复啊小D过了一天和小A确认说,是不是只要用我们的app就可以,其他的都按照我们的操作流程来做?小A说,前期肯定是这样的,毕竟也没有个性化的要求。小D说,好的,那好办。多商家的商品系统,最基础也是最本质的就是数据隔离。多个商家互不影响。用例图也是很简单,把所有的功能都