终于舍得出来写下博客了。我们知道Log4j目前已经停止更新了。Apache推出了新的Log4j2来代替Log4j,Log4j2是对Log4j的升级,与其前身Log4j相比有了显着的改进,并提供了许多Logback可用的改进,同时解决了Logback体系结构中的一些固有问题.
Log4j2的效率可以在多线程时,在线程数量大的情况下,超过logback10倍左右!(在asyncRoot中可以添加includeLocation="true"属性,该属性如果为true,可以携带类名和行号等信息,但是抽取这些信息,会有一些性能损耗)
其实log4j2 性能为啥能这么好主要还是采用了disruptor队列
log4j2内部内置了一个BlockingQueue队列,具体实现采用了ArrayBlockingQueue
可以看到ArrayBlockingQueue采用的是加锁的方式来处理线程安全问题的。
加锁的问题,虽然历代JDK一直投入大量的精力去解决问题,比如优化Sync关键字的实现方式、添加读写锁等,但是由于结构特性的问题,一直无法从根本上解决性能开销问题。
题外话 _ 除了锁的问题,还牵涉到底层CPU在计算时读取内存数据的问题。
举个例子:当你遍历一个数组时(数组在CPU计算时,是简单数据结构),你读取到第一个元素时,其他元素也会相应的放入1级缓存(距离CPU最近),所以你遍历数据的方式是最快的,这就是简单数据结构的优势
Disputor--要解决锁和缓存缺失带来的性能开销问题..采用了环形数据结构来解决这个问题(他们称之为魔法圆环,或魔法圆圈之类的&#x