“Log4j 2 无垃圾模式”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
第12行: 第12行:
 
[[文件:异步日志吞吐量.png|无|缩略图|757x757像素]]
 
[[文件:异步日志吞吐量.png|无|缩略图|757x757像素]]
 
可以看出在前两种模式下,Log4j 2 的性能较之 Log4j 和 Logback 有很大的优势。
 
可以看出在前两种模式下,Log4j 2 的性能较之 Log4j 和 Logback 有很大的优势。
 +
 +
 +
 +
=== 无垃圾记录 ===
 +
垃圾收集暂停是延迟峰值的常见原因,并且对于许多系统而言,花费大量精力来控制这些暂停。
 +
 +
许多日志库(包括以前版本的 Log4j)在稳态日志记录期间分配临时对象,如日志事件对象,字符串,字符数组,字节数组等。
 +
 +
这会对垃圾收集器造成压力并增加 GC 暂停发生的频率。
 +
 +
从版本 2.6 开始,默认情况下 Log4j 以“无垃圾”模式运行,其中重用对象和缓冲区,并且尽可能不分配临时对象。
 +
 +
还有一个“低垃圾”模式,它不是完全无垃圾,但不使用 ThreadLocal 字段。
 +
 +
Log4j 2.6 中的无垃圾日志记录部分通过重用 ThreadLocal 字段中的对象来实现,部分通过在将文本转换为字节时重用缓冲区来实现。

2023年2月28日 (二) 08:50的版本

https://www.bilibili.com/video/BV1iJ411H74S?p=35

Log4j 2 的性能

Log4j 2 最牛的地方在于异步输出日志时的性能表现,Log4j 2 在多线程的环境下吞吐量与 Log4j 和 Logback 的比较如下图。

下图中比较中 Log4j 2 有三种模式:

  1. 全局使用异步模式;
  2. 部分 Logger 采用异步模式;
  3. 异步 Appender
生成缩略图出错:无法将缩略图保存到目标地点

可以看出在前两种模式下,Log4j 2 的性能较之 Log4j 和 Logback 有很大的优势。


无垃圾记录

垃圾收集暂停是延迟峰值的常见原因,并且对于许多系统而言,花费大量精力来控制这些暂停。

许多日志库(包括以前版本的 Log4j)在稳态日志记录期间分配临时对象,如日志事件对象,字符串,字符数组,字节数组等。

这会对垃圾收集器造成压力并增加 GC 暂停发生的频率。

从版本 2.6 开始,默认情况下 Log4j 以“无垃圾”模式运行,其中重用对象和缓冲区,并且尽可能不分配临时对象。

还有一个“低垃圾”模式,它不是完全无垃圾,但不使用 ThreadLocal 字段。

Log4j 2.6 中的无垃圾日志记录部分通过重用 ThreadLocal 字段中的对象来实现,部分通过在将文本转换为字节时重用缓冲区来实现。