写点什么

Log4j 2.6 免垃圾收集

  • 2016-06-11
  • 本文字数:1791 字

    阅读完需:约 6 分钟

Java 语言中流行的日志库 Log4j 的最新版本 Log4j 2.6,将引入一系列选项以运行在免垃圾回收模式。该发布继续跟随前几个发布版,尝试提升日志库的性能,并且已经得到业界的积极响应。据性能改进倡议的引导者Remko Popm 透露,下一步将会增加log4j 可以运行在免垃圾回收模式的场景数量。

2014 年 7 月,log4j 2.0 在日志框架领域革命性地引入了异步记录器,相比于同步记录器将吞吐率提升了 6 至 68 倍。这些结果可能令人影响深刻,但日志框架的性能损耗仍然占据了部分高吞吐率、低延时应用响应时间的很大一部分,这常常导致开发者在部署时排除日志框架。对于高性能应用程序进行微调以避免垃圾回收导致的暂停能够达到非常好的效果,log4j 团队断定这些性能提升能够带来更多的用户。通过性能和 Java 专家 Kirk Pepperdine 的评论来判断,该假设是成立的:

Java 中的日志框架形势不容乐观。到今天为止,我很少碰到客户反馈他们的系统没有因为日志框架导致的负面影响。我与到的一个极端例子是,一个客户面临 4.5 秒的时限,但是日志记录占用了其中的 4.2 秒(很大一部分压力来自于异步追加器)。我将对次版本发布非常感兴趣。

防止垃圾回收是通过避免创建临时对象来实现的,这意味着需要尽可能的复用已经存在的对象。然而在最初发布的时候,整个库没有能够做到免垃圾回收,因此开发者如果希望实现该功能,需要注意追加器(appenders)、日志记录器(loggers)、格式化布局(formatting layouts)和 API 使用时的限制。

应用程序类型

部分被复用的对象保存在 ThreadLocal 区域中。这样的设计对独立的应用程序来说没有问题,但是对于 web 应用可能会引起内存泄漏。应用服务器可能会将 ThreadLocal 保存在线程池中,这意味着即使应用被卸载,用于日志记录的对象仍然会保持引用。因此,通过 ThreadLOcal 来复用对象的功能在 web 应用程序中默认是关闭的,既 log4j 无法完全运行在免垃圾回收模式。

日志记录器

log4j 防止触发垃圾回收的另一个方式是在将文本转换为字符数组的时候复用缓冲区。所有类型的应用程序都可因此受益,且该功能默认是开启的。然而使用同步日志记录器的多线程应用程序可能会有性能影响,因为不同的线程需要竞争共享的缓冲区。如果遇到这种情况,应该优先使用异步日志记录器,或者禁用共享缓冲区。

追加器

只有部分追加器已经修改以避免创建临时对象:Console(控制台)、File(文件)、RandomAccessFile(随机访问文件)、上述追加器的回卷追加器、MemoryMappedFile(内存映射文件)。任何其他追加器都会产生垃圾,并且需要被回收。然而需要注意的是,这些追加器本身可以免垃圾回收,仍然会有其他 I/O 相关的因素会影响它们的性能。

格式化布局

格式化布局可能是开发者在试图配置达到免垃圾回收时最棘手的部分,因为他们不近需要关注所需使用的布局,还需要关注布局中的选项。GelfLayout(Graylog Extended Log Format)布局只有在压缩选项禁用时才支持免垃圾回收,而 PatternLayout 只支持限定的转换模式,任何其他转换模式都会创建临时对象。

API 使用

API 本身也已经为避免创建临时对象而修改。除了之前支持简单可变长度参数(这样会创建一个临时数据)的方法之外,log4j 新增了所有方法的重载版本,最多支持 10 个参数。调用方法超过 10 个参数仍然会使用可变长度参数,这将会创建临时数组。

这个限制对于通过 SLF4J 使用 log4j 的场景影响较大,因为这个门面库只提供了最多两个参数的非变长参数。用户如果希望使用超过两个参数,并运行在免垃圾回收模式,就需要抛弃 SLF4J。

对代码的影响

虽然已经做了向下兼容,以避免开发者更新代码,有一类临时对象的创建和 log4j 框架本身无关:对基本数据类型的自动装箱。为了确保 JVM 不将基本数据类型装换成对应的对象,开发者在给 log4j 传递基本数据类型时,可以使用静态方法Unboxer.box()。该方法可以允许 log4j 直接处理基本数据类型而无需创建不必要的对象。

尽管有一系列的限制条件,这些改变已经有潜力在严格性能需求的场景下显著提升日志记录的体验。那些因为当前限制无法使用免垃圾回收特性的开发者,可以继续关注变更列表,在未来的发布版本中可能会提供进一步的改进。

