1

我对 node.js 比较陌生,并且已经构建了一个应用程序,该应用程序旨在部署为独立应用程序,而无需安装 node.js 或其任何依赖项。

我遇到了一个问题,在特定的、不易重现的实例中,应用程序崩溃并且我收到“Javascript 堆内存不足”错误。

在调试根本原因时,我正在尝试增加堆大小。我正在使用 node-windows 将应用程序作为服务运行,并使用 nexe 来构建。我已经尝试了很多我在其他论坛回复中发现的东西,包括:

  • 各种版本的 Python 2x 和 3x
  • 在构建脚本中运行 "build": "nexe --enableNodeCli --build" 并将 --max-old-space-size=4096 添加到快捷方式目标
  • 升级(并最终回滚)Node.js
  • 在 Windows 环境变量中将 --max-old-space-size=4096 添加到 NODE_OPTIONS

..等等。这些似乎只是建议的最常见的解决方案。

其中一些解决方案导致无法运行构建。其他人运行,但内存保持在 1.5 GB 左右。

有没有人遇到过这个问题并找到了一个可以增加应用程序堆内存的解决方案:

  1. 在没有 Node 的环境中运行
  2. 作为 Windows 服务运行

……

  • 操作系统:Windows 10
  • 节点:10.22.1(也试过12.19.0)
  • 下一个: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`);
    }
4

1 回答 1

0

您可以提供node-windows一些可以设置变量的选项--max-old-space-size

const options= {
    name: 'Service',
    description: 'Service',
    nodeOptions: [
        '--max-old-space-size=4096'
    ]
}
const service = require('node-windows').Service;
const svc = new Service(options);
于 2020-10-22T14:33:56.720 回答