PERF: ensure we run full GC on contexts

Prior to this change we would never clear memory from contexts and
rely on V8 reacting to pressure

This could lead to bloating of PrettyText and Transpiler contexts

This optimisations ensures that we will clear memory 2 seconds after
the last eval on the context
This commit is contained in:
Sam Saffron 2020-05-15 14:01:54 +10:00
parent 0cbaa8d813
commit 4601833e4e
No known key found for this signature in database
GPG Key ID: B9606168D2FFD9F5
4 changed files with 4 additions and 4 deletions

View File

@ -188,7 +188,7 @@ GEM
method_source (1.0.0) method_source (1.0.0)
mini_mime (1.0.2) mini_mime (1.0.2)
mini_portile2 (2.4.0) mini_portile2 (2.4.0)
mini_racer (0.2.11) mini_racer (0.2.14)
libv8 (> 7.3) libv8 (> 7.3)
mini_scheduler (0.12.2) mini_scheduler (0.12.2)
sidekiq sidekiq

View File

@ -79,7 +79,7 @@ class DiscourseJsProcessor
def self.create_new_context def self.create_new_context
# timeout any eval that takes longer than 15 seconds # timeout any eval that takes longer than 15 seconds
ctx = MiniRacer::Context.new(timeout: 15000) ctx = MiniRacer::Context.new(timeout: 15000, ensure_gc_after_idle: 2000)
ctx.eval("var self = this; #{File.read("#{Rails.root}/vendor/assets/javascripts/babel.js")}") ctx.eval("var self = this; #{File.read("#{Rails.root}/vendor/assets/javascripts/babel.js")}")
ctx.eval(File.read(Ember::Source.bundled_path_for('ember-template-compiler.js'))) ctx.eval(File.read(Ember::Source.bundled_path_for('ember-template-compiler.js')))
ctx.eval("module = {}; exports = {};") ctx.eval("module = {}; exports = {};")

View File

@ -282,7 +282,7 @@ module JsLocaleHelper
def self.with_context def self.with_context
@mutex.synchronize do @mutex.synchronize do
yield @ctx ||= begin yield @ctx ||= begin
ctx = MiniRacer::Context.new(timeout: 15000) ctx = MiniRacer::Context.new(timeout: 15000, ensure_gc_after_idle: 2000)
ctx.load("#{Rails.root}/lib/javascripts/messageformat.js") ctx.load("#{Rails.root}/lib/javascripts/messageformat.js")
ctx ctx
end end

View File

@ -65,7 +65,7 @@ module PrettyText
end end
def self.create_es6_context def self.create_es6_context
ctx = MiniRacer::Context.new(timeout: 25000) ctx = MiniRacer::Context.new(timeout: 25000, ensure_gc_after_idle: 2000)
ctx.eval("window = {}; window.devicePixelRatio = 2;") # hack to make code think stuff is retina ctx.eval("window = {}; window.devicePixelRatio = 2;") # hack to make code think stuff is retina