Night Field's Blog

Make it work, make it right, make it fast.

Connection Timeout 问题排查

背景 我们组开发维护了一个 Agent 工程,帮客户采集一些客户有用的网络数据。客户需要下载一个 MSI,然后安装并注册。 问题描述 某个客户下载安装 Agent 之后,提示注册失败。其实 Agent 注册就是一个用户登陆验证服务,然后创建一个 Machine ID 的过程。所谓 Machine ID,就跟用户帐号一样,是 Agent 的一个唯一标识。注册的流程大致如下: 注册的主...

MyBatis内置DataSource连接池实现原理

前言 MyBatis是一个流行的ORM框架,它简单易用,支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。 作为一款优秀的持久层框架,连接池是必不可少的。本文将分析MyBatis内置的数据源是如何实现连接池功能的(源码基于MyBatis3.4.5)。 JDBC对数据库的操作 回忆一下,我们用原生的JDBC来操作数据库的一般...

Redis的键过期策略以及内存淘汰策略

Redis Redis是高性能的基于内存的NoSQL数据库。因为内存是比较宝贵的资源,无法无限制使用,所以Redis提供了: 键过期策略来防止内存饱和。 内存淘汰策略来使得内存饱和之后继续对外提供服务。 内存过期策略 expire命令 Redis提供了expire命令来给一个键(key)设置过期时间: 1 2 3 4 5 6 redis> SET foo "bar" "...

Hotspot早期的垃圾收集器简介

前言 很多人的博文里面会提到JVM三种垃圾收集器:串行,并行和并发。这么分类也不能说错,但事实上也没有这么简单。本文简要介绍Hotspot早期的垃圾收集器(Garbage Collector)。 名词解释 年轻代和老年代:JVM中不同的对象,生命周期是不同的。比如线程中的临时变量,在方法结束之后便会被销毁;而静态变量,则会一直存在直到其所对应的类被销毁为止。基于这样的事实,才有了...

记一次由Netty的ChannelPool导致内存泄漏的排查经历

背景 接到了线上机器的报警,登上服务器,发现是Java进程挂了,看日志报了OOM: 1 java.lang.OutOfMemoryError: Java heap space 问题描述 内存溢出,那当然是看dump文件了。这里推荐大家在产线机器上都加上JVM参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={path}/{to}/{...

自定义Classloader导致ClassCastException

背景 1 java.lang.ClassCastException: cn.com.nightfield.Plugin cannot be cast to cn.com.nightfield.Plugin 相同的class,竟然不能cast?这是什么鬼? 问题描述 自定义类加载器(Classloader)是很常见的,它可以让我们从自定义的文件系统目录,网络甚至是数据库的各种文件类型(...

Linux, NIO和Netty中的零拷贝(Zero-Copy)

背景 零拷贝(Zero Copy)是一个耳熟能详的术语,众多高性能的网络框架如Netty,Kafka,Rocket MQ都将零拷贝标榜为其特性。那么究竟什么是零拷贝? 零拷贝 Wikipedia上对零拷贝的解释如下: “Zero-copy” describes computer operations in which the CPU does not perform the ta...

Quartz Task在Tomcat中重复运行

问题描述 Spring Quartz是很常用的定时任务框架。把一个Quartz的工程部署到Tomcat中启动,意外地发现,每个Task都在同一时间跑了两次,而本地在开发的过程中却没有问题。 问题排查 为了防止多线程问题,有部分Task上是加了锁的,类似如下方式: 1 2 3 4 5 6 7 8 9 10 11 12 13 @Component public class ExampleT...

设计模式总结

经过了两个多月的时间,终于,将常见的设计模式结合例子过了一遍,在此做一个简单的小结。 设计模式小结 不难发现,应用各种设计模式所带来的好处,都会提到解耦二字。开闭原则要求我们的系统对扩展开放,对修改关闭。高内聚,低耦合的系统,有更高的稳定性与灵活性,也更易于维护。如何来解耦模块之间的关系呢?如果只用一句话来概括的话,那就是:将变与不变分离。细看下来,设计模式通常通过增加一个中间抽象层的方...

行为模式之责任链模式

1 概述 责任链模式(Chain of Responsibility Pattern)是常见的行为模式,它将处理器封装成一条处理链,让请求可以在链上传递。链上的处理器自行决定是否对请求进行处理。 2 责任链模式 一个典型的责任链模式的使用场景是,当一个事件或请求需要被多个处理器处理时。应用责任链模式,将所有的处理器串在一起,然后把请求从链的头部开始传送。各个处理器可以对请求进行判断,选...