Skip to content

JavaScript heap out of memory #372

@quentincaffeino

Description

@quentincaffeino

How do we reproduce the issue?

We'll likely need to know:

  1. Your Rollup configuration.
import svelte from 'rollup-plugin-svelte'
import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import livereload from 'rollup-plugin-livereload'
import { terser } from 'rollup-plugin-terser'
import postcss from 'rollup-plugin-postcss'
import autoPreprocess from 'svelte-preprocess'
import copy from 'rollup-plugin-cpy'
import replace from '@rollup/plugin-replace'
import babel from 'rollup-plugin-babel'
import visualizer from 'rollup-plugin-visualizer';
import compiler from '@ampproject/rollup-plugin-closure-compiler';
import rimraf from 'rimraf'

rimraf('./public/js', {}, () => console.log('removed public/js'))
require('dotenv').config();


const production = !process.env.ROLLUP_WATCH;


function getOutput(production) {
    let output = {
        dir: "public/js/module",
        format: "es",
        sourcemap: !production,
        chunkFileNames: '[name].js'
    };

    if (production) {
        output = [
            output,
            {
                dir: "public/js/nomodule",
                format: "system",
                chunkFileNames: '[name].js'
            }
        ]
    }

    return output
}


function getReplacePlugin() {
    return replace({
        values: {
            'process.env.NODE_ENV': production ? '\"production\"' : '\"development\"',
            ENV_IS_PROD: production,
            PROD_BASEPATH: process.env.PROD_BASEPATH,
            API_ENDPOINT: process.env.API_ENDPOINT,
            MOCK_API: process.env.MOCK_API
        },
        exclude: './node_modules/**'
    })
}


function getPlugins(additionalPlugins = []) {
    return [
        getReplacePlugin(),

        babel({
            extensions: ['.ts', '.js'],
            exclude: './node_modules/**'
        }),

        // If you have external dependencies installed from
        // npm, you'll most likely need these plugins. In
        // some cases you'll need additional configuration -
        // consult the documentation for details:
        // https://github.com/rollup/plugins/tree/master/packages/commonjs
        resolve({
            browser: true,
            dedupe: ['svelte']
        }),
        commonjs({ extensions: ['.js', '.ts'] }),

        ...additionalPlugins,

        // If we're building for production (npm run build
        // instead of npm run dev), minify
        production && terser()
    ]
}


export default [
    {
        input: 'src/main.ts',
        output: getOutput(production),
        plugins: getPlugins([
            svelte({
                preprocess: autoPreprocess({
                    postcss: true
                }),
                // enable run-time checks when not in production
                dev: !production,
                // we'll extract any component CSS out into
                // a separate file - better for performance
                css: css => {
                    css.write('public/css/app.css');
                }
            }),

            copy([
                { files: './src/manifest.json', dest: './public' },
                { files: './src/assets/images/**/*', dest: './public/images' }
            ]),

            postcss({
                extract: 'public/css/vendor.css',
                minimize: production,
                sourceMap: !production,
            }),

            !production && visualizer({
                filename: './public/visualizer.html'
            }),

            // In dev mode, call `npm run start` once
            // the bundle has been generated
            !production && serve(),

            // Watch the `public` directory and refresh the
            // browser on changes when not in production
            !production && livereload({
                watch: 'public',
            }),

            production && compiler()
        ]),
        manualChunks(id) {
            if (id.includes('zxcvbn')) {
                return;
            }

            if (id.includes('node_modules')) {
                return 'vendor';
            }
        }
    }
];

function serve() {
    let started = false;

    return {
        writeBundle() {
            if (!started) {
                started = true;

                require('child_process').spawn('yarn', ['serve', '--', '--dev'], {
                    stdio: ['ignore', 'inherit', 'inherit'],
                    shell: true
                });
            }
        }
    };
}
  1. Error logs from your console when invoking Rollup with this plugin present.
<--- Last few GCs --->

[26287:0x41b2970]   110310 ms: Mark-sweep 2048.0 (2053.8) -> 2047.5 (2054.3) MB, 2074.6 / 0.0 ms  (+ 45.0 ms in 11 steps since start of marking, biggest step 12.8 ms, walltime since start of marking 2337 ms) (average mu = 0.112, current mu = 0.093) alloca[26287:0x41b2970]   112686 ms: Mark-sweep 2048.5 (2054.3) -> 2048.3 (2055.0) MB, 2232.3 / 0.0 ms  (+ 65.5 ms in 15 steps since start of marking, biggest step 11.4 ms, walltime since start of marking 2376 ms) (average mu = 0.072, current mu = 0.033) alloca

<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x13c03d9]
    1: StubFrame [pc: 0x136f7a6]
    2: StubFrame [pc: 0x1423fcb]
Security context: 0x0e139eac08d1 <JSObject>
    3: enter [0x1d5b63285651] [/home/.../node_modules/@ampproject/rollup-plugin-closure-compiler/dist/index.js:1] [bytecode=0x878d4e4db89 offset=6](this=0x1d5b63285b51 <Object map = 0x3c4e720dbb49>,0x29ab41effa61 <Node map = 0x2bb5fcc357c9>)
    4: vis...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

Writing Node.js report to file: report.20200430.153057.26287.0.001.json
Node.js report completed
 1: 0xa02f90 node::Abort() [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
 2: 0xa033b5 node::OnFatalError(char const*, char const*) [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
 3: 0xb76ffe v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
 4: 0xb77379 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
 5: 0xd23ad5  [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
 6: 0xd24166 v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
 7: 0xd309e5 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
 8: 0xd31895 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
 9: 0xd3434c v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
10: 0xcfaf1b v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationType, v8::internal::AllocationOrigin) [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
11: 0x103d85e v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
12: 0x13c03d9  [/usr/local/lib/nodejs/node-v12.16.2-linux-x64/bin/node]
Aborted
error Command failed with exit code 134.
  1. Error logs when this plugin is removed from your Rollup configuration.

When I remove compiler logs are fine.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions