私は node.js に比較的慣れていませんが、node.js やその依存関係をインストールする必要なく、スタンドアロン アプリケーションとしてデプロイされるように設計されたアプリを構築しました。
特定の、簡単に再現できないインスタンスで、アプリがクラッシュし、「Javascript ヒープがメモリ不足です」というエラーが発生するという問題が発生しています。
根本原因をデバッグしている間、ヒープ サイズを増やそうとしています。node-windows を使用してアプリケーションをサービスとして実行し、nexe をビルドしています。他のフォーラムの回答で見つけた、次のような多くのことを試しました。
- Python 2x & 3x のさまざまなバージョン
- ビルド スクリプトで "build": "nexe --enableNodeCli --build" を実行し、ショートカット ターゲットに --max-old-space-size=4096 を追加します。
- Node.js のアップグレード (および最終的にはロールバック)
- --max-old-space-size=4096 を Windows 環境変数の NODE_OPTIONS に追加
..とりわけ。これらは、提案されている最も一般的なソリューションのようです。
これらのソリューションの一部では、ビルドを実行できませんでした。その他は動作しますが、メモリは約 1.5 GB のままです。
誰かがこの問題に遭遇し、アプリのヒープメモリを増やす解決策を見つけました:
- ノードのない環境で実行
- Windows サービスとして実行
……
- OS: Windows10
- ノード: 10.22.1 (12.19.0 も試しました)
- Nexe: 3.3.7
- Python: 2.7.17 (2.7.16、2.7.14、3.7、3.8 & 3.9 も試しました)
……
編集: nodeOptions: ['--max-old-space-size=4096'] をサービス オプションに追加しようとしましたが、v8.getHeapStatistics からサイズが約 1.42 GB であるというフィードバックが得られます。これまでは index.js 内でサービスを作成し、それを実行可能ファイルにビルドしてきましたが (node.js をインストールする必要がないようにするため)、それを独自のスクリプトに分離し、コンソールで実行しました - 同じ結果です。
コードは次のとおりです。
const fs = require('fs');
const v8 = require('v8');
const Service = require('node-windows').Service
var svc = new Service({
name: 'VDE',
description: 'VDE',
script: __dirname + '/index.js',
execPath: __dirname + '/VDE.exe',
abortOnError: false,
nodeOptions: [
'--max-old-space-size=4096'
]
})
var EventLogger = require('node-windows').EventLogger;
var log = new EventLogger('VDE Event Log');
svc.on('install',function(){
svc.start();
});
svc.on('start',function(){
log.info(`VDE is running.`);
checkUsage()
})
svc.on('error',function(err){
log.error(`Error: ${err}`);
})
svc.on('stop',function(){
log.warn(`Service has stopped.`);
svc.start();
})
if (svc.exists == false){
svc.install();
log.info(`Windows service for VDE does not exist. Installing now....`);
}else{
log.info(`Windows service for VDE already exists!`);
svc.start();
};
function checkUsage(){
let heapSize = (v8.getHeapStatistics().heap_size_limit / 1024 / 1024 / 1024).toFixed(2);
log.info(`Heap: is ~${heapSize} GB`);
}