自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小创编程

源码分析,有深度,有广度,有想法。

  • 博客(27)
  • 收藏
  • 关注

原创 Oracle RedoLog-二进制格式分析,文件头,DML,DDL

上篇文章,简单介绍了 RedoLog 是什么,以及怎么从 Oracle Dump 二进制日志。接下来,分析下 Redo Log 二进制文件的格式,主要包括:文件头,重做日志头,DML-INSERT 操作,DDL-CREATE 操作。Redo Log 二进制文件中,采用的是小端序字节序。原文链接:https://www.chuonye.com/archives/oracle-redolog-format.html1. File Header文件头,占用第一个块。Oracle 中许多二进制的数据和日志文

2021-01-08 09:30:33 700

原创 Oracle RedoLog-基本概念和组成

Oracle 数据库恢复操作最关键的依据就是 redo log,它记录了对数据库所有的更改操作。在研究如何提取 redolog 中 DML 操作的过程可谓一波三折,因为介绍 redolog 结构细节的资料实在太少了,不过好在最后大致理清了它的结构,并开发了一个基于日志的同步软件。本系列文章就记录下研究过程中遇到的问题和使用的分析命令、工具。原文链接:https://www.chuonye.com/archives/oracle-redolog.html1. 什么是 Redo LogRedo Log

2021-01-08 09:23:03 462 1

原创 学习排序算法,结合这个方法太容易理解了

排序是一个经典的问题,它以一定的顺序对一个数组或列表中的元素进行重新排序。而排序算法也是各有千秋,每个都有自身的优点和局限性。虽然这些算法平常根本就不用自己去编写,但作为一个有追求的程序员,还是要了解它们从不同角度解决排序问题的思想。学习算法是枯燥的,那怎么高效的理解它的原理呢?显然,如果以动图的方式,生动形象的把算法排序的过程展示出来,非常有助于学习。visualgo.net 就是一个可视化算...

2019-09-15 09:16:40 304

原创 LinkedHashMap 的核心就 2 点,搞清楚,也就掌握了

HashMap 有一个不足之处就是在迭代元素时与插入顺序不一致。而大多数人都喜欢按顺序做某些事情,所以,LinkedHashMap 就是针对这一点对 HashMap 进行扩展,主要新增了**「两种迭代方式」**:按插入顺序 - 保证迭代元素的顺序与插入顺序一致按访问顺序 - 一种特殊的迭代顺序,从最近最少访问到最多访问的元素访问顺序,非常适合构建 LRU 缓存LinkedHashMap ...

2019-09-15 09:15:23 146

原创 TreeMap 还能排序?分析下源码就明白了

Java 中的 Map 是一种键值对映射,又被称为符号表或字典的数据结构,通常使用哈希表来实现,但也可使用二叉查找树、红黑树实现。HashMap 基于哈希表,但迭代时不是插入顺序LinkedHashMap 扩展了 HashMap,维护了一个贯穿所有元素的双向链表,保证按插入顺序迭代TreeMap 基于红黑树,保证键的有序性,迭代时按键大小的排序顺序这里就来分析下 TreeMap 的实现...

2019-09-15 09:14:26 236

原创 模拟实现 Tomcat 的核心模块:NIO,HTTP,容器和集群

如果你想看 Tomcat 源码但又无从入手,不妨从这个项目开始,代码量不多,但包含了 Tomcat 的核心处理流程,并且源码中有相当丰富的注释。相信通过此项目你能了解:NIO 基本编程、HTTP 协议的本质、基本的单元测试Tomcat 应用部署、自定义类加载器的实现、Servlet 的管理和加载运行以及静态资源的处理和缓存等Maven 生成可执行 jar,生成 javadoc,使用 ass...

2019-09-15 09:13:42 166

原创 红黑树这个数据结构,让你又爱又恨?看了这篇,妥妥的征服它

红黑树是一个比较复杂的数据结构,相信很多人也只知其名而不知其意,因为理解它的原理确实需要花费一定的功夫。之所以写这篇文章,也是为了更好的理解 Java 中 TreeMap 的源码。写之前,搜了下网上的文章,说实话,看完有点懵,大部分一上来就给你它的五大性质,然后就是一顿插入、删除、旋转操作,就完事了,理解起来相当吃力。本文将结合 2-3-4 树,循序渐进地介绍红黑树的由来和原理,相信看完之后,...

2019-09-15 09:12:46 256

原创 还在为垂直居中苦恼?CSS 布局利器 flexbox 轻轻松松帮你搞定

传统的 CSS 布局方式是基于盒模型(它是根据盒子与父盒子以及兄弟盒子的关系确定大小和位置的算法),实现时依赖于 block, inline, table, position, float 这些属性,但对于一些特殊布局不易实现,比如垂直居中。Flexbox Layout 是一种新的布局方式,被称为弹性布局,它使得子元素(items)可以灵活的、响应式的适应父容器(flex container)的...

2019-09-15 09:11:04 119

原创 Java 内存模型和 JVM 内存结构真不是一回事

