log4j2 无垃圾稳态日志 Garbage-free Steady State Logging

news2024/11/17 17:41:56

无垃圾稳态日志

垃圾收集暂停是导致延迟峰值的常见原因,对于许多系统来说,需要花费大量精力来控制这些暂停。

许多日志库,包括以前版本的Log4j,在稳态日志记录期间分配临时对象,如日志事件对象、字符串、char数组、字节数组等。这增加了垃圾收集器的压力,并增加了GC暂停发生的频率。

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

还有一种“低垃圾”模式,它不是完全没有垃圾,但不使用ThreadLocal字段。当Log4j检测到它在web应用程序中运行时,这是默认模式。

最后,可以关闭所有无垃圾逻辑并以“经典模式”运行。详细信息请参见下面的“配置”部分。

一个例子

为了突出无垃圾日志可以带来的差异,我们使用Java Flight Recorder来测量一个简单的应用程序,该应用程序除了尽可能频繁地记录一个简单的字符串外,什么都不做,持续大约12秒。

应用程序被配置为使用异步日志记录器、随机访问文件附加程序和 %d %p %c{1.} [%t] %m %ex%n 模式布局。(异步记录器使用Yield WaitStrategy。)

任务控制显示,使用Log4j 2.5,该应用程序以大约809 MB/秒的速率分配内存,产生141个小收集。

Log4j 2.6在此配置中不分配临时对象,因此使用Log4j 2.6的相同应用程序的内存分配率为1.6 MB/秒,并且没有gc,没有垃圾收集。

配置

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

保存非jdk类的ThreadLocal字段在web应用程序取消部署后,当应用程序服务器的线程池继续引用这些字段时,可能会导致web应用程序中的内存泄漏。

为了避免造成内存泄漏,当Log4j检测到它在web应用程序中被使用时(当javax.servlet.Servlet类在类路径中,或者当系统属性log4j2在类路径中),它将不会使用这些 ThreadLocals.isWebapp 设置为“true”)。

一些减少垃圾的功能不依赖于ThreadLocals,并且默认情况下对所有应用程序都是启用的:在Log4j 2.6中,将日志事件转换为文本和文本转换为字节可以通过直接将文本编码为可重用的ByteBuffer来完成,而无需创建中间的字符串,char数组和字节数组。因此,虽然日志记录对于web应用程序
来说还不是完全没有垃圾,但是垃圾收集器的压力仍然可以显著降低。

在这里插入图片描述

参考资料

https://logging.apache.org/log4j/2.x/manual/garbagefree.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocksDB是如何实现存算分离的

核心参考文献: Dong, S., P, S. S., Pan, S., Ananthabhotla, A., Ekambaram, D., Sharma, A., Dayal, S., Parikh, N. V., Jin, Y., Kim, A., Patil, S., Zhuang, J., Dunster, S., Mahajan, A., Chelluri, A., Datye, C., Santana, L. V., Garg, N., & Gawde,…

基于YOLOv7算法的高精度实时安全帽和背心目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要:基于YOLOv7算法的高精度实时安全帽和背心目标检测系统可用于日常生活中检测与定位安全帽和安全背心,此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别,同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标…

B样条基函数

​定义:令U{u0,u1,…,um}是一个单调不减的实数序列,即ui≤ui1,i0,1,…,m-1。其中,ui称为节点,U称为节点矢量,用Ni,p(u)表示第i个p次(p1阶)B样条基…

短视频界的变革者:上海 AI lab 发布 Vlogger,几句话生成分钟级视频

现如今,vlog 已经成为我们日常生活的重要组成部分。无论是看视频学习休闲、记录珍贵瞬间还是分享生活见闻,视频已经成为人们表达创意和观点的独特媒介。 然而,与几秒钟的短视频不同,要创作出引人入胜、生动有趣的长视频&#xff…

十分钟学会用springboot制作微信小程序富文本编辑器

1.1 富文本模型设计 在构建富文本编辑器系统时,首先需要设计一个合适的富文本模型。 CREATE TABLE IF NOT EXISTS rich_texts (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(255),content TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );这个表包括…

一键转换MOV至MP3:轻松删除原视频,释放存储空间!

你是否曾经有一个MOV格式的视频文件,想要提取其中的音频却苦于没有合适的工具?现在,有了我们的全新视频剪辑工具,这个烦恼全部消失!我们为你提供一键式解决方案,将MOV视频文件快速转换为MP3音频格式。 首先…

PyNest 一个可以搭建微服务的 Python 包

PyNest 在构建 Python API 和微服务方面崭露头角,解决了 FastAPI 中存在的关键问题,因此成为卓越的框架。凭借其模块化的架构和先进的特性,PyNest 在 2024 年及以后有望成为 Python 开发者的首选选择。 随着 Python 生态系统的不断成熟&…

YAYI-UIE: 一个用于通用信息提取的聊天增强的指令微调框架

1、写作动机: 最近的研究提出了基于大型语言模型的方法,以统一地建模不同的信息提取任务。然而,这些现有方法在处理英语以外的中文语言的信息提取能力方面存在不足。 2、主要贡献: 提出了YAYI-UIE,一个端到端的聊天…

Prometheus+grafana配置监控系统

使用docker compose安装 方便拓展, 配置信息都放在在 /docker/prometheus 目录下 1.目录结构如下 . ├── conf │ └── prometheus.yml ├── grafana_data ├── prometheus_data └── prometheus_grafana.yaml2.创建目录文件 mkdir /docker/prometheus &&am…

Java面试题之 IO(四)

Java面试题之 IO(四) 文章目录 Java面试题之 IO(四)随机访问流 文章来自Java Guide 用于学习如有侵权,立即删除 随机访问流 这里要介绍的随机访问流指的是支持随意跳转到文件的任意位置进行读写的 RandomAccessFile 。…

C# Onnx yolov8 仪表指针检测

目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 仪表指针检测 效果 模型信息 Model Properties ------------------------- date:2024-01-31T11:19:38.828556 author:Ultralytics task:detect license:AGPL-…

C++ 哈希 开放定址法

哈希算法 哈希,是一种算法思想吗,它的核心是映射,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表) 在STL 中,提供了两个使用哈希底层实现的容器 unordered_set 和 …

西瓜书读书笔记整理(十二) —— 第十二章 计算学习理论(下)

第十二章 计算学习理论(下) 12.4 VC 维(Vapnik-Chervonenkis dimension)12.4.1 什么是 VC 维12.4.2 增长函数(growth function)、对分(dichotomy)和打散(shattering&…

Python算法题集_合并区间

本文为Python算法题集之一的代码示例 题目56:合并区间 说明:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需…

CANoe实际项目中文件夹的规划

本人,之前设计了一个CANoe工程,由于工程设计之初没有设计好文档的归纳分类,导致文件查找起来非常费劲。 为了避免以后出现文件混乱,不可查找的问题,故特此归纳说明。 建立工程时: 第1步就应该设计好文档…

品牌定位传播之道:公关、广告与定位原则的结合

​在当今商业环境中,品牌传播的重要性日益凸显。一个成功的品牌传播策略不仅能提升品牌知名度和美誉度,还能在消费者心智中建立稳固的地位。本文将深入探讨公关、广告和定位原则在品牌传播中的作用,以及迅腾文化如何助力品牌传播价值。 一、…

miniReact<一>

一、工程化配置 1.1 目录结构 1.1.1 Multi-repo VS Mono-repo Multi-repo 每个库有自己独立的仓库,逻辑清晰,协同管理复杂 Mono-repo 很方便管理不同独立的库的生命周期,会有更高的操作复杂度 项目有很多包,同时管理多个不同的…

iOS开发Xcode中的ld64和-ld_classic是什么意思

在iOS应用程序开发中,Xcode是一款广泛使用的集成开发环境(IDE),而链接器是构建应用程序的关键组成部分之一。在Xcode中,我们常常会遇到两个重要的概念:ld64和-ld_classic。它们分别代表了默认链接器和经典链…

Shell脚本之 -------------免交互操作

一、Here Document 1.Here Document概述 Here Document 使用I/O重定向的方式将命令列表提供给交互式程序 Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出一个文件并用作命令的标准…

JVM篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?二、对象分配规则三、描述一下JVM加载class文件的原理机制?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…