File 0494-erts-Hibernate-system-procs-to-save-memory.patch of Package erlang

From 62d3a61102e87f38958b641b2a5d785b28af0b61 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Thu, 29 Apr 2021 12:00:31 +0200
Subject: [PATCH] erts: Hibernate system procs to save memory

The code checker and literal checker sometimes use
a lot of memory so their heaps will becomes pretty
large. So we hibernate them when they have not done
anything for 60 seconds in order to shrink the heap
size back to 0.
---
 erts/preloaded/ebin/erts_code_purger.beam     | Bin 12428 -> 12560 bytes
 .../ebin/erts_literal_area_collector.beam     | Bin 3596 -> 3736 bytes
 erts/preloaded/src/erts_code_purger.erl       |   9 ++++++++-
 .../src/erts_literal_area_collector.erl       |  13 +++++++++++--
 4 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/erts/preloaded/src/erts_code_purger.erl b/erts/preloaded/src/erts_code_purger.erl
index c41532ed87..341c44536b 100644
--- a/erts/preloaded/src/erts_code_purger.erl
+++ b/erts/preloaded/src/erts_code_purger.erl
@@ -25,6 +25,9 @@
 -export([start/0, purge/1, soft_purge/1, pending_purge_lambda/3,
 	 finish_after_on_load/2]).
 
+%% Internal export
+-export([wait_for_request/0]).
+
 -spec start() -> no_return().
 start() ->
     register(erts_code_purger, self()),
@@ -32,7 +35,11 @@ start() ->
     wait_for_request().
 
 wait_for_request() ->
-    handle_request(receive Msg -> Msg end, []).
+    handle_request(
+      receive Msg -> Msg
+      after 60000 ->
+              erlang:hibernate(?MODULE,wait_for_request,[])
+      end, []).
 
 handle_request({purge, Mod, From, Ref}, Reqs) when is_atom(Mod), is_pid(From) ->
     {Res, NewReqs} = do_purge(Mod, Reqs),
diff --git a/erts/preloaded/src/erts_literal_area_collector.erl b/erts/preloaded/src/erts_literal_area_collector.erl
index 3befad8dfb..2d7c8f1293 100644
--- a/erts/preloaded/src/erts_literal_area_collector.erl
+++ b/erts/preloaded/src/erts_literal_area_collector.erl
@@ -48,6 +48,14 @@ start() ->
 msg_loop(Area, {Ongoing, NeedIReq} = OReqInfo, GcOutstnd, NeedGC) ->
     %% 'Ongoing' is the sum of currently outstanding requests
     %% and currently delayed requests allowing GC.
+
+    HibernateTmo =
+        if Area =:= undefined ->
+                60000;
+           true ->
+                infinity
+        end,
+
     receive
 
 	%% A new area to handle has arrived...
@@ -91,12 +99,13 @@ msg_loop(Area, Outstnd, GcOutstnd, NeedGC) ->
 	%% Unexpected garbage message. Get rid of it...
 	_Ignore ->
 	    msg_loop(Area, OReqInfo, GcOutstnd, NeedGC)
-
+    after HibernateTmo ->
+            %% We hibernate in order to clear the heap completely.
+            erlang:hibernate(?MODULE, start, [])
     end.
 
 switch_area() ->
     Res = erts_internal:release_literal_area_switch(),
-    erlang:garbage_collect(), %% Almost no live data now...
     case Res of
 	false ->
 	    %% No more areas to handle...
-- 
2.26.2

openSUSE Build Service is sponsored by