这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说,Java 内存模型,描述的是多线程允许的行为JVM 内存结构,描述的是线程运行所设计的内存空间JVM 是什么呢?它屏蔽了底层架构的差异性,是 Java 跨平台的依据,也是每个 Java 程序员必须了解的一部分。搜索公众号「顿悟源码」获取更多源码分析和造的轮子。JV...

2019-09-15 09:09:10 152

原创 Bootstrap4默认样式不对胃口?教你使用NPM+Webpack+SASS来定制

Bootstrap 是一个流行的前端样式库,可以方便快速的构建应用,但默认样式可能不尽人意,本文就介绍如何使用 NPM, Webpack, SASS 针对它的源码来定制自己的主题。版本使用的是 Bootstrap v4.3.1。本文提供了一个使用此方式编写的一个后台管理模板 Dunwoo Admin,文末有获取源码的方式。演示地址:https://dunwoo.com/projects/dunw...

2019-09-15 09:05:57 490

原创 「福利」Java Swing 编写的可视化算法工程,包含树、图和排序

之前在整理《学习排序算法,结合这个方法太容易理解了》这篇文章时,发现了一个用 Java Swing 编写的可视化算法工程,真心不错!包含了常用数据结构和算法的动态演示,先来张图感受下:可以看到既有基本数据结构栈、队列基于数组和链表的元素插入和删除的动态演示,又有二叉查找树、平衡二叉树、B-Tree的构建和查找过程,还有图的广度和深度优先遍历过程。文末有源码领取方式。平衡二叉树构建动图演示...

2019-06-12 12:49:54 431

原创 Tomcat 中的 Session 和 Cookie

HTTP 是一种无状态通信协议,每个请求之间相互独立,服务器不能识别曾经来过的请求。而对于 Web 应用,它的活动都是依赖某个状态的,比如用户登录,此时使用 HTTP 就需要它在一次登录请求后,有为后续请求提供已登录信息的能力。本文首发于公众号顿悟源码.解决办法就是使用 Cookie,它由服务器返回给浏览器,浏览器缓存并在每次请求时将 cookie 数据提交到服务器。Cookies 在请求中以明...

2019-05-25 11:42:28 273

原创 Tomcat 类加载器的实现

Tomcat 内部定义了多个 ClassLoader,以便应用和容器访问不同存储库中的类和资源,同时达到应用间类隔离的目的。本文首发于公众号:顿悟源码。1. Java 类加载机制类加载就是把编译生成的 class 文件,加载到 JVM 内存中(永久代/元空间)。类加载器之所以能实现类隔离,是因为两个类相等的前提是它们由同一个类加载器加载,否则必定不相等。JVM 在加载时,采用的是一种双亲委...

2019-05-25 11:41:43 113

原创 Tomcat 容器的安全认证和鉴权

大量的 Web 应用都有安全相关的需求,正因如此,Servlet 规范建议容器要有满足这些需求的机制和基础设施,所以容器要对以下安全特性予以支持:身份验证:验证授权用户的用户名和密码资源访问控制:限制某些资源只允许部分用户访问数据完整性:能够证明数据在传输过程中未被第三方修改机密性或数据隐私:传输加密(SSL),确保信息只能被信任用户访问本文就以上问题,对 Tomcat 容器提供的认...

2019-05-25 11:41:06 406

原创 深入分析 JDK8 中 HashMap 的原理、实现和优化

HashMap 可以说是使用频率最高的处理键值映射的数据结构,它不保证插入顺序,允许插入 null 的键和值。本文采用 JDK8 中的源码,深入分析 HashMap 的原理、实现和优化。首发于微信公众号顿悟源码.1. 基本结构HashMap 基于散列表实现,使用拉链法处理碰撞,在 JDK8 中,当链表长度大于 8 时转为红黑树存储,基本结构如下:HashMap 有一个 Node<K,...

2019-05-25 11:38:30 139

原创 Tomcat 类加载器的实现

Tomcat 内部定义了多个 ClassLoader,以便应用和容器访问不同存储库中的类和资源,同时达到应用间类隔离的目的。本文首发于公众号:顿悟源码。1. Java 类加载机制类加载就是把编译生成的 class 文件,加载到 JVM 内存中(永久代/元空间)。类加载器之所以能实现类隔离,是因为两个类相等的前提是它们由同一个类加载器加载,否则必定不相等。JVM 在加载时,采用的是一种双亲委...

2019-05-09 18:25:14 221

原创 Tomcat 对静态资源的处理

Tomcat 中的请求都是由 Servlet 处理,静态资源也不例外。在默认的 web.xml 中,配置了一个 DefaultServlet 用于处理静态资源,它支持缓存和断点续传。DefaultServlet 的基本处理过程如下:查找资源是否存在缓存检查是否满足可选 If 头域指定的条件设置响应头域,如 Content-Type、Content-Length、ETag、Last-Mod...

2019-05-07 10:25:06 1854

原创 Tomcat 路由请求的实现 Mapper

在分析 Tomcat 实现之前,首先看一下 Servlet 规范是如何规定容器怎么把请求映射到一个 servlet。本文首发于(微信公众号:顿悟源码),交流QQ群:6739861581. 使用 URL 路径收到客户端请求后,容器根据请求 URL 的上下文名称匹配 Web 应用程序,然后根据去除上下文路径和路径参数的路径,按以下规则顺序匹配,并且只使用第一个匹配的 Servlet,后续不再尝试匹...

