【JVM】Try to Avoid -XX UseGCLogFileRotation

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【JVM】Try to Avoid -XX UseGCLogFileRotation

Try to Avoid -XX:+UseGCLogFileRotation

Source:dzone.com/articles/tr…

Developers take advantage of the JVM argument -XX:+UseGCLogFileRotation to rotate GC log files.

开发人员利用JVM参数-XX:+UseGCLogFileRotation来递换GC日志文件。


-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/GCEASY/gc.log -
XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M"

As shown above, the JVM will rotate the GC log file whenever its size reaches 20MB. It will generate up to five files, with extensions gc.log.0,  gc.log.1, gc.log.2, gc.log.3, and gc.log.4.

如上所示的配置会产生5个日志文件,并且每个日志文件有20M。

Losing Old GC Logs 日志丢失

Suppose you configured  -XX:NumberOfGCLogFiles=5, then over a period of time, five GC log files will be created:

假设你配置了-XX:NumberOfGCLogFiles=5,那么在一段时期内,将创建五个GC日志文件。

  • gc.log.0oldest GC Log content
  • gc.log.1
  • gc.log.2
  • gc.log.3
  • gc.log.4latest GC Log content

The most recent GC log contents will be written to gc.log.4 and old GC log contents will be present in gc.log.0.

最新的GC日志内容将被写入gc.log.4,旧的GC日志内容将出现在gc.log.0

When the application starts to generate more GC logs than the configured  -XX:NumberOfGCLogFiles, in this case, five, then old GC log contents in gc.log.0 will be deleted. New GC events will be written to  gc.log.0. It means that you will end up not having all the generated GC logs. You will lose the visibility of all events.

当应用程序配置的-XX:NumberOfGCLogFiles产生更多的GC日志时(在本例中是5个),gc.log.0中的旧GC日志内容将被删除。新的GC日志将被写入gc.log.0。这意味着会存在旧日志文件的覆盖现象,将失去所有日志的可见性

Mixed-Up GC Logs 混杂日志

Suppose an application has created five GC log files, including:

假设一个应用程序创建了五个GC日志文件,包括:

  • gc.log.0
  • gc.log.1
  • gc.log.2
  • gc.log.3
  • gc.log.4

Then, let’s say you are restarting the application. Now, new GC logs will be written to gc.log.0 file and old GC log content will be present in gc.log.1, gc.log.2, gc.log.3, gc.log.4, etc.

然后,假设你正在重启应用程序。现在新的GC日志将被写入gc.log.0文件,而旧的GC日志内容将出现在gc.log.1gc.log.2gc.log.3gc.log.4

  • gc.log.0 ← GC log file content after restart
  • gc.log.1 ← GC log file content before restart
  • gc.log.2 ← GC log file content before restart
  • gc.log.3 ← GC log file content before restart
  • gc.log.4 ← GC log file content before restart

So, your new GC log contents get mixed up with old GC logs. Thus, to mitigate this problem, you might have to move all the old GC logs to a different folder before you restart the application.

所以新GC日志和旧的GC日志会混合在一起,为了缓解这个问题,你可能要在重启应用程序之前把所有旧的GC日志移到一个不同的文件夹里。

Forwarding GC Logs to a Central Location 将GC日志转发到一个中心位置

In this approach, the current active file to which GC logs are written is marked with the extension  .current. For example, if GC events are currently written to the file gc.log.3, it would be named as: gc.log.3.current.

在这种方法中,当前写入GC日志的活动文件被标记为扩展名.current。例如,如果GC事件当前被写入文件gc.log.3,它将被命名为。 gc.log.3.current

If you want to forward GC logs from each server to a central location, then most DevOps engineers use  rsyslog. However, this file naming convention poses a significant challenge to use rsyslog, as described in this blog.

如果你想把每台服务器的GC日志转发到一个中心位置,那么大多数DevOps工程师会使用rsyslog。然而,这种文件命名惯例给使用rsyslog带来了巨大的挑战,正如这篇博客所述

Tooling 工具

Now, to analyze the GC log file using the GC tools such as (GCeasy, GCViewer, etc.), you will have to upload multiple GC log files instead of just one single GC Log file.

现在,为了使用GC工具分析GC日志文件,如(GCeasy, GCViewer等),将不得不上传多个GC日志文件,而不是只有一个GC日志文件。

显然非常麻烦并且非常反人类。

Recommended Solution 推荐方案

We can suffix the GC log file with the time stamp at which the JVM was restarted, then the GC Log file locations will become unique. Then, new GC logs will not override the old GC logs. It can be achieved by suffixing %t to the GC log file name, as shown below:

我们可以在GC日志文件后缀加入JVM重启的时间戳(解决这个问题),那么GC日志文件的位置将变得独一无二。然后新的GC日志就不会覆盖旧的GC日志了。这可以通过在GC日志文件名后缀%t来实现,如下所示:

"-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/GCEASY/gc-%t.log"

%t suffixes timestamp to the GC log file in the format:  YYYY-MM-DD_HH-MM-SS. So, the generated GC log file name will start to look like: gc-2019-01-29_20-41-47.log.

%t后缀为GC日志文件的时间戳,格式为:  yyyy-mm-dd_hh-mm-ss。因此,生成的GC日志文件名将开始看起来像: gc-2019-01-29_20-41-47.log.

This simple solution addresses all the shortcomings of -XX:+UseGCLogFileRotation.

这个简单的解决方案解决了-XX:+UseGCLogFileRotation的所有缺点。



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
Java
揭开JVM所看到的try/catch/finally
#揭开JVM所看到的try/catch/finally 最近有一位朋友发了一段代码给我,这个方法很简单,具体内容大致如下: ```java int num = 5000000;//500万 long begin = System.currentTimeMillis(); for(int i=0; i
1787 0
|
1月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
37 4
|
3月前
|
Java Docker 索引
记录一次索引未建立、继而引发一系列的问题、包含索引创建失败、虚拟机中JVM虚拟机内存满的情况
这篇文章记录了作者在分布式微服务项目中遇到的一系列问题,起因是商品服务检索接口测试失败,原因是Elasticsearch索引未找到。文章详细描述了解决过程中遇到的几个关键问题:分词器的安装、Elasticsearch内存溢出的处理,以及最终成功创建`gulimall_product`索引的步骤。作者还分享了使用Postman测试接口的经历,并强调了问题解决过程中遇到的挑战和所花费的时间。
|
14天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
12天前
|
Java Linux Windows
JVM内存
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制。
11 1
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
68 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
存储 缓存 算法
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
|
1月前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
50 10
|
30天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
1月前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
51 2