title: JS heap out of memory for Angular testing
body: <p>I have a memory issue I'm trying to figure out and I don't really know where to start. When I'm running tests, I get a JS heap issue and my tests will error out without ever running. My hunch is that it is being caused by a very large strings file that I use for internationalization. This is an inherited project so I'll outline what currently happens and maybe someone can help me figure out a way to make it better.</p>
  
  <p><strong>In the main application</strong></p>
  
  <p>A file <code>inject.en.js</code> is a 2.2MB <code>json</code> file containing translated strings for the application.</p>
  
  <pre><code>var INJECT_en = { ... };
  </code></pre>
  
  <p>To have it available as early as possible, it is included as a global <code>var</code> in the applications <code>index.html</code></p>
  
  <pre><code>&lt;script src="js/languages/hybrid.inject.en.js" type="text/javascript"&gt;&lt;/script&gt;
  </code></pre>
  
  <p>It is then used to build up a global config object.</p>
  
  <pre><code>var windowJS =  new WindowService().nativeWindow;
  var HybridInject = windowJS.HybridInject_en; // custom app strings
  var INJECT = windowJS.INJECT_en;
  var startInjector = _.merge(_.clone(HybridInject), _.clone(INJECT));
  
  export const CONFIG: ConfigType = {
      ...
      strings: populateStrings(startInjector),
      ...
  
  }
  </code></pre>
  
  <p><strong>For testing</strong></p>
  
  <p>I'm using Jest for testing this application for a number of reasons. I tried a few things to set Jest up to have those files available in the same way when the <code>CONFIG</code> is build and I settled on the following for my <code>jestGlobalMocks.ts</code>.</p>
  
  <p>I copied the files into a testing directory and converted them to <code>export</code> the object.</p>
  
  <pre><code>export const INJECT_en = { ... }
  </code></pre>
  
  <p>Then made them available to the <code>CONFIG</code> build by making them available on the window.</p>
  
  <pre><code>Object.defineProperty(window, 'HybridInject_en', {value: HybridInject_en});
  Object.defineProperty(window, 'INJECT_en', {value: INJECT_en});
  </code></pre>
  
  <p><strong>The result</strong></p>
  
  <p>When tests are run, I get the following output</p>
  
  <pre><code>[BABEL] Note: The code generator has deoptimised the styling of "jest/configs/inject.en.ts" as it exceeds the max of "500KB".
  
  
  
  &lt;--- Last few GCs ---&gt;
  
  
  
  [208:0x37d62f0]    86678 ms: Scavenge 1384.7 (1422.5) -&gt; 1383.8 (1423.0) MB, 11.5 / 0.1 ms  (average mu = 0.143, current mu = 0.101) allocation failure 
  
  [208:0x37d62f0]    86694 ms: Scavenge 1384.7 (1423.0) -&gt; 1383.9 (1423.5) MB, 13.5 / 0.1 ms  (average mu = 0.143, current mu = 0.101) allocation failure 
  
  [208:0x37d62f0]    86710 ms: Scavenge 1384.9 (1423.5) -&gt; 1384.2 (1424.0) MB, 13.5 / 0.1 ms  (average mu = 0.143, current mu = 0.101) allocation failure 
  
  
  
  
  
  &lt;--- JS stacktrace ---&gt;
  
  
  
  ==== JS stack trace =========================================
  
  
  
      0: ExitFrame [pc: 0x255fdc5dbe1d]
  
  Security context: 0x0e1a9b79e6e1 &lt;JSObject&gt;
  
      1: SourceMapConsumer_allGeneratedPositionsFor [0x32dd014cb6a1] [/var/jenkins_home/workspace/base_jenkins-build/node_modules/source-map/lib/source-map-consumer.js:~178] [pc=0x255fdcb3491a](this=0x0319d2aa8031 &lt;BasicSourceMapConsumer map = 0x68f75371d81&gt;,aArgs=0x1954c0c022a9 &lt;Object map = 0x68f75372671&gt;)
  
      2: /* anonymous */(aka /* anonymous */...
  
  
  
  FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
  
   1: 0x8daaa0 node::Abort() [node]
  
   2: 0x8daaec  [node]
  
   3: 0xad73ce v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
  
   4: 0xad7604 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
  
   5: 0xec4c32  [node]
  
   6: 0xec4d38 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [node]
  
   7: 0xed0e12 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
  
   8: 0xed1744 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
  
   9: 0xed43b1 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [node]
  
  10: 0xe9d834 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [node]
  
  11: 0x113cf9e v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [node]
  
  12: 0x255fdc5dbe1d 
  
  Aborted
  
  npm ERR! Test failed.  See above for more details.
  </code></pre>