diff --git a/apps/emqx_conf/i18n/emqx_conf_schema.conf b/apps/emqx_conf/i18n/emqx_conf_schema.conf
index fc33589ec..337823233 100644
--- a/apps/emqx_conf/i18n/emqx_conf_schema.conf
+++ b/apps/emqx_conf/i18n/emqx_conf_schema.conf
@@ -471,8 +471,8 @@ significant: later configuration files override the previous ones.
node_global_gc_interval {
desc {
- en: """Periodic garbage collection interval."""
- zh: """系统调优参数,设置节点运行多久强制进行一次全局垃圾回收。"""
+ en: """Periodic garbage collection interval. Set to disabled to have it disabled."""
+ zh: """系统调优参数,设置节点运行多久强制进行一次全局垃圾回收。禁用设置为 disabled。"""
}
label {
en: "Global GC Interval"
diff --git a/apps/emqx_conf/src/emqx_conf.app.src b/apps/emqx_conf/src/emqx_conf.app.src
index 2b6efe639..c57664ca7 100644
--- a/apps/emqx_conf/src/emqx_conf.app.src
+++ b/apps/emqx_conf/src/emqx_conf.app.src
@@ -1,6 +1,6 @@
{application, emqx_conf, [
{description, "EMQX configuration management"},
- {vsn, "0.1.6"},
+ {vsn, "0.1.7"},
{registered, []},
{mod, {emqx_conf_app, []}},
{applications, [kernel, stdlib]},
diff --git a/apps/emqx_conf/src/emqx_conf_schema.erl b/apps/emqx_conf/src/emqx_conf_schema.erl
index a68c11dc4..2080d32cb 100644
--- a/apps/emqx_conf/src/emqx_conf_schema.erl
+++ b/apps/emqx_conf/src/emqx_conf_schema.erl
@@ -468,7 +468,7 @@ fields("node") ->
)},
{"global_gc_interval",
sc(
- emqx_schema:duration(),
+ hoconsc:union([disabled, emqx_schema:duration()]),
#{
mapping => "emqx_machine.global_gc_interval",
default => "15m",
diff --git a/apps/emqx_conf/test/emqx_global_gc_SUITE.erl b/apps/emqx_conf/test/emqx_global_gc_SUITE.erl
index 121e12eba..9e4a5ffa6 100644
--- a/apps/emqx_conf/test/emqx_global_gc_SUITE.erl
+++ b/apps/emqx_conf/test/emqx_global_gc_SUITE.erl
@@ -29,4 +29,8 @@ t_run_gc(_) ->
ok = timer:sleep(1500),
{ok, MilliSecs} = emqx_global_gc:run(),
ct:print("Global GC: ~w(ms)~n", [MilliSecs]),
- emqx_global_gc:stop().
+ emqx_global_gc:stop(),
+ ok = emqx_config:put([node, global_gc_interval], disabled),
+ {ok, Pid} = emqx_global_gc:start_link(),
+ ?assertMatch(#{timer := undefined}, sys:get_state(Pid)),
+ ok.
diff --git a/apps/emqx_machine/src/emqx_global_gc.erl b/apps/emqx_machine/src/emqx_global_gc.erl
index 74825c321..a704d603c 100644
--- a/apps/emqx_machine/src/emqx_global_gc.erl
+++ b/apps/emqx_machine/src/emqx_global_gc.erl
@@ -82,10 +82,10 @@ code_change(_OldVsn, State, _Extra) ->
%%--------------------------------------------------------------------
ensure_timer(State) ->
- case application:get_env(emqx_machine, global_gc_interval) of
- undefined ->
+ case application:get_env(emqx_machine, global_gc_interval, disabled) of
+ disabled ->
State;
- {ok, Interval} ->
+ Interval when is_integer(Interval) ->
TRef = emqx_misc:start_timer(Interval, run),
State#{timer := TRef}
end.
diff --git a/apps/emqx_machine/src/emqx_machine.app.src b/apps/emqx_machine/src/emqx_machine.app.src
index 59a5ad4b8..63c6c01ad 100644
--- a/apps/emqx_machine/src/emqx_machine.app.src
+++ b/apps/emqx_machine/src/emqx_machine.app.src
@@ -3,7 +3,7 @@
{id, "emqx_machine"},
{description, "The EMQX Machine"},
% strict semver, bump manually!
- {vsn, "0.1.0"},
+ {vsn, "0.1.1"},
{modules, []},
{registered, []},
{applications, [kernel, stdlib]},
diff --git a/changes/v5.0.12-en.md b/changes/v5.0.12-en.md
index 5f72cb174..bb3df6bc7 100644
--- a/changes/v5.0.12-en.md
+++ b/changes/v5.0.12-en.md
@@ -2,6 +2,8 @@
## Enhancements
+- Disable global garbage collection by `node.global_gc_interval = disabled` [#9418](https://github.com/emqx/emqx/pull/9418)。
+
- Improve the CLI to avoid waste atom table when typing erros [#9416](https://github.com/emqx/emqx/pull/9416).
- Start building MacOS packages for Apple Silicon hadrdware [#9423](https://github.com/emqx/emqx/pull/9423).
diff --git a/changes/v5.0.12-zh.md b/changes/v5.0.12-zh.md
index ea7c8793d..fad19995e 100644
--- a/changes/v5.0.12-zh.md
+++ b/changes/v5.0.12-zh.md
@@ -2,6 +2,8 @@
## 增强
+- 通过 `node.global_gc_interval = disabled` 来禁用全局垃圾回收 [#9418](https://github.com/emqx/emqx/pull/9418)。
+
## 修复
- 优化命令行实现, 避免输入错误指令时, 产生不必要的原子表消耗 [#9416](https://github.com/emqx/emqx/pull/9416)。