ALID Blog

A light in the dark

应该怎样准备面试

准备是一方面 平时的积累可能更为重要

Java基础 基础方面我认为主要有几点. Jdk源码 看源码最好不要只看一些网上的博客, 一定要自己读一遍, 否则问一些细节就闷逼了. JVM 这一点就一句话, 把《深入理解JVM》看一遍就没问题了. 基础的深入理解 这一点其实很容易有遗漏, 指的是我们Java基础语言特性的实现原理. 例如多态是怎么实现的, 反射为什么慢, 容器为什么不能使用基本类型. 其实都是Jvm相关知识, 但很...

spring bean的加载过程

spring是如何帮我们管理bean的

在bean被加载之前, 需要创建spring上下文, 之后才能加载bean. 创建上下文的过程就是创建ICO容器的部分. 如果细分的话, 可以分为三步 创建IOC容器 从注解和xml, 解析并注册bean 开始创建bean 对于BeanFactory来说,对象实例化默认采用延迟初始化。通常情况下,当对象A被请求而需要第一次实例化的时候,如果它所依赖的对象B之前同样没有被实...

AQS与Condition

jdk的锁实现

AQS与Condition实现了并发包的核心, 他们实现了Java自己的管程,其中 AQS 用于解决互斥问题,Condition 用于解决同步问题。 jdk为什么要实现lock, synchronized不香吗? 首先提出一个问题, 1.6 版本之后synchronized性能其实已经很好了, 为什么要重复造轮子呢?其实很简单有些地方sunchronized做的并不好, 比如加锁...

Mysql引擎设计

mysql是怎样工作的

行设计 Varchar, text 等类型的变长字段的长度专门记录 Null 值专门记录, 不会在列信息中记录 有2个隐藏列, 分别是事务ID和回滚指针, 如果我们没有定义主键还会加上隐藏主键 每页大小是16KB, 如果边长字段太大, 会将前768个字节存储在行中, 之后的数据存储到溢出页中. 页设计 数据页结构如上图 可以看到删除最后并不会直接删除, 而是放到删除队...

QMQ的设计与实现

去哪儿网自己造的轮子有什么特殊之处

完全可靠消息, 大量组订阅通知, 方便纵向扩容, 支持任意时间的延迟消息, 但并不能保证消息的顺序性 序章-QMQ的诞生 为啥造轮子? 在遥远的8年前, RocketMQ还叫MetaQ; kafka还很不稳定; RabbitMQ是使用erlang开发的, 不好定制化. 所以当时的大佬们就决定自己搞一个简单易用并且符合业务要求的轮子. 怎么实现一个MQ呢? 想要实现一个最简单的M...

SPI与Dubbo的可扩展机制

Dubbo的扩展性设计

什么是SPI SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。 其实就是根据配置选择实现类 这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。 并且可以和API对比来看. API是给使用者使...

JVM垃圾回收机制

彻底认识Jvm堆

堆内存 想要垃圾回收就必须知道JVM堆内存的设计 JVM大致可以分为这几块, 设计到垃圾回收的主要是堆的部分 在传统GC内存布局中JVM的堆内存被分为新生代,老年代. 以及在本地内存中的元空间. 这些部分都在垃圾回收器的掌控之中. 怎么找到被回收对象 引用计数 虽然简单, 但无法解决循环引用的问题 可达性分析 GC Roots 主要就是全局引用的和正在执行的...

并发系统设计

按照场景区分不同情况下的并发设计

BASE 虽然都是高QPS但有不同的类型, 首先按照并发查和并发写来进行分类说明 但是在说这个问题的时候, 我们先来看一下会影响我们系统QPS的因素. 1. 响应时间和 QPS 对于大部分的 Web 系统而言,响应时间一般都是由 CPU 执行时间和线程等待时间(比如 RPC、IO 等待、Sleep、Wait 等)组成,即服务器在处理一个请求时,一部分是 CPU 本身在做运算,...

动态规划

LeetCode算法

BASE 个人认为是基础算法中最难的部分, 常常被用来求解最优问题. 学习动态规划问题首先要知道什么时候用动态规划,可不仅仅是只能用在求解最优的时候. 个人认为是当我们会遇到很多选择,并且之前的选择会对之后的选择产生影响的时候. 也就是通过记录一些中间状态逐步推出最终状态 无论是背包问题中选择物品, 还是在地下城问题中选择路线, 还是正则表达式匹配中选择当前是否再匹配一次*. 这些问...

回溯法

LeetCode算法

BSAE 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯,即剪枝。(其实回溯法就是对隐式图的深度优先搜索算法) 核心: 深度优先遍历 回溯(回到之前经过的每一个节点) ...