Tag: v8

在asynchronous插件中正确使用HandleScope

我正在编写一个asynchronous节点插件,但我一直在努力弄清楚,如果我需要在调用客户端JavaScriptcallback的“After”函数中使用HandleScope。 我已经看过有没有新范围的示例,但从来没有解释为什么。 这里是一个例子: void asyncWorkAfter(uv_work_t* req) { HandleScope scope; // <– Do you need a new scope? const int argc = 1; Local<Value> foo = String::New("foo"); Local<Value> argv[] = { foo }; // assume I got my callback function out of req callback->Call(Context::GetCurrent()->Global(), argc, argv); callback.Dispose(); // if i use a new HandleScope, what happens […]

这个function可以被垃圾收集吗?

考虑一下这个蛋糕…嗯,代码: 'use strict' function doWork () { return new Promise(function (resolve, reject) { // work work work… // Done! But… where's the resolve() ??? }) } doWork().then(function doMoreWork () { // Some more work to do… }) 一旦Promise的构造函数中的函数完成… Promise对象是垃圾回收对象吗? doMoreWork()垃圾回收的吗? 我的猜测是doMoreWork()不能直接进行GC编辑,因为Promise保留了对它的引用,但是一旦promise的主体完成并将执行上下文返回到上层(?)作用域,栈就会展开(因为没有更多声明在这里执行),Promise变得无法访问,因此被垃圾收集。 你能证实我对这个话题的理解是正确的吗? 我怎么能凭经验观察这种行为? 换句话说,我该如何监控哪些对象正在进行GC编辑以及何时? 我纯粹在Node.js中开发,如果这有什么区别的话。

Node.js堆内存限制为单个对象

v8是否对单个对象的堆分配有限制? a = new Array(1024*1024*102) 在节点命令行上失败 FATAL ERROR: JS Allocation failed – process out of memory 而且,当以脚本运行时,这会失败并出现相同的错误 node –expose-gc –nouse-idle-notification –max-old-space-size=8192 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory var util = require('util'); o = {}; while(1) { o["hahahahahaha" + String(ctr)] = ctr; ctr++; if (ctr % 100000 === 0) { console.log(util.inspect(process.memoryUsage())); if […]

当进程内存不足时如何处理V8引擎崩溃

节点控制台和Qt5的基于V8的QJSEngine都可以通过以下代码崩溃: a = []; for (;;) { a.push("hello"); } 崩溃前的节点输出: FATAL ERROR: JS Allocation failed – process out of memory 崩溃之前QJSEngine的输出: # # Fatal error in JS # Allocation failed – process out of memory # 如果我在debugging器下运行我的QJSEnginetesting应用程序(见下文),它会在V8代码中显示v8::internal::OS::DebugBreak调用。 如果我将调用QJSEngine::evaluate的代码QJSEngine::evaluate到__try-__except ( SEH ),那么应用程序不会崩溃,但是这个解决scheme是Windows特有的。 问:有没有办法在节点和Qt应用程序中以独立于平台的方式处理v8::internal::OS::DebugBreak ? === QJSEnginetesting代码=== 开发环境:在Windows XP SP3上使用Qt5和Windows SDK 7.1的QtCreator QJSEngineTest.pro: TEMPLATE = app QT […]

.pipe()是否在node.js中执行memcpy?

这是关于系统级优化的概念性查询。 通过阅读NodeJS文档,我的理解是pipe道很方便地在stream上执行stream量控制。 背景:我有麦克风stream,我想避免额外的复制操作,以节省整体系统MIPS。 据我所知,对于audiostream,即使有一个memcopy,但是我并没有花费大量的MIPS,但是我也有一个扩展计划,以30fps和UHD分辨率在相机帧中进行stream式处理。 以30fps制作UHD分辨率像素数据的多个副本是非常低效的,所以需要一些build议。 示例代码: var spawn = require('child_process').spawn var PassThrough = require('stream').PassThrough; var ps = null; //var audioStream = new PassThrough; //var infoStream = new PassThrough; var start = function() { if(ps == null) { ps = spawn('rec', ['-b', 16, '–endian', 'little', '-c', 1, '-r', 16000, '-e', 'signed-integer', '-t', 'raw', '-']); //ps.stdout.pipe(audioStream); //ps.stderr.pipe(infoStream); […]

用v8来分析nodejs

我有一个节点应用程序,我想使用节点分析器进行configuration文件。 所以,我跑了: node –prof v8test.js 然后,我下载了V8工具 svn checkout http://v8.googlecode.com/svn/trunk/ v8; make dependencies; make native; 然后尝试分析创build的文件(v8.log) tools/linux-tick-processor ../v8.log 但是我得到了很多: Code move event for unknown code: 0x289dd8475560 Code move event for unknown code: 0x289dd84758e0 Code move event for unknown code: 0x289dd8479280 Code move event for unknown code: 0x289dd8482980 Code move event for unknown code: 0x289dd84c2a80 line 718730: […]

Javascript / Node.js引擎如何在内存中存储JSON?

我有一个70 MB的JSON文件,我从一个Node.js脚本读取并分配给一个variables。 console.log(process.memoryUsage()); let data=require('../newJSON.json'); console.log(process.memoryUsage()); 输出: { rss: 28184576, heapTotal: 6283264, heapUsed: 4199672, external: 8252 } { rss: 724721664, heapTotal: 695595008, heapUsed: 663708016, external: 8252 } 看来,70 MB的JSON需要632 MB的内存。 我有兴趣了解JSON如何通过Node Js / Javascript存储到内存中?

JavaScript标准库V8

在我的应用程序中,我允许用户使用JavaScript编写插件。 为此我embedded了V8。 问题是开发人员不能使用像HTTP,套接字,stream,定时器,线程,Crypotography,unit testing等等。 我search堆栈溢出,我发现node.js。 它的问题是,你可以真正创build HTTP服务器,并启动进程和更多的东西,我不想让。 另外,node.js有自己的环境( ./node script.js ),你不能embedded它。 而且它不支持Windows – 我需要它是完全跨平台的。 如果这些问题可以解决,那就太棒了:)但是我也对其他框架开放。 有任何想法吗? 谢谢!

V8caching是否自动编译正则expression式?

所以我知道在JavaScript中实例化一个正则expression式会导致它被自动编译,如果这个正则expression式存储在一个variables中,它将被重用而不用重新编译。 例: var re = /[Ff]oo|[Bb]ar/; "Foo".match(re); // ["Foo"] "Baz".match(re); // null 但是,重新编译的正则expression式是重复的还是V8(Chrome / Node.js)智能地重新使用它们(就像PHP与preg_ *函数一样)? function isFooBar(str) { return str.match(/[Ff]oo|[Bb]ar/); } isFooBar("Foo"); // ["Foo"] isFooBar("Baz"); // null 所以为了澄清,我知道第一个例子导致了正则expression式的汇编。 但是第二个例子呢?

节点与Chrome,将console.log分配给一个variables?

当我将console.log分配给node.js中的variables时,它工作正常, var l = console.log l(1) # outputs 1 但是,如果我在Chromium 30的开发工具中做同样的事情, var l = console.log l(1) # TypeError: Illegal invocation 如何在Chromium的开发工具中不起作用? 为什么我得到, TypeError:非法调用