查看英文原文: Log4j 2.6 Goes Garbage-Free


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-06-11 19:0010110

评论 2 条评论

发布
用户头像
大佬你好,请问 您是怎么在https://logging.apache.org/log4j/2.x/articles.html这里面发布教程的?
2022-08-13 14:14 · 浙江
回复
用户头像
就这?????????

2020-10-13 19:54
回复
没有更多了
发现更多内容

画一个 “月饼” 陪我过中秋,使用 ESP32-C3 制作炫彩月饼

矜辰所致

电路设计 ESP32-C3 9月月更

如何在 ACK 中使用 MSE Ingress

阿里巴巴中间件

阿里云 容器 微服务 云原生 ingress

elasticsearch的字符串动态映射

程序员欣宸

elasticsearch 9月月更

OpenHarmony3.0如何轻松连接华为云IoT设备接入平台

华为云开发者联盟

后端 物联网 华为云 企业号九月金秋榜

MySQL系列——连接查询、子查询、union合并、limit

胖虎不秃头

MySQL 数据库 9月月更

日志易正式加入华为云云商店联营模式,并受邀参与首届828 B2B企业节

IT资讯搬运工

华为 华为云

微服务治理热门技术揭秘:动态读写分离

阿里巴巴中间件

数据库 阿里云 微服务 云原生

JDBC系列——JDBC编程六步

胖虎不秃头

MySQL 数据库 9月月更

Python 自动化测试(五): Pytest 结合 Allure 生成测试报告

测吧(北京)科技有限公司

Python 自动化测试 pytest

Linux vim的使用和配置

挚爱光小胖

Linux vim教程

CodeLab:一款让你体验丝滑般的云化JupyterLab

华为云开发者联盟

人工智能 华为云 企业号九月金秋榜

软件测试 | 测试开发 | Pytest 测试框架,零基础也能轻松 hold 住

测吧(北京)科技有限公司

软件测试 测试

MySQL系列——数据库表、查询、排序、数据处理函数

胖虎不秃头

MySQL 数据库 9月月更

BI系统的分布式部署原理和技术实现

葡萄城技术团队

分布式 BI 部署 可视化数据

Android技术分享| Activity 过渡动画 — 让切换更加炫酷

anyRTC开发者

android 音视频 动画 移动开发 Activity

负载均衡

阿柠xn

负载均衡 运维 MQ 9月月更

如何设计一个高并发系统?这篇文章全部给你讲清楚了

Java永远的神

程序员 面试 后端 高并发 架构师

python os模块

zxhtom

9月月更

设计模式的艺术 第十四章享元设计模式练习(开发一个多功能文档编辑器,在文本文档中可以插入图片、动画、视频等多媒体资料。为了节省系统资源,相同的图片、动画和视频在同一个文档中只需保存一份,但是可以多次重复出现,而且它们每次出现时位置和大小均可不同)

代廉洁

设计模式的艺术

融云视频会议,助力政企高效协同

融云 RongCloud

会议 音视频技术 政企

NFT软件开发:什么是数字藏品?

开源直播系统源码

NFT 数字藏品 数字藏品系统软件开发 数字藏品开发

备战2023秋招,应届生应做好哪些准备

C++后台开发

应届生 C++后台开发 校招 秋招 C++开发

探索编译软件栈新范式;高端GPU禁售的影响;陈天奇DL系统免费课程|AI系统前沿动态

OneFlow

内容合集

大咖说 | 无影携手实在智能助力企业“数智化”转型

大咖说

无影 实在智能

字节一面:服务端挂了,客户端的 TCP 连接还在吗?

Java全栈架构师

程序员 面试 TCP 计算机网络 秋招

软件测试 | 测试开发 | Jenkins 踩坑(四)|基于接口自动化测试完成 Jenkins+GitHub+Allure 的结合

测吧(北京)科技有限公司

测试

只懂黑盒测试也能学会的代码覆盖率及精准化测试

霍格沃兹测试开发学社

软件测试 自动化测试 测试开发

GaussDB(for Redis)双活容灾支持4大应用场景,全新守护业务安全

华为云开发者联盟

数据库 后端 企业号九月金秋榜

软件测试 | 测试开发 | java远程连接ssh的实现

测吧(北京)科技有限公司

java;

一文带你了解K8S 容器编排(下)

霍格沃兹测试开发学社

堡垒机定义、由来以及价值简单说明-行云管家

行云管家

网络安全 数据安全 堡垒机 行云管家

Log4j 2.6免垃圾收集_Java_Abraham Marín Pérez_InfoQ精选文章