自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Netty源码之jemalloc4内存分配(4.1.58)

Netty源码之jemalloc4内存分配(4.1.58)概述在讲 jemalloc4 算法之前,我们先回顾 jemalloc3 内存分配算法: Netty 使用一棵满二叉树管理不同规格的内存块,可将用户申请的内存大小划分四个级别,分别是 Tiny、Small、Normal 和 Huge,根据不同规格采取不同的分配策略。重新回顾 jemalloc3 内存规格图:在分配内存之前,需要对用户申请的大小进行规格化处理并得到规格值。对于 Normal 级别,它是 PageSize(默认值: 8192By

2021-02-03 15:25:50 1588 3

原创 Netty源码之SizeClasses(4.1.58)

Netty源码之SizeClasses(4.1.58)概述前面已对 Netty 使用 jemalloc3(jemalloc3、jemalloc4 指代 Netty 实现的 Java 版本,而非 C) 实现的内存分配的思路以及源码进行详解,接下来的这两篇是详解 Netty 基于 jemalloc4 重构内存分配的思想以及源码。jemalloc4 相较于 jemalloc3 最大的提升是进一步优化内存碎片问题,因为在 jemalloc3 中最多可能会导致 50% 内存碎片,但 jemalloc4 通过划分

2021-02-03 15:13:56 656

原创 Netty源码之对象池

Netty源码之对象池概述池化是我们提升性能的手段之一,比如线程池、内存池以及接下来讲的对象池。池化的作用目的是减少创建和销毁对象的开销,提高并发处理能力,而且利用池化也可以降低 GC 压力。Netty 设计了一个简易的对象池,在 Netty 内存使用广泛,比如对 PooledUnsafeDirectByteBuf 对象进行池化、比如对 io.netty.buffer.PoolThreadCache.MemoryRegionCache.Entry 对象(这个对象用于本地缓存封装内存块信息)进行池化。并不

2021-01-28 20:03:52 722 1

原创 Netty源码之内存管理(三)(4.1.44)

Netty源码之内存管理(三)(4.1.44)概述这是我们解读 Netty 内存管理的第三篇文章,前面两篇重点介绍了 ByteBuf 对象以及内存的分配和管理。比如利用分治思想创建多个 PoolArena 提供内存分配的能力、使用满二叉树数据结构管理内存的分配和回收等。但还有一个重要的东西我们没有讲,就是 jemalloc 从 tcmalloc 借鉴的本地线程缓存思想,这一篇就结合源码讲解 Netty 是如何利用本地线程缓存进一步提升 Netty 内存分配效率。内存分配入口回顾与池化内存分配的入口对

2021-01-28 18:10:46 432

原创 Netty源码之FastThreadLocalThread(4.1.44)

Netty源码之FastThreadLocalThread(4.1.44)概述我们都知道,Java 的 ThreadLocal 用在多线程环境下,提供一种访问某个变量的特殊方式,具体可看Java核心技术之ThreadLocal。由于 ThreadLocal 是在空间和时间之间寻求平衡,较好兼顾时间和性能。但是,Netty 通过理解 ThreadLocal 使用场景,觉得时间至上,最后利用空间换时间的思想重新设置了新的 FastThreadLocal,并配套实现了 FastThreadLocalThrea

2021-01-25 12:43:54 556

原创 Java核心技术之ThreadLocal

Java核心技术之ThreadLocal概述ThreadLocal 提供一种访问某个变量的特殊方式: 访问到的变量属于当前线程,它保证每个线程的变量相互隔离,而同一个线程在任何时候、任何地点都能获取属于本线程的变量。如果要使用 ThreadLocal,通常定义为 private statis 类型。ThreadLocal 适用在多线程的场景范围。ThreadLocal 用途可总结为两点:保存线程上下文信息,在任意时刻、任意地点可以获取安全的变量值。线程安全,不需要额外的锁保证变量的一致性。T

2021-01-24 18:46:52 291 1

原创 Netty源码之内存管理(二)(4.1.44)

Netty源码之内存管理(二)(4.1.44)前面做了很多铺垫(Netty源码之内存管理(一)),带着大家熟悉了与内存分配相关的类的定义和分配逻辑。但并没有真正落实到 jemalloc 思想在源码是如何体现的。本章就是对 PoolChunk 逐字解析,死扣细节。在分析源码之前我们需要对分配的内存级别有一个清晰的定位,当分配 Huge 级别对象,直接使用 PoolChunk 包装,并没有复杂的分配逻辑。而对于 tiny&small&normal 级别来说,进行精细化的内存管理十分有必要的。

2021-01-22 19:51:25 491

原创 Netty源码之内存管理(一)(4.1.44 )

Netty源码之内存管理(一)(4.1.44 )Netty 作为一款高性能的网络应用程序框架,拥有自己的内存分配。其思想源于 jemalloc github ,可以说是 jemalloc 的 Java 版本。本章源码基于 Netty 4.1.44 版本,该版本是采用 jemalloc3.x 的算法思想,而 4.1.45 以后的版本则基于 jemalloc4.x 算法进行重构,两者差别还是挺大的。高性能内存分配jemalloc 是由 Jason Evans 在 FreeBSD 项目中引入的新一代内存

2021-01-21 20:27:20 1033

原创 Netty源码之ByteBuf(4.1.44)

Netty源码之ByteBuf(4.1.44)Netty 抛弃了 Java NIO 的 ByteBuffer,因为它功能有限且使用过于复杂。于是乎,Netty 自己弄出了一个类似 ByteBuffer 的数据容器,称之为 ByteBuf,并且提供很多非常酷的特性:容量可按需动态扩展。读写采用不同的指针,并随意切换,不需要用户额外调用 flip() 切换读写模式。通过内置的复合缓冲类型实现零拷贝技术。支持引用计数。支持缓存池。类型丰富,支持堆外内存和堆内内存。继承关系图图中所框选的是在

2021-01-20 12:05:35 498

原创 Java核心技术之日志实现框架 Logback

Java核心技术之日志实现框架 Logback官方文档一、选择 LogBack 原因执行效率更高经过大量的测试与 SLF4J 配合使用零开销文档齐全使用 XML 或 Groovy 配置文件配置文件自动重新加载从 I/O 失败中优雅地恢复通过配置可以自动删除旧日志文档日志压缩过滤器…二、最简使用教程Step1 - 添加依赖<!--SLF4J--><dependency> <groupId>org.slf4j</group

2020-08-31 12:49:25 394

原创 Spring源码阅读之类型转换

Spring源码阅读之类型转换一、Spring 类型转换实现基于 JavaBeans 接口的类型转换器实现基于 java.beans.PropertyEditor 接口扩展Spring 3.0+ 通用类型转换实现Spring 3.0 引入 core.convert 包,它提供了一个通用的类型转换系统。这个系统定义了一个用于类型转换逻辑的 SPI(Service Provider Interface,服务发现机制) SPI和一个用于在运行时执行类型转换的 API 。在Spring容器中

2020-08-26 13:20:41 326

原创 Spring源码阅读之解析@Autowired

Spring源码阅读之@Autowired一、导读@Autowired 属于依赖注入中 字段注入 ,主要使用相关注入注入想要的依赖。 字段注入包 包含如下注解:@Autowired@Resource(由CommonAnnotationBeanPostProcessor解析)@Inject(需要引入单独的Jar包)这里解析 @Autowired ,其它两个注解解析步骤类型,只不过由不同的类完成该解析动作。下面解析Spring如何完成 @Autowired 自动注入的。大致分为三个步骤,分别是

2020-08-18 09:39:48 349

原创 Spring源码阅读之解析Spring配置类(@Configuration)

Spring源码阅读之解析配置类一、前置知识打印JDK和CGLib动态代理类。1. Main方法添加代码:System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\class");2. IDEA添加如下代码-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true3. 检验配置是否成功二、简单使用CGLib![](https://imgconvert.csdni

2020-08-17 12:50:51 320

原创 SpringDoc阅读(Chapter1)-Spring IoC容器

SpringDoc阅读之Chapter1-Spring IoC容器1.1 Spring IoC 容器、Beans相关介绍IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies (that is, the other objects they work with) only through constructor arguments, argume

2020-07-23 10:16:22 814

原创 Spring源码阅读之循环依赖

一、前言Spring循环依赖是面试考点之一。面试官可以深挖面试者对Spring关于Bean的生命周期掌握情况。Spring循环依赖也是Spring难点之一,逻辑比较绕,需要对Spring Bean的生命周期了如指掌。二、什么是循环依赖?简单,就是A对象依赖了B对象,B对象依赖了A对象。@Componentpublic class A { @Autowired B b;}@Componentpublic class B { @Autowired A a;}三、Spring是如

2020-07-10 20:11:03 269

原创 2020年7月2日 记

2020年7月2日 记之前定的半个月看完设计模式已经完成了,实际用时一个月的时间,最后剩下的是一点收尾工作(笔记整理以及加入个人思考)。整个文章大量借鉴书籍Head First 设计模式、图解设计模式、及王争的设计模式之美。接下来需要做的是不断思考与总结,集设计思想之大成并运用到工作中去。最初的想法是一步一步完善个人的基础知识,包含软件设计及硬件结构,以及让人色变的算法。我也相信,只要坚持做对的事情,一步一个脚印,当3年5年你会发现,你已经领先别人不止一点半点。接下来的学习任务计划用3个月的时间通读S

2020-07-02 10:47:51 182

原创 设计模式之组合模式

组合模式定义将一组对象组织(Compose)成树形结构,以表示一种“部分 - 整体”的层次结构。组合让客户端(在很多设计模式书籍中,“客户端”代指代码的使用者。)可以统一单个对象和组合对象的处理逻辑。组合模式允许你将对象组合成树形结构来表现整体/部分 层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。类图总结组合模式的设计思路,与其说是一种设计模式,倒不如说是对业务场

2020-06-29 10:30:36 5121

原创 设计模式之享元模式

享元模式定义所谓享元,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。在内存中只保留一份实例,供多处代码引用。实现1. 定义享元类/** * 享元类 * 这里定义的字段都是可以复用的 */public class ChessPieceUnit { private int id; private String text; private Color color; public ChessPieceUnit(int

2020-06-29 10:15:24 122

原创 设计模式之解释器模式

解释器模式解释器模式更加小众,只在一些特定的领域会被用到,比如编译器、规则引擎、正则表达式。它的代码实现的核心思想,就是将语法解析的工作拆分到各个小类中,以此来避免大而全的解析类。一般的做法是,将语法规则拆分成一些小的独立的单元,然后对每个单元进行解析,最终合并为对整个语法规则的解析。定义解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。实现基于解析器模式的自定义告警规则功能。1. 定义表达式接口/** * 定义表达式解析模板 */public i

2020-06-29 09:40:31 171

原创 备忘录模式

备忘录模式定义在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。这个模式的定义主要表达了两部分内容。一部分是,存储副本以便后期恢复。这一部分很好理解。另一部分是,要在不违背封装原则的前提下,进行对象的备份和恢复。模式建议将对象状态的副本存储在一个名为备忘录 (Memento) 的特殊对象中。 除了创建备忘录的对象外, 任何对象都不能访问备忘录的内容。 其他对象必须使用受限接口与备忘录进行交互, 它们可以获取快照的元数据 (创建时间和操作名

2020-06-29 08:42:41 4459

原创 设计模式之访问者模式

访问者模式由于它难理解、难实现。应用它会导致代码的可读性、可维护性变差,所以在开发中很少被用到。定义允许一个或者多个操作应用到一组对象上,解耦操作和对象本身。类图实现1. 定义Visitorpublic interface Visitor { void visit(PdfFile pdfFile); void visit(WordFile wordFile);}2. 定义Visitor实现类public class Compressor implements

2020-06-28 20:05:24 119

原创 设计模式之中介者模式

中介者模式定义中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。如航空管制。为了让飞机在飞行的时候不互相干扰,需要时刻与其他飞机进行通信。这时,我们引入塔台这样一个中介,让每架飞机只根塔台来通信,发送自己位置给塔台,由塔台来负责每回飞机的航线调度,这样就大大简化了通信网络。类图总结中介模式也是为了解耦对象之间的交互,所有的参与者都只与中介进行交互。而观察者模式中的消息队列,就有点类似中介模式中的“中介”,

2020-06-28 18:42:42 191

原创 设计模式之桥接模式

桥接模式定义桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。将抽象和实现解耦,让它们可以独立变化。一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。JDBC是桥接模式典型应用。类图实现抽象对象控制程序的外观, 并将真实工作委派给连入的实现对象。 不同的实现只要遵循相同的接口就可以互换, 使同一 GUI 可在 Windows 和 Linux 下运行。

2020-06-28 12:49:42 144 1

原创 设计模式之原型模式

原型模式定义如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。类图实现1. 浅拷贝@Datapublic class SearchWords implements Cloneable{ String keyWorld;

2020-06-28 12:23:57 114

原创 设计模式之职责链模式

职责链模式定义将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。多个处理器依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理完后传递给C,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责。职责链模式实现有多种。类图实现实现一个敏感词过滤。1. 定义过滤算法接口public interface SensitiveWordFilter {

2020-06-23 21:00:24 172

原创 设计模式之建造者模式

建造者模式定义建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。实现public class ResourcePoolConfig { private String name; private int maxTotal; private int maxIdle; p

2020-06-23 19:29:14 98

原创 设计模式之代理模式

代理模式定义代理模式为另一个对象提供一个替身或占位符以控制对这个对象访问。代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式。所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。著名的代理模式例子为引用计数(英语:reference counting)指针对象。当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会

2020-06-23 09:16:44 129

原创 设计模式之状态模式

状态模式定义有限状态机状态存储关于过去的信息,就是说:它反映从系统开始到现在时刻的输入变化。转移指示状态变更,并且用必须满足确使转移发生的条件来描述它。动作是在给定时刻要进行的活动的描述。有多种类型的动作:进入动作(entry action):在进入状态时进行退出动作(exit action):在退出状态时进行输入动作:依赖于当前状态和输入条件进行转移动作:在进行特定转移时进行FSM(有限状态机)可以使用上面图1那样的状态图(或状态转移图)来表示。此外可以使用多种类型的状态转移表。下面

2020-06-21 16:21:58 285

原创 设计模式之命令模式

命令模式定义命令模式将请求封装成对象,以便使用不同的请求、队列或日志来参数化其他对象。命令模式也支持可撤销的操作。一个命令对象通过在特定接收者上绑定一组动作来封装一个请求。要达到这一点,命令对象将动作和接收者包进对象。这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。从外面看,其他对象不知道空间哪个接收者进行了哪些动作,只知道如果调用了execute()方法,请求的目的就能达到。类图实现1. 定义Command接口/** * 命令定义 */pu

2020-06-20 19:03:47 136

原创 设计模式之迭代器模式

迭代器模式定义迭代器模式Iterator Design Pattern也叫游标模式Cursor Design Pattern。用来遍历集合对象(如数组、链表、树、图、跳表)。迭代器模式将集合对象的遍历操作从集合类中拆分出来,让两者的职责更加单一。迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。类图实现1. 定义迭代器接口public interface MyIterator<E> { /** * 判断是否有下一个元素

2020-06-19 09:32:28 132

原创 设计模式之模板方法

模板方法定义模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。(引用GoF 设计模式)类图实现1. 定义抽象类package template;/** * 抽象类: 作为基类,其子类必须实现抽象方法 */public abstract class CaffeineBeverage { /** * 整个流程处理 * 声明为final以免子类改变这个算法的

2020-06-18 08:51:43 185

原创 设计模式之门面模式(外观模式)

门面模式(外观模式)定义将一个或数个类的复杂的一切都隐藏在背后,只显露一个干净美好的门面(外观)。门面没有封装子系统的类,门面只提供简化的接口。所以客户觉得有必要,依然可以直接使用子系统的类。创建一个接口简化而统一的类,用来包装子系统中的一个或多个复杂的类。门面模式为子系统提供了一组统一的接口,定义一组高层接口让子系统更易用。类图总结解决易用性问题。外观模式可以用来封装系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。如Linux是对内核的封装。Shell命令

2020-06-17 20:58:33 163

原创 设计模式之适配器模式

适配器模式定义在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。适配器模式主要应用于,当接口里定义的方法无法满足客户的需求,或者说接口里定义的方法的名称或者方法界面与客户需求有冲突的情况。(引用百度百科)适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接

2020-06-16 12:22:00 196

原创 设计模式之单例模式

单例模式确保任何情况下都绝对只有一个补全。像这样的被称为单例模式。创建单例模式的五种方式1. 饿汉式public class Hungry { private static Instance instance = new Instance(); private Hungry() {} public static Instance getInstance() { return instance; }}线程安全但是有的人需要用到的时候才加载

2020-06-11 21:20:30 124

原创 设计模式之工厂模式(工厂方法模式、抽象工厂模式)

工厂模式所谓工厂,就是将零件组装成产品的地方。建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中。创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分。在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不同的分配方案。几个不同的设计模式都应用了工厂的概念,并可以使用在很多语言中。例如,在《设计模式》一书中,像工厂方法模式、抽象工厂模式、生成器模式,甚至是单例模式都应用了工厂

2020-06-11 20:37:34 6215

原创 设计模式之装饰者模式

装饰者模式定义装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。(引用 Head First 设计模式)一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。通过使用修饰模式,可以在运行时扩充一个类的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的

2020-06-08 15:15:56 159

原创 设计模式之观察者模式

观察者模式定义设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。( 引用维基百科 )观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做

2020-06-05 09:59:13 150

原创 设计模式之策略模式

策略模式什么是策略一般是指:可以实现目标的方案集合。根据形势发展而制定的行动方针和斗争方法。有斗争艺术,能注意方式方法。“策略”就是为了实现某一个目标,首先预先根据可能出现的问题制定的若干对应的方案,并且,在实现目标的过程中,根据形势的发展和变化来制定出新的方案,或者根据形势的发展和变化来选择相应的方案,最终实现目标。(引用百度百科)什么是策略模式策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美

2020-06-04 21:45:17 329

空空如也

空空如也

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

TA关注的人

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