Night Field's Blog

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

记一次由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 责任链模式 一个典型的责任链模式的使用场景是,当一个事件或请求需要被多个处理器处理时。应用责任链模式,将所有的处理器串在一起,然后把请求从链的头部开始传送。各个处理器可以对请求进行判断,选...

行为模式之备忘录模式

1 概述 备忘录模式(Memento Pattern),又叫Token模式,它提供了一种方式,来捕捉对象某一时刻的内部状态,并将其保存成备忘录(Memento),如此一来,对象可以根据此备忘录恢复到之前的状态。 2 备忘录模式 几乎所有的编辑器都支持撤销功能,这其实就是备忘录模式的例子,撤销操作,使得文本得以恢复到之前的状态。面向对象设计中,备忘录模式的实现一般需要三个角色: 发...

行为模式之命令模式

1 概述 命令模式(Command Pattern),是将请求封装成一系列命令对象,以解耦请求发起者和请求接收者的一种行为模式。 2 命令模式 正常情况下,请求发送者和请求接收者是相互耦合的,发送者直接调用接收者相关的方法,直接交互。 用命令模式进行改造,将两者交互的媒介—-命令单独抽离出来,使得发送者和接收者相互独立,只依赖于命令对象,提高了扩展性和可维护性。同时,通过命令模式,我们...

行为模式之访问者模式

1 概述 访问者模式(Visitor Pattern)是一种行为模式,不常用。它可以将作用在对象上的算法逻辑,与对象本身分离开来。 2 访问者模式 当需要对一组相似类型的对象执行操作时,我们可以将操作逻辑分别维护在每个对象内部,但这违背了单一职责原则。 访问者模式就是来应对这种情况的:将所有的算法逻辑移动到一个新的类—-访问者(Visitor)中,统一维护,如果其中的逻辑发生了变化,那...

行为模式之模板方法模式

1 概述 模板方法模式(Template Method Pattern)是一种很常见的行为模式。在超类/抽象类中创建一个模板方法,方法中定义一个算法步骤或框架,让子类在不修改主结构的情况下,重写其中的子步骤。 2 模板方法模式 假如存在一系列对象的方法,他们的步骤是大体一致的,区别只是其中的一个子步骤。这种情况会导致大量重复冗余的代码,当公共部分需要改变时,不得不修改所有相关的对象。如...