log4j2最佳实践2
多项政策
滚动文件追加器仅允许一个嵌套的触发策略元素。如果您希望使用多个策略,则需要将它们包装在Policies
元素中。元素本身没有配置属性。
同时使用两种基于时间的触发策略( |
例如,以下 XML 片段定义了滚动日志的策略:
-
当 JVM 启动时。
-
当日志大小达到 10 MB 时。
-
当地时间午夜。
-
XML
-
JSON
-
YAML
-
特性
log4j2.xml
的片段<RollingFile name="FILE"
fileName="app.log"
filePattern="app.%d{yyyy-MM-dd}.%i.log">
<JsonTemplateLayout/>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
展期策略RolloverStrategy
翻转策略决定如何轮换或删除旧的存档文件以便为新的存档文件腾出位置。翻转期间执行的操作包括:
-
以循环方式重命名文件。有关更多详细信息,请参阅递增文件索引。
-
归档日志文件的压缩。有关更多详细信息,请参阅压缩存档文件。
-
删除旧的存档日志文件。有关更多详细信息,请参阅
Delete
操作。 -
更改归档日志文件的 POSIX 权限。有关更多详细信息,请参阅
PosixViewAttribute
操作。
有两种不同的现成可用的翻转策略:
DefaultRolloverStrategy
-
这是使用的默认策略,如果
fileName
名配置属性 已指定。 它将当前日志文件存储在fileName
指定的位置,将归档日志文件存储在 fileName 指定的位置filePattern
。 DirectWriteRolloverStrategy
-
这是使用的默认策略,如果
fileName
名配置属性 为null
。它将当前日志文件直接存储在filePattern
指定的滚动位置中。
不鼓励在 |
增加文件索引
在翻转事件期间,当前日志文件将移动到通过评估确定的位置 filePattern
,使用min
作为%i
转换模式的值。如果旧日志文件已存在于该位置,则滚动文件附加程序:
-
尝试使用
fileIndex
配置属性指定的策略来增加%i
的值。 -
如果失败,它将删除最旧的日志文件并轮换剩余的日志文件以为新的日志存档腾出位置。
有以下三种策略可供选择:
min
-
使用
min
策略,最新的日志文件将具有索引min
,最旧的日志文件将具有索引max
。这是传统 UNIX 工具和 Log4j 1 使用的日志轮转策略。它不是Log4j 2 的默认策略。
假设
min="1"
和max="3"
日志文件的轮换如下图所示:
max
-
使用
max
策略,最旧的日志文件将具有索引min
,最新的日志文件将具有索引max
。这是 Log4j 2 以来的默认策略。
假设
min="1"
和max="3"
日志文件的轮换如下图所示:
nomax
-
使用
nomax
策略,不会删除任何文件,并且将从min
开始为较新的存档文件分配递增的索引号。
压缩存档文件
当当前日志文件被归档时,滚动文件追加器可以对其进行压缩。根据存档文件名的扩展名激活压缩。可以识别以下扩展名:
dep
使用这些压缩算法需要额外的依赖项:
runtimeOnly 'org.apache.commons:commons-compress:1.27.1'
.xz
和.zst
扩展名需要额外的依赖项。 看 共享压缩文档 了解更多详情。
可选操作
文件的轮换和压缩始终由滚动文件附加程序自动处理。从 Log4j 2.6 开始,可以手动配置其他操作。
Log4j Core 提供了两种开箱即用的操作:
-
滚动更新后删除旧日志文件的
Delete
操作, -
PosixViewAttribute
操作可更改旧日志文件的 POSIX 权限。
常用动作配置
这两个操作都支持以下配置属性:
属性 | 类型 | 默认值 | 描述 | ||
---|---|---|---|---|---|
它设置操作的基目录。该操作将仅限于该目录中的文件,并且所有路径都将相对于该目录。 必需的 |
|||||
|
|
如果设置为
|
|||
|
|
可访问的最大目录级别数。默认情况下,该操作不会递归到 |
类型 | 多重性 | 描述 |
---|---|---|
零个或多个 |
一组路径条件。该操作仅对条件返回 |
Delete
操作
Delete
操作将删除符合配置条件的旧日志文件。
除了常见的配置选项之外, Delete
操作还支持以下选项:
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
|
如果为 |
类型 | 多重性 | 描述 |
---|---|---|
零个或多个 |
如果存在,则仅对条件返回 必需的,除非提供了 |
|
零或一 |
为 默认实现是 |
|
零或一 |
如果存在,则忽略所有嵌套的 |
路径条件
为了选择文件进行其他操作,Log4j 提供了以下路径条件:
IfAccumulatedFileSize
当对文件列表进行评估时,此条件将每个文件的大小与前面文件的大小相加。对于超过可配置阈值的文件,它返回true
。
此条件的结果取决于文件的排序顺序。有关详细信息,请参阅 |
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
条件匹配的阈值大小。 承认与 必需的 |
类型 | 多重性 | 描述 |
---|---|---|
零个或多个 |
一组可选的嵌套条件。仅当所有嵌套条件也匹配时,此条件才匹配。 |
IfAccumulatedFileCount
当对文件列表进行评估时,如果文件从 1 开始的索引超过可配置的阈值,则此条件返回true
。
此条件的结果取决于文件的排序顺序。有关详细信息,请参阅 |
类型 | 多重性 | 描述 |
---|---|---|
零个或多个 |
一组可选的嵌套条件。仅当所有嵌套条件也匹配时,此条件才匹配。 |
IfFileName
根据文件相对于基目录的路径来匹配文件。
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
细绳 |
使用 看 必需的,除非指定了 |
||
使用正则表达式匹配相对于目录的路径。 看 必需的,除非指定了 |
IfLastModified
根据文件的上次修改时间戳接受文件。
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
该条件接受与指定持续时间一样旧或早于指定持续时间的文件。 必需的 |
类型 | 多重性 | 描述 |
---|---|---|
零个或多个 |
一组可选的嵌套条件。仅当所有嵌套条件也匹配时,此条件才匹配。 |
ScriptCondition
ScriptCondition
使用 JSR 223 脚本来确定匹配文件的列表。
它的配置由单个嵌套脚本元素组成:
类型 | 多重性 | 描述 |
---|---|---|
|
一 |
对要执行的脚本的引用。 有关脚本编写的更多详细信息,请参阅脚本。 |
该脚本必须返回一个列表 PathWithAttributes
对象并支持以下绑定:
绑定名称 | 类型 | 描述 |
---|---|---|
基本目录的路径。 |
||
|
||
基本目录中包含的文件列表。 |
||
|
||
脚本中的诊断消息使用的状态记录器。 |
||
|
|
如果 |
有关ScriptCondition
用法的示例,请参阅下面的使用ScriptCondition
示例。
配置配方
logrotate
等效配置
Logrotate
是一种常见的 UNIX 实用程序,用于轮换日志文件。
由于无法通知 Java 应用程序需要重新加载日志文件,因此可以通过其copytruncate
选项将logrotate
与 Java 应用程序一起使用(请参阅 logrotate(8)
手册页)。因此,示例logrotate
配置文件可能如下所示:
/var/log/app.log {
copytruncate
compress
rotate 15
daily
maxsize 100k
}
这个配置有一个问题, copytruncate
选项的文档中有解释:
请注意,复制文件和截断文件之间的时间片非常短,因此可能会丢失一些日志记录数据。
幸运的是,您可以使用滚动文件附加程序来替换logrotate
的使用。等效的配置如下所示:
RollingFile:
name: "FILE"
fileName: "/var/log/app.log"
filePattern: "/var/log/app.log.%i.gz"
JsonTemplateLayout: {}
DefaultRolloverStrategy:
max: 15
Policies:
CronTriggeringPolicy:
schedule: "0 0 0 * * ?"
SizeBasedTriggeringPolicy:
size: "100k"
相当于compress :压缩存档文件。 |
|
相当于rotate 15 :只保留最新的15 日志文件。 |
|
相当于daily :日志将在每天的午夜轮换。 |
|
相当于maxsize 100k :如果日志大小超过 100 kB,则日志将被轮换。 |
带时间戳的日志文件名
以下配置每天创建一个日志文件并删除超过 15 天的日志文件。
RollingFile:
name: "FILE"
filePattern: "/var/log/app.%d{yyyy-MM-dd}.log.gz"
JsonTemplateLayout: {}
DirectWriteRolloverStrategy:
Delete:
basePath: "/var/log"
IfFileName:
regex: "app\.\d{4}-\d{2}-\d{2}\.log\.gz"
IfLastModified:
age: "P15D"
TimeBasedTriggeringPolicy: {}
每月单独的文件夹
我们还可以为临时相关的文件创建单独的文件夹。在下面的示例中,我们为每个月创建一个不同的文件夹:
RollingFile:
name: "FILE"
filePattern: "/var/log/app/%d{yyyy-MM}/%d{yyyy-MM-dd}.log.gz"
JsonTemplateLayout: {}
DirectWriteRolloverStrategy:
Delete:
basePath: "/var/log/app"
maxDepth: 2
IfLastModified:
age: "P90D"
TimeBasedTriggeringPolicy: {}
我们使用两个%d
模式来指定文件夹和文件名。 我们增加了Delete
操作的递归深度以扩展到基本目录的子文件夹。
字符编码
所有预定义的布局都会生成String
,最终使用配置的Charset
集将其转换为byte
。在执行此操作时,除非指定显式编码配置,否则它们默认使用UTF-8
。如果您希望所有日志事件都采用与所采用的布局默认值不同的特定字符编码格式,请确保根据需要配置布局的字符编码。
位置信息
property-substitution
财产替代
支持属性替换(例如${myProperty}
),包括查找(例如${java:version}
、 ${env:USER}
、 ${date:MM-dd-yyyy}
),但需要额外小心采取。 我们强烈建议您在使用前仔细阅读配置手册。
查找旨在作为一种非常通用、方便的实用程序来执行字符串插值,特别是对于缺乏此机制的配置文件和组件(例如布局)。 模式布局有丰富的转换器集合,只要有可能,您应该总是更喜欢它而不是查找。 |
通用唯一识别码
包括随机或基于时间的 UUID
UuidPatternConverter
说明符语法u{RANDOM|TIME}
uuid{RANDOM|TIME}
基于时间的 UUID 是使用每个主机的 MAC 地址生成的类型 1 UUID 为了确保同一主机上多个 JVM 和/或类加载器的唯一性,0 到 16,384 之间的随机数将与 UUID 生成器类的每个实例相关联,并包含在生成的每个基于时间的 UUID 中。
另请参见log4j2.uuidSequence
。由于基于时间的 UUID 包含 MAC 地址和时间戳,因此应谨慎使用。
C{precision}
class{precision}
图案 | 输出示例 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
您可以在 throwable 转换词后面加上%throwable{option}
形式的选项。
%throwable{short}
输出Throwable
的第一行。
%throwable{short.className}
输出发生异常的类的名称。
%throwable{short.methodName}
输出发生异常的方法名称。
%throwable{short.fileName}
输出发生异常的类的名称。
%throwable{short.lineNumber}
输出发生异常的行号。
%throwable{short.message}
输出消息。
%throwable{short.localizedMessage}
输出本地化消息。
%throwable{n}
输出堆栈跟踪的前n
行。
指定%throwable{none}
或%throwable{0}
会抑制异常的输出。
使用{filters(packages)}
(其中packages是包名称列表)以抑制堆栈跟踪中的匹配堆栈帧。
使用{suffix(pattern)}
在每个堆栈帧的末尾添加模式的输出。
使用{separator(…)}
作为行尾字符串,例如, separator(\|)
。默认值是line.separator
系统属性,该属性取决于操作系统。
异常转换器不是无垃圾的。 |
xEx|xException|xThrowable
{ "none"
| "full"
| depth
| "short"
| "short.className"
| "short.fileName"
| "short.lineNumber"
| "short.methodName"
| "short.message"
| "short.localizedMessage"
}
{filters(package,package,...)}
{suffix(pattern)}
{separator(separator)}
与%throwable
conversion不同,在异常的每个堆栈元素的末尾,有一个字符串,其中包含包含类或类所在目录的 JAR 文件的名称以及在该 JAR 清单中找到的Implementation-Version
将被添加。如果信息不确定,则类包装数据前面将带有~
(波形符)字符。
等级
输出日志事件的级别
p|level{level=label, level=label, ...}
p|level{length=n}
p|level{lowerCase=true|false}
图案 | 记录器名称 | 输出 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
进程号
如果底层平台支持,则输出进程 ID
pid{defaultValue}
processId{defaultValue}
如果平台不支持进程 ID,则可以指定显示可选的defaultValue
。
根异常
与exception
转换器相同,但堆栈跟踪从因果链中抛出的第一个异常开始打印,然后是每个后续包装异常。
rEx|rException|rThrowable
{
["none" | "short" | "full" | depth]
[,filters(package,package,...)]
[,separator(separator)]
}
{ansi(
Key=Value,Value,...
Key=Value,Value,...
...)
}
{suffix(pattern)}
Throwable 转换说明符后面可以跟一个%rEx{short}
形式的选项,它只会输出Throwable
的第一行,或者%rEx{n}
,其中将打印堆栈跟踪的前n
行。
指定%rEx{none}
或%rEx{0}
将禁止打印异常。
使用filters(packages)
,其中packages
是包名称列表,以抑制堆栈跟踪中的匹配堆栈帧。
使用separator
字符串分隔堆栈跟踪的行,例如, separator(|)
。默认值是line.separator
系统属性,它与平台相关。
仅当有Throwable
需要打印时,才使用rEx{suffix(pattern)}
将pattern
的输出添加到输出中。
以下是类别转换说明符的各种格式修饰符示例。
图案 | 左对齐 | 分钟。宽度 | 最大限度。宽度 | 评论 |
---|---|---|---|---|
|
|
|
|
如果类别名称长度小于 20 个字符,则左补空格。 |
|
|
|
|
如果类别名称长度小于 20 个字符,则右补空格。 |
|
|
|
|
如果类别名称超过 30 个字符,则从头开始截断。 |
|
|
|
|
如果类别名称少于 20 个字符,则左补空格。但是,如果类别名称超过 30 个字符,则从头开始截断。 |
|
|
|
|
如果类别名称少于 20 个字符,则右补空格。但是,如果类别名称超过 30 个字符,则从头开始截断。 |
|
|
|
|
如果类别名称少于 20 个字符,则右补空格。但是,如果类别名称长度超过 30 个字符,则从末尾截断。 |
风格修饰符
模式布局支持使用各种 ANSI 转义序列来设置文本样式,这些序列可以通过%highlight
和%style
模式转换器使用。
样式表达式的通用语法是一个以空格分隔的列表:
-
常数从
AnsiEscape
类 -
或
#rrggbb
或BG_#rrggbb
形式的表达式,其中r
、g
和b
是十六进制数字
文字颜色 | 背景颜色 | 视觉的 |
---|---|---|
8色端子 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16色端子 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果您的终端支持 24 位颜色,您可以指定:
-
使用
#rrggbb
语法的文本颜色,例如#dc143c
会将文本着色为深红色, -
使用
bg_#rrggbb
语法的背景颜色,例如bg_#87ceeb
将使用天蓝色背景。
Windows 上的 ANSI 样式
许多平台本机支持 ANSI 转义序列,但 Windows 默认情况下不支持。 要启用 ANSI 支持,请添加 詹西 依赖于您的应用程序,并将log4j2.skipJansi
系统属性设置为false
。这允许 Log4j 在写入控制台时使用 Jansi 添加 ANSI 转义码。
无垃圾配置
具有以下有限转换模式集的模式布局是无垃圾的。用于控制字段宽度、填充、左对齐和右对齐等内容的格式修饰符不会生成垃圾。
图案 | 评论 |
---|---|
只有预定义的日期格式( |
|
|
|
授予嵌套模式是无垃圾的 |
|
|
|
|
|
|
包含正则表达式和位置信息的模式不是无垃圾的。
<!-- 输入信息格式 带行号显示,对日志输出的性能有影响,在控制台上点击可以直接定位到代码 日志输出格式:
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%c 类的完整名称
%d {pattern}日期,{HH:mm:ss.SSS} 表示输出到毫秒的时间
%F 输出所在的类文件名,如Client.java
%L 为行号,输出行号
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%M 为method,输出所在方法名
%m 或者%msg为信息,日志文本
%n 换行
%t 输出当前线程名称 或 %thread线程名称 %T线程ID %t 线程名称
Color coding is configured using the %clr conversion word.
The following colors and styles are supported:
blue
cyan
faint
green
magenta
red
yellow
%p %level DEBUG INFO WARN ERROR
%xwEx Whitespace Extended Throwable 在堆栈周围添加一些额外的空白痕迹。 空白扩展可抛出 https://github.com/spring-projects/spring-boot/issues/15887#issuecomment-462130815
%esb enclosedInSquareBrackets用于帮助格式化可选值,显示在方括号内。 方括号内 EnclosedInSquareBracketsConverter
-->
配置文件的加载顺序
Log4j 包含 4 种 ConfigurationFactory 的实现,分别适用于 JSON、YAML、properties 和 XML 配置文件。在 Log4j 启动时可以按照以下顺序自动加载配置文件:
- 查找
log4j.configurationFile
系统属性所指定的配置文件名,如果该系统属性值存在,就尝试使用相应文件扩展名的 ConfigurationFactory 来加载指定的配置文件。通过在代码中调用System.setProperties("log4j.configurationFile","FILE_PATH")
或者将-Dlog4jconfigurationFile=file://C:/configuration.xml
参数传递给 JVM; - 如果没有找到,则 properties ConfigurationFactory 就在 classpath 中寻找 log4j2-test.properties 配置文件;
- 如果没有找到,则 YAML ConfigurationFactory 就在 classpath 中寻找 log4j2-test.yaml 或 log4j2-test.yml 配置文件;
- 如果没有找到,则 JSON ConfigurationFactory 就在 classpath 中寻找 log4j2-test.json 或 log4j2-test.jsn 配置文件;
- 如果没有找到,则 XML ConfigurationFactory 就在 classpath 中寻找log4j2-test.xml 配置文件;
- 如果没有找到测试配置文件,则 properties ConfigurationFactory 就在 classpath 中寻找 log4j2.properties 配置文件;
- 如果没有找到,则 YAML ConfigurationFactory 就在 classpath 中寻找 log4j2.yaml 或 log4j2.yml 配置文件;
- 如果没有找到,则 JSON ConfigurationFactory 就在 classpath 中寻找 log4j2.json 或 log4j2.jsn 配置文件;
- 如果没有找到,则 XML ConfigurationFactory 就在 classpath 中寻找log4j2.xml 配置文件;
- 如果上面的配置文件都没有找到,就使用默认的 DefaultConfiguration 配置。
Log4j 提供了一种 multicastdns Advertiser 实现,通过使用 http://jmdns.sourceforge.net 库的 IP 多播来通知 Appenders 的配置信息。Chainsaw 可以自动发现和展示 Log4j 的这种通知。目前,Chainsaw 仅支持 FileAppender 通知。
通知一个 Appender 配置的步骤如下:
- 将 JmDns 库添加到类路径下;
- 设置 Configuration 元素的 advertiser 属性值为multicastdns;
- 设置相应 appender 的 advertise 属性值为 true。
JmDNS 是多播 DNS 的 Java 实现,可以是 用于局域网中的服务注册和发现。 JmDNS 与 Apple 的 Bonjour 完全兼容。
Pattern | Comment |
---|---|
Only the predefined date formats ( |
|
|
|
Granted nested pattern is garbage-free |
|
|
|
|
|
|
Garbage-free, but care is needed for Property substitution, including Lookups |
避免自动装箱
我们努力在不需要代码的情况下使日志记录无垃圾 现有应用程序的变化,但有一个领域是这样的 不可能。
记录原始值(即 int、double、boolean、 等等)JVM 自动将这些原始值装箱到它们的对象包装器中 等价物,制造垃圾。
Log4j 提供了Unbox
实用程序来防止原语自动装箱 参数。该实用程序包含一个重用的线程本地池 StringBuilder`s. The `Unbox.box(primitive)
方法直接写入 StringBuilder,结果文本将被复制到最终的日志消息文本中,而无需创建临时对象。
import static org.apache.logging.log4j.util.Unbox.box;
LOGGER.debug("Prevent primitive autoboxing {} {}", box(10L), box(2.6d));
该实用程序包含一个重用StringBuilder
的ThreadLocal
池。池大小由log4j2.unboxRingbufferSize
系统属性配置。 Unbox.box(primitive)
方法直接写入StringBuilder
,结果文本将被复制到最终的日志消息文本中,而不创建临时对象。
局限性
并非所有 Log4j API 功能集都是无垃圾的,具体来说:
-
ThreadContext
映射(又名 MDC)默认情况下不是无垃圾的,但可以通过设置log4j2.garbagefreeThreadContextMap
系统属性为true
。 -
ThreadContext
堆栈(又名 NDC)不是无垃圾的。 -
记录非常大的消息(即超过
log4j2.maxReusableMsgSize
个字符,默认为 518),当所有记录器都是异步记录器时,将导致内部StringBuilder
RingBuffer
将被修剪回其配置的最大大小。 -
包含
${variable}
替换的日志消息会创建临时对象。 -
将 lambda 记录为参数:
LOGGER.info("lambda value is {}", () -> callExpensiveMethod());
创建一个可变参数数组。单独记录 lambda 表达式:
LOGGER.debug(() -> callExpensiveMethod());
没有垃圾。
-
traceEntry()
和traceExit()
方法创建临时对象。 -
当
log4j2.usePreciseClock
系统属性(默认为false
)设置为true
时,时间计算不是无垃圾的。
在全局上下文中运行的查找
大量查找支持全局上下文中的评估。 这些查找可以安全地用于急切评估的属性 配置文件 使用${prefix:key}
语法:
前缀 | 依赖性 | 数据来源 |
---|---|---|
爪哇 资源包 |
||
当前时间戳 |
||
|
Docker容器 |
|
环境变量 |
||
JVM特点 |
||
JNDI |
||
Log4j 配置文件的位置 |
||
它将提供的密钥转换为小写 |
||
JVM 应用程序参数 |
||
如果存在名为 |
||
|
Spring Boot 2.x 环境。 |
|
Java系统属性 |
||
它将提供的密钥转换为大写 |
||
|
雅加达 |
Spring Boot 2 查找
语境 | 全球的 |
---|---|
句法 |
其中 |
依赖性 |
如果您使用 Spring Boot 3,则应使用第三方Spring Boot 3 Lookup 。 |
Spring Boot 2 Lookup 允许用户查询 Spring Boot 外部化的配置文件。它支持以下键:
钥匙 | 描述 |
---|---|
|
以逗号分隔的活动配置文件列表。 |
|
具有从 0 开始的索引 |
|
以逗号分隔的默认配置文件列表。 |
|
具有从 0 开始的索引 |
|
Spring 中与 |
结构化数据查找
语境 | 记录事件 |
---|---|
句法 |
其中 |
结构化数据查找与映射查找非常相似,它检索分配给给定键的值 StructuredDataMessage
。此外,还支持以下虚拟键:
钥匙 | RFC5424字段 | 描述 |
---|---|---|
|
这 |
|
|
这 |
系统属性查找
语境 | 全球的 |
---|---|
句法 |
其中 |
系统属性查找检索 Java系统属性 与密钥相关联。
启用JMX
默认情况下禁用 JMX 支持。
在 2.24.0 之前的 Log4j 2 版本中默认启用 JMX 支持。 |
要启用 JMX 支持,请设置 log4j2.disableJmx
启动Java VM时的系统属性:
log4j2.disableJmx=false
RMI 对垃圾收集的影响
请注意,RMI 默认情况下每小时触发一次完整 GC。请参阅 sun.rmi.dgc.server.gcInterval
和的Oracle 文档 sun.rmi.dgc.client.gcInterval
属性。这两个属性的默认值为 3600000 毫秒(一小时)。在 Java 6 之前,是一分钟。
两个sun.rmi
参数反映了您的 JVM 是在服务器模式还是客户端模式下运行。如果要修改 GC 间隔时间,最好指定这两个属性,以确保 JVM 获取该参数。
另一种方法可能是禁用对System.gc()
显式调用 与-XX:+DisableExplicitGC
一起使用,或者(如果您使用的是 CMS 或 G1 收集器)添加 -XX:+ExplicitGCInvokesConcurrent
确保完整的 GC 与您的应用程序同时并行完成,而不是强制进行 stop-the-world 收集。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性