介绍

最近,我正在为一个客户端工作,试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后,我意识到大部分垃圾都是通过日志记录产生的! 是否有一种简单的方法来删除所有分配? 原来有:)

我应该使用哪个框架进行GC免费日志记录?

让我们将注意力转向使用哪个日志记录框架的古老问题。

通常的候选人是

  • log4j2
  • 登入
  • java.util.logging
  • slf4j(简单)

并且除非您正在做一些超级时髦的事情,否则您可能不会认为这会给您带来很大的改变。

已经进行了许多比较性能的研究,如果您在超低等待时间的竞技场中玩,那当然很重要。 ( 请参阅对Java日志记录框架进行基准测试 )

但是我担心的是分配!

请参阅我之前关于分配的弊端的文章“性能优化的第一条规则”。

在典型的系统中,所有分配的30%-50%可以记录在日志中! 因此,即使大多数人不介意在一个框架中进行日志记录的时间比在另一个框架中花费几毫秒的时间,他们几乎肯定会在乎日志框架所产生的垃圾导致的长时间GC暂停。

而且所有这些日志记录分配都可以通过简单的配置删除。 从2.6开始的Log4J2是免费分配的,因此没有任何借口不利用它:)

让我们看看它的作用

提出免分配索赔是一回事,但让我们看看这在实践中是否成立。

考虑下面的这个简单的日志记录代码:请注意,我在代码中使用了slf4j,因此只需更改配置即可在不同的日志记录框架中运行。 这样做是个好主意,因为尽管log4j2可能是目前最好的框架,但谁知道明天会带来什么……

package test;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;public class GCLogger {private final static Logger LOGGER = LoggerFactory.getLogger(GCLogger.class);public static void main(String[] args) throws InterruptedException {List<String> list = IntStream.range(0,(int)1e6).mapToObj(i->"" + i).collect(Collectors.toList());//Log 1 million lines in a loop sleeping 1 second between each iteration of the loop//to allow time to run Flight Recorder.for (int i = 0; i < 1000; i++) {list.forEach(s->LOGGER.info("Logging [{}]", s));Thread.sleep(1000);}}
}

使用log4j2运行–无分配

如果我们使用以下Maven配置将程序配置为与log4j2一起运行:

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.9.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.9.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.9.1</version>
</dependency>

我们使用此log4j2配置

xml version="1.0" encoding="UTF-8" ?><Configuration status="INFO"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss:SSS} [%t] %-5level %logger[36] %msg%n"></PatternLayout></Console><File name="MyFile" fileName="all.log" immeadiateFlush="false" append="false"><PatternLayout pattern="%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5level %logger[36] %msg%n"></PatternLayout></File></Appenders><Loggers><Root level="debug"><AppenderRef ref="MyFile"></AppenderRef></Root></Loggers>
</Configuration>

然后我们得到0分配!

我们可以通过在程序上运行Flight Recorder来证明这一点(见下文):

唯一分配的内存归因于Flight Recorder(可以通过配置FR的方式来避免这种情况发生)。

使用登录运行

使用Logback尝试完全相同。

使用此Maven配置

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>

使用此注销配置:

<configuration><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>myApp.log</file><encoder><pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern></encoder></appender><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="FILE" /></root>
</configuration>

当我们使用Flight Recorder运行时,我们会看到一个拥抱量分配!

但是有一点警告……。

您需要完全按照文档中的指定使用log4j2配置,请参阅支持的布局 。 如果您甚至更改日期格式,则略微分配将再次猖ramp。

摘要

  • 使用slf4j,以便您可以轻松更改日志记录实现
  • 使用log4j2避免分配
  • 确保使用支持的格式来支持免费分配日志记录

翻译自: https://www.javacodegeeks.com/2017/10/allocation-free-logging-log4j2.html

使用log4j2免费分配日志记录相关推荐

  1. 使用log4j记录日志_使用log4j2免费分配日志记录

    使用log4j记录日志 介绍 最近,我正在为一个客户端工作,试图为大型精心制作的Java系统消除一些GC暂停. 经过分析后,我意识到大部分垃圾都是通过日志记录产生的! 是否有一种简单的方法来删除所有分 ...

  2. 如何在 Java 中进行日志记录

    您可以使用本指南为您的应用程序发现.理解和使用正确的 Java 日志库,例如 Log4j2.Logback 或 java.util.logging. 日志"似乎"是一个非常简单的主 ...

  3. log4j2 无日志记录_在Log4j2中更好地执行非日志记录器调用

    log4j2 无日志记录 使用Log4j 1.x并希望避免在某些情况下可能会造成额外的性能影响(即使实际上未记录该消息)时,通常使用日志记录防护 . Java的简单日志记录外观 ( SLF4J )带给 ...

  4. SpringBoot使用Slf4j+Log4j2完成项目的日志记录

    SpringBoot使用Slf4j+Log4j完成项目的日志记录 前言 本示例采用SpringBoot项目使用SpringAOP记录日志,Slf4j作为日志门面,Log4j2作为日志实现实,实现开发中 ...

  5. Log4j2日志记录框架的使用教程与简单实例

    1.Log4j2的使用教程 1.1 简介 Log4j的1.x版本虽然已经被广泛使用于很多应用程序中,但由于出现内存泄漏等bug,代码难以维护,以及需要使用老版本的jdk等劣势,在2015年8月已经玩完 ...

  6. 如何配置log4j2日志记录至数据库

    log4j2可灵活的将日志打印在控制台.通过SMTP邮件发送.记录至文件.保存至数据库.本文介绍如何配置log4j2将日志记录至数据库 建立用于保存日志的数据库表: CREATE TABLE `sys ...

  7. apache log4j_Apache log4j是领先的日志记录框架

    apache log4j 根据 零周转的调查中, Apache log4j是领先的Java日志记录框架. 这实际上是一个非常有趣的调查. 它显示SLF4J最常用作伐木外墙,占61%. 但是,它似乎最常 ...

  8. Apache log4j是领先的日志记录框架

    根据 从零周转开始的调查中, Apache log4j是领先的Java日志记录框架. 这实际上是一个非常有趣的调查. 它显示SLF4J最常用作伐木外墙,占61%. 但是,它似乎最常与Apache Lo ...

  9. ASP.NET MVC的最佳日志记录库

    目录 介绍 4个日志记录库 log4net Log4net记录文本文件中 Log4net记录到数据库中 NLOG Nlog日志记录在文本文件中 NLog日志记录到数据库中 Serilog Serilo ...

最新文章

  1. 2022-2028年中国农副产品行业市场供需规模及未来前景分析报告
  2. Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题
  3. 颜色字符串转换(正则)
  4. [转载] Python进阶:设计模式之迭代器模式
  5. Shell编程:简洁的 Bash Programming 技巧
  6. 整理收藏-mysqldump导出数据库
  7. java 到异常_java编程中遇到的异常以及异常的一些处理
  8. css中background-position:的属性值为百分比时的用法
  9. php define函数
  10. Caused by: java.lang.ClassNotFoundException: Didn’t find class on path apk Android Studio解决方案
  11. 高数 | 【一元函数微分学】导数部分经典快速例题
  12. OA多级审批流程表设计方案以及开发思路(非常细节)
  13. Android 获取圆角图标bitmap黑色背景问题解决
  14. Oracle查询数据表数据很少却很慢(查询空表很很耗时)
  15. 杂谈——如何合并两个有序链表(时间复杂度为O(n))
  16. 什么是金手指,金手指的设计要求有哪些?
  17. 学霸计算机考试新闻,697分考入清华却退学,这个襄阳学霸高考二刷699分!一心入行人工智能...
  18. [ERP]IQC,IPQC,PQC,FQC,OQC是什么意思?是干什么的?
  19. 一次完整的嵌入式开发课程设计经历(附:项目工程及关键代码)
  20. 上海大学计算机学院邢稹,【CES·毕业季】学霸寝室||相约一起“上岸”,我们是最亲密的战友!...

热门文章

  1. 今日头条大佬十年面试了 2000 人,总结了这 5 点
  2. 漫画:什么是二叉堆?(修正版)
  3. Java最小堆解决TopK问题
  4. java实现字符逆序输出
  5. jQuery最简单的留言功能^-^
  6. Android中ImageView的scaleType 属性说明。
  7. linux跑循环脚本占内存,Linux下实现脚本监测特定进程占用内存情况
  8. 去掉字符串后面所有的0 去掉字符串前面或后面的0;
  9. 解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误
  10. Meaven的pom文件配置