Log4j 2 无垃圾模式
https://www.bilibili.com/video/BV1iJ411H74S?p=35
Log4j 2 的性能
Log4j 2 最牛的地方在于异步输出日志时的性能表现,Log4j 2 在多线程的环境下吞吐量与 Log4j 和 Logback 的比较如下图。
下图中比较中 Log4j 2 有三种模式:
- 全局使用异步模式;
- 部分 Logger 采用异步模式;
- 异步 Appender
可以看出在前两种模式下,Log4j 2 的性能较之 Log4j 和 Logback 有很大的优势。
无垃圾记录
垃圾收集暂停是延迟峰值的常见原因,并且对于许多系统而言,花费大量精力来控制这些暂停。
许多日志库(包括以前版本的 Log4j)在稳态日志记录期间分配临时对象,如日志事件对象,字符串,字符数组,字节数组等。
这会对垃圾收集器造成压力并增加 GC 暂停发生的频率。
从版本 2.6 开始,默认情况下 Log4j 以“无垃圾”模式运行,其中重用对象和缓冲区,并且尽可能不分配临时对象。
还有一个“低垃圾”模式,它不是完全无垃圾,但不使用 ThreadLocal 字段。
Log4j 2.6 中的无垃圾日志记录部分通过重用 ThreadLocal 字段中的对象来实现,部分通过在将文本转换为字节时重用缓冲区来实现。
Log4j 2.5: memory allocation rate 809 MB/sec, 141 minor collections.