2019-05-06 09:37:46 293

原创 ArrayList 和 LinkedList 源码分析

List 表示的就是线性表,是具有相同特性的数据元素的有限序列。它主要有两种存储结构,顺序存储和链式存储,分别对应着 ArrayList 和 LinkedList 的实现,接下来以 jdk7 代码为例,对这两种实现的核心源码进行分析。1. ArrayList 源码分析ArrayList 是基于数组实现的可变大小的集合,底层是一个 Object[] 数组,可存储包括 null 在内的所有元素,默...

2019-05-05 12:29:36 309

原创 Tomcat 配置文件解析工具 digester

Digester 是一个依据 xml 配置文件动态构建 Java 对象树的工具,基于 SAX 解析器进行封装,它为 SAX 事件的处理提供了更高级和友好的接口,让开发更专注于要执行的处理,隐藏了 XML 元素详细的层次结构信息。1. 对象堆栈为了便于实现,内部使用堆栈存储创建的对象。当满足元素匹配模式时,按预设的处理规则操作栈中对象。典型的创建对象处理逻辑是,触发创建新对象的规则,在遇到特定...

2019-05-05 12:27:24 303

原创 Tomcat 容器的设计和实现

Tomcat 容器是对 Servlet 规范的实现,也称为 Servlet 引擎。在分析 Tomcat 容器的设计和实现之前,首先简单了解一下 Servlet 规范,弄清楚 Tomcat 究竟要实现什么?1. Servlet 规范简述Servlet 是什么?javadoc 中已经明确说明:Servlet 是在 Web 服务器中运行的 Java 程序,通常用于接收并响应来自 Web 客户端的...

2019-05-05 12:26:39 301

原创 Tomcat 对 HTTP 协议的实现(下)

在《Tomcat 对 HTTP 协议的实现(上)》一文中,对请求的解析进行了分析,接下来对 Tomcat 生成响应的设计和实现继续分析。本文首发于(微信公众号:顿悟源码)一般 Servlet 生成响应的代码是这样的:protected void service(HttpServletRequest req, HttpServletResponse resp) throws Ser...

2019-05-05 12:25:58 282

原创 Tomcat 对 HTTP 协议的实现(上)

协议,直白的说就是存在一堆字节,按照协议指定的规则解析就能得出这堆字节的意义。HTTP 解析分为两个部分:解析请求头和请求体。请求头解析的难点在于它没有固定长度的头部,也不像其他协议那样提供数据包长度字段,判断是否读取到一个完整的头部的唯一依据就是遇到一个仅包括回车换行符的空行,好在在找寻这个空行的过程中能够完成请求行和头域的分析。请求体的解析就是按照头域的传输编码和内容编码进行解码。那么 T...

2019-05-05 12:25:11 437

原创 Tomcat NIO 模型的实现

Tomcat 对 BIO 和 NIO 两种模型都进行了实现,其中 BIO 的实现理解起来比较简单,而 NIO 的实现就比较复杂了,并且它跟常用的 Reactor 模型也略有不同,具体设计如下:可以看出多了一个 BlockPoller 的设计,这是因为在 Servlet 规范中 ServletInputStream 和 ServletOutputStream 是阻塞的,所以请求体和响应体的读取和...

2019-05-05 12:22:12 774

原创 Reactor典型的NIO编程模型

NIO 常用的编程模型是 Reactor,在 Doug Lea 的 Scalable IO in Java 的 PPT 中对其进行了介绍,文末有福利 :) ,Reactor 的特点是 I/O 多路复用和事件驱动,基本处理过程为:处理程序声明感兴趣的 I/O 事件,这些事件表示在特定套接字上准备读取的情况事件通知器等待事件一个事件发生并唤醒通知器,通知器调用适当的处理程序事件处理程序执行...

2018-08-05 14:28:18 510

原创 Tomcat 启动初始化和停止

Tomcat 通过 server.xml 配置文件装配一系列组件,并且为组件设计生命周期接口,在容器启停时,协调控制组件的启动、初始化和停止。容器通常使用脚本启动,脚本主要是检查 Java 环境、设置 JVM 参数,调用 Bootstrap.start 启动。Bootstrap 是 Catalina 的引导加载类,它构造了一个 commonLoader 类加载器,加载 ${catalina.b...

2018-08-05 11:30:14 1098

原创 关于 IO 和 NIO 的思考

I/O 的实际操作由内核执行,其中一个重要手段是缓冲区。简单来说 I/O 可分为两类:面向磁盘和面向网络,Java 也是针对这两者来抽象设计 API,相关的类主要在 java.io 和 java.nio 包中,简称为 BIO 和 NIO。为什么设计 NIO一个直接原因就是为了更好的利用操作系统特性,改善和扩展原有 API。与 NIO 相关的规范有两个:JSR 51:它是 NIO ...

2018-08-05 11:27:49 220

空空如也

空空如也

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

TA关注的人

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