Как увеличить память EsLint, чтобы избежать «кучи JavaScript из памяти»? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь запустить EsLint для очень большого файла javascript, и процессу не хватает памяти.Чтобы дать вам представление о том, насколько большой файл, я запустил Cloc на нем, и вот вывод:

$ cloc app.js 
       1 text file.
       1 unique file.                              
       0 files ignored.

github.com/AlDanial/cloc v 1.80  T=12.81 s (0.1 files/s, 42499.8 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
JavaScript                       1           4255          23744         516524
-------------------------------------------------------------------------------

Файл весит 23 МБ.

$ ls -lAh app.js 
-rw-r--r-- 1 miguelangel staff 23M Jan 28 11:58 app.js

Все это говорит о том, что не утечка памяти в EsLint.Я видел некоторые проблемы с утечкой памяти у EsLint на Github.com.Я не думаю, что это так.

Файл такой большой, потому что он является результатом объединения многих других модулей Javascript.Моя цель здесь - попытаться найти любой неиспользуемый код.Кодовая база этого проекта явно выросла без контроля, и я пытаюсь избавиться от лишнего веса.Поэтому я пытаюсь запустить правило no-unused-vars EsLint для объединения всей базы кода.Вот мой конфигурационный файл EsLint:

.eslintrc.js

module.exports = {
    "env": {
        "browser": true,
        "commonjs": false,
        "es6": true
    },
    "parserOptions": {
        "ecmaVersion": 2015
    },
    "rules": {
        "no-unused-vars": [
            "warn"
        ]
    }
};

Этот проект не является ни Node, ни AMD проектом, поэтому я решил, что япришлось избегать ложных срабатываний всей базы кода в одном файле.

Проблема в том, что попытка запустить EsLint для этого файла приводит к ошибке JavaScript heap out of memory.

$ eslint app.js 

<--- Last few GCs --->

[60451:0x104002200]    43814 ms: Mark-sweep 1395.7 (1424.1) -> 1395.2 (1423.6) MB, 5719.6 / 0.0 ms  (+ 0.1 ms in 28 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 5755 ms) (average mu = 0.148, current mu = 0.037) alloca[60451:0x104002200]    49447 ms: Mark-sweep 1397.4 (1424.1) -> 1396.9 (1425.6) MB, 5569.8 / 0.0 ms  (+ 0.1 ms in 11 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 5598 ms) (average mu = 0.081, current mu = 0.011) alloca

<--- JS stacktrace --->

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

    0: ExitFrame [pc: 0x3275f3d4fb7d]
Security context: 0x14c691f9d969 <JSObject>
    1: /* anonymous */ [0x14c6f1b7b981] [/usr/local/lib/node_modules/eslint/node_modules/acorn/dist/acorn.js:~2868] [pc=0x3275f40f5843](this=0x14c6b794c669 <Parser map = 0x14c603088f11>)
    2: /* anonymous */ [0x14c6f1b7b111] [/usr/local/lib/node_modules/eslint/node_modules/acorn/dist/acorn.js:2190] [bytecode=0x14c691fecb01 offset=968](this=0x14c6b794c669 <...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003ace0 node::Abort() [/usr/local/bin/node]
 2: 0x10003aeb1 node::OnFatalError(char const*, char const*) [/usr/local/bin/node]
 3: 0x10018c8cf v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
 4: 0x10018c870 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
 5: 0x10047b188 v8::internal::Heap::UpdateSurvivalStatistics(int) [/usr/local/bin/node]
 6: 0x10047cc01 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/usr/local/bin/node]
 7: 0x10047a4c4 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/usr/local/bin/node]
 8: 0x100479236 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/usr/local/bin/node]
 9: 0x100481826 v8::internal::Heap::AllocateRawWithLightRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/local/bin/node]
10: 0x100481b5c v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/local/bin/node]
11: 0x100461562 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/usr/local/bin/node]
12: 0x100653464 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/local/bin/node]
13: 0x3275f3d4fb7d 
Abort trap: 6

Как я могу увеличить доступ EsLint к памяти?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Я просматривал документы EsLint, надеясь найти возможность настроить его для работы с большим объемом памяти.К сожалению, я не смог найти ничего подобного.

Однако, вдохновленный ответом @ vsemozhetbyt - отсюда и голосованием - я начал смотреть на параметры конфигурации Node и нашел способ обойти это.используя переменную окружения NODE_OPTIONS узла .

Список параметров командной строки, разделенных пробелами.параметры ... интерпретируются так, как если бы они были указаны в командной строке до фактической командной строки

Так вот что я сделал:

$ export NODE_OPTIONS="--max-old-space-size=4096"
$ echo $NODE_OPTIONS
--max-old-space-size=4096
$ eslint app.js

Таким образом, узелпроцесс, который запускает EsLint, просто подхватывает это без необходимости вводить флаг --max-old-space-size или путь к двоичному файлу узла каждый раз, когда я запускаю EsLint.

0 голосов
/ 15 мая 2019

Если все ответы об увеличении Node --max_old_space_size не помогут, стоит взглянуть на это с другой стороны. Возможно, существует так много ошибок, что куче узлов действительно не хватает памяти.

У меня была такая ситуация:

Я присоединился к большому проекту с большим количеством .js /файлы .vue.В .eslintrc было "linebreak-style": [2, "unix"], что означает, что символ конца строки должен быть lf. Я использую Windows, где символ eol равен crlf.Git по умолчанию конвертирует все в crlf.Поэтому, когда я клонировал этот проект из git, я увидел много предупреждений от Eslint о неправильном символе eol в коде Visual Studio, но eslint из консоли всегда заканчивалось heap out of memory.

Для вышеуказанной ситуации ни один из советов о node out of memory не помог, потому что проблема была в другом месте.

0 голосов
/ 30 января 2019

По умолчанию Node.js устанавливает предел памяти около 1,5 ГБ.Вы можете увеличить его на ключ --max_old_space_size (скажем, --max_old_space_size=4096 для использования 4 ГБ).

Чтобы использовать ключ, вам нужно знать путь к основному файлу ESLint и вызывать его как скриптпуть:

node --max_old_space_size=4096 ./node_modules/eslint/bin/eslint.js app.js
...