Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
0494-erts-Hibernate-system-procs-to-save-memory...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor