写点什么

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:0010444

评论 2 条评论

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

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

TDengine 发布主流时序数据库对比分析报告,与 InfluxDB、TimescaleDB 展开全面对比测试

TDengine

tdengine 时序数据库 数据库·

CVE-2023-23752 Joomla未授权访问漏洞分析

墨菲安全

漏洞分析 软件供应链安全

Java单元测试浅析(JUnit+Mockito)

京东科技开发者

Java 单元测试 代码 JUnit Mockito

DevEco Studio端云协同开发之云数据库

白晓明

云数据库 HarmonyOS 端云协同

有没有夫妻相?刷一下脸就知道!

华为云开发者联盟

人工智能 华为云 企业号 2 月 PK 榜 华为云开发者联盟

任务管理-轻松搞定 IoT 设备重启、资源包更新、固件升级等业务——实践类

阿里云AIoT

json 物联网 数据格式

电信NB-IoT设备对接阿里云IoT平台实战——实践类

阿里云AIoT

大数据 监控 物联网 存储 数据格式

F5 分布式云服务为软银集团的私有基础设施带来云原生能力

F5 Inc

如何将Excel文档转换为PDF文档

Geek_249eec

Java Excel PDF

PDF电子书下载 和 企业物联网实例 视频讲解——实践类

阿里云AIoT

运维 监控 物联网

IoT 物联网平台如何实现 100万/秒 消息广播?——实践类

阿里云AIoT

小程序 监控 物联网 传感器 测试技术

墨菲安全参与信息通信软件供应链安全社区成员大会并获自主研发创新成果奖

墨菲安全

供应链安全 安全情报

接地电阻要小于4Ω,你知道是为什么吗?

元器件秋姐

科普 元器件 电阻 接地电阻

研发效能DevOps推荐书单

laofo

DevOps cicd 研发效能 持续交付

基于SpringBoot实现操作GaussDB(DWS)的项目实战

华为云开发者联盟

数据库 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

被骂惨了!复旦版「MOSS」服务器挤崩,一口吃不成ChatGPT

引迈信息

人工智能 AI ChatGPT MOSS

天翼云推出爬虫管理,助力企业安全高效发展

极客天地

LoRaWAN设备接入阿里云IoT企业物联网平台实战——实践类

阿里云AIoT

物联网 传感器

如何有效的解决代码的圈复杂度

京东科技开发者

代码 计算 圈复杂度 点边计算

Python基础练习题(一)

漫步桔田

CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析

墨菲安全

漏洞分析 软件供应链安全

数据治理如何做?火山引擎DataLeap帮助这款产品3个月降低计算成本20%

字节跳动数据平台

大数据 数据治理 数据研发 企业号 2 月 PK 榜

NFTScan x TiDB丨一栈式 HTAP 数据库为 Web3 数据服务提供毫秒级多维查询

NFT Research

数据库 NFT

脑洞|ChatGPT加持下,ChatOps将如何革新团队协作与运维管理?

极狐GitLab

团队管理 DevOps 团队协作 ChatOps ChatGPT

【监控运维】消息轨迹全景图详解-独门秘籍——实践类

阿里云AIoT

运维 监控 物联网 数据可视化 消息中间件

Python 基础练习题(二)

漫步桔田

智多星RPA重塑业务流程,全面赋能企业商业创新

YonBuilder低代码开发平台

MQTT 5.0介绍

EMQ映云科技

性能 物联网 IoT mqtt 企业号 2 月 PK 榜

CodeArts Repo:6大特性助力企业代码稳定可靠安全无忧

华为云开发者联盟

云计算 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

宣布 Databricks 支持 Amazon Graviton2,性价比提高3倍

亚马逊云科技 (Amazon Web Services)

数据库 存储

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