rollup-plugin-closure-compiler icon indicating copy to clipboard operation
rollup-plugin-closure-compiler copied to clipboard

JavaScript heap out of memory

Open quentincaffeino opened this issue 4 years ago • 5 comments

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.

quentincaffeino avatar Apr 30 '20 13:04 quentincaffeino

I also have this in a project where there are a lot of SCSS imports, with a long tree dependency when I turn off almost all SCSS imports it compiles fine.

I didn't come up with an idea of what is it...

tarsisexistence avatar May 02 '20 08:05 tarsisexistence

What closure compiler has to do with CSS imports?

quentincaffeino avatar May 02 '20 12:05 quentincaffeino

I can’t say that I am good at the closure compiler. In this regard, I am a complete beginner

but it seems to me that the problem is related to the circular dependency

usually, if I got similar errors, they were always related to the circular dependency and most likely my problem is precisely this

tarsisexistence avatar May 02 '20 13:05 tarsisexistence

Apologies for delays looking into this. I’m out on paternity leave, but will try to address as soon as I can.

kristoferbaxter avatar May 03 '20 05:05 kristoferbaxter

No worries. Thanks for your time.

Also I tried some more: If I run compiler in dev environment it runs fine. Even in advanced mode. Then it has undefined regeneratorRuntime but that's probably an issue with my babel setup.

quentincaffeino avatar May 07 '20 10:05 quentincaffeino