“Log4j 2 无垃圾模式”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) |
Jihongchang(讨论 | 贡献) |
||
第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 有三种模式:
- 全局使用异步模式;
- 部分 Logger 采用异步模式;
- 异步 Appender
可以看出在前两种模式下,Log4j 2 的性能较之 Log4j 和 Logback 有很大的优势。
无垃圾记录
垃圾收集暂停是延迟峰值的常见原因,并且对于许多系统而言,花费大量精力来控制这些暂停。
许多日志库(包括以前版本的 Log4j)在稳态日志记录期间分配临时对象,如日志事件对象,字符串,字符数组,字节数组等。
这会对垃圾收集器造成压力并增加 GC 暂停发生的频率。
从版本 2.6 开始,默认情况下 Log4j 以“无垃圾”模式运行,其中重用对象和缓冲区,并且尽可能不分配临时对象。
还有一个“低垃圾”模式,它不是完全无垃圾,但不使用 ThreadLocal 字段。
Log4j 2.6 中的无垃圾日志记录部分通过重用 ThreadLocal 字段中的对象来实现,部分通过在将文本转换为字节时重用缓冲区来实现。