Tag: v8

Javascript eval()exception – 行号

在JavaScript中,我有一个var str = ".a long string that contains many lines…"在由eval(str);引起的exception的情况下eval(str); 我想赶上它,并打印导致exception的行号。 (str的内部线..) 可能吗? 编辑作为JavaScript的一个应用服务器的Alligator项目( http://github.com/mrohad/Alligator )的一部分,我正在从磁盘读取文件和eval()任何嵌套到scriplet(<??>) ) 我正在浏览器外部使用NodeJS(在V8之上)运行这个脚本。

configurationv8的内存pipe理对于node.js进程来说是明智的

我们在node.js上运行一台XMPP服务器,这台服务器的内存大约为3.8 GB。 以下是我们在调用节点时传递的命令行参数:/ opt / node / bin / node –max-old-space-size = 3000 –trace-gc –trace -gc-verbose main.js 但是,我们经常需要在这个过程中看到超过10秒的gc暂停(有时甚至超过1分钟gc暂停,我们的服务器除了运行GC之外什么都不做)。 发生这种情况时,我们的过程就是正常的内存消耗:大约1 GB的堆使用率。 这个过程大约有2GB或者可用空间,但是这个过程并没有使用它,花了一分钟的时间来释放内存。 看看由-trace-gc-verbose选项给出的gc trace,看起来大约有2 GB的可用空间被标记为“大对象空间”,并没有被使用,因为没有那么多的大对象。 虽然这个过程迫切需要更多的“旧指针”和“旧数据空间”的内存,但是这个“大对象空间”中的空闲内存没有被使用。 这是gc在这个过程中长时间停顿的时间之一留下的痕迹: 91635809 ms:标记扫描968.8(1039.0) – > 958.5(1038.0)MB,1/410 ms(自标记开始以来的79个步骤中+ 2287 ms,最大步骤140.227051 ms)[idle notification:finalize incremental]请求的空间]。 内存分配器,使用:1088446464,可用:2124390400 新的空间,使用:192,可用:8388416 老指针,使用:633992112,可用:10460240,浪费:0 旧的数据空间,使用:315819248,可用:149776,浪费:0 代码空间,使用:5867936,可用:1271392,浪费:0 使用的地图空间:10257976,可用:6384072,浪费:0 单元格空间使用:175936,可用:954304,浪费:0 大对象空间,使用:51413600,可用:2123325184 91636499 ms:清除965.5(1038.0) – > 964.6(1038.0)MB,17 ms(从上次GC开始的10个步骤中为+ 109 ms)[Runtime :: PerformGC]。 […]

如何检查NodeJS中的JSON是否为空?

我有一个函数,检查请求是否有任何疑问,并做了不同的行动基于此。 目前,我有if(query)做这个别的东西。 但是,似乎没有查询数据时,我最终得到一个{} JSON对象。 因此,我需要replaceif(query) if(query.isEmpty())或类似的东西。 任何人都可以解释我怎么可以在NodeJS做这个? V8 JSON对象是否有这种function?

为什么Node.JS中的V8比我的本地C ++插件更快?

为什么我的C ++插件中的Google V8 JavaScript引擎的工作速度比Node.JS慢得多? 我试着编写一些简单的代码来生成JavaScript中的素数,并通过C ++插件在V8中直接在Node.JS中运行它。 我感到非常震惊,因为它们都应该使用相同的JavaScript引擎,并且都执行相同的代码(时间以毫秒为单位)。 V8 in Node.JS: 495517 V8 in Node.JS C++ Addon: 623598 这里是运行相同的JavaScript代码的JavaScript模块和C ++插件的源代码(我认为问题不在互操作中,因为时间的测量直接在JS中工作): index.js : var jsInNodeJsPrimeGeneratorBenchmark = require("./javascript.js"); var jsInNativePrimeGeneratorBenchmark = require("./native"); console.log("V8 in Node.JS: ", jsInNodeJsPrimeGeneratorBenchmark.primeGeneratorBenchmark()); console.log("V8 in Node.JS C++ Addon: ", jsInNativePrimeGeneratorBenchmark.primeGeneratorBenchmark()); javascript.js : function primeGeneratorBenchmark() { var result, primeNumberCounter, i, j, isPrime, start, end; i […]

什么是一个Node.js缓冲区的最大大小

根据Node.js缓冲区类文档缓冲区分配在V8堆的外部。 http://nodejs.org/docs/latest/api/buffers.html 原始数据存储在Buffer类的实例中。 缓冲区类似于整数数组,但对应于V8堆外部的原始内存分配。 缓冲区不能resize。 我需要读一个大文件(大于1GB),并尝试使用fd.readPath(),但从V8得到一个致命的错误,因为该文件大于1GB。 FATAL ERROR: v8::Object::SetIndexedPropertiesToExternalArrayData() length exceeds max acceptable value 这是由Googlelogging的。 http://code.google.com/p/v8/issues/detail?id=847 我想我会使用一个缓冲区,我正在运行一个64位版本的节点0.6.7,所以我的堆应该能够处理大文件。 $ file `which node` /usr/local/bin/node: Mach-O 64-bit executable x86_64 $ 但是,如果我尝试分配一个1GB的缓冲区,我得到同样的致命错误的V8。 var oneGigInBytes = 1073741824; var my1GBuffer = new Buffer(oneGigInBytes); //Crash //var mySmallerBuffer = new Buffer(oneGigInBytes-1); //Works console.log("done"); 如果一个缓冲区被分配到V8堆的外部,我想我可以分配一个大于1GB限制的缓冲区大小,但是上面的代码与readPath()打印的是相同的确切错误。 注释掉my1GBuffer实例并取消注释mySmallerBuffer的工作,所以看起来1GB是有限制的。 什么是Node.js缓冲区类实例的最大大小? 它是封顶在1GB? 我目前的解决方法是使用读取stream和和fs.pipe()。 var fs = require('fs'); process.chdir("/Users/joel/Desktop/testFiles/"); […]

nodejs内存不足

今天我遇到一个奇怪的问题。 这对其他人来说可能是一个简单的答案,但是却让我难住了。 为什么下面的代码会导致内存错误? var cur = 167772160; var bcast = 184549375; var addresses = []; while (cur <= bcast){ cur += 1; addresses.push(cur); } addresses.length addresses // memory goes from a few megs to over a gig in seconds when trying to print this 我得到这两个错误之一…第一次,当我在节点的解释器中运行此代码和后者时,我通过nodeunit运行它: 致命错误:CALL_AND_RETRY_2分配失败 – 进程内存不足 致命错误:JS分配失败 – 进程内存不足

从v8 :: Arguments转换为C ++types

我正在用C ++创buildNode.js模块,但我难住了v8 :: Arguments类。 比方说,我有一个JavaScript类发送电子邮件,它有一个这样的签名方法: Mailer::sendEmail(Array recipients, String sender, String message); 这将被称为是这样的: mailer.sendEmail(["joe@gmail.com", "sally@gmail.com"], "fred@gmail.com", "Hi there"); 现在在C ++的土地,我有一个类签名function: SendEmail(const v8::Arguments& args) 这是支持我的梅勒:: sendEmail方法在Javascript土地。 SendEmail函数将创build我的Emailer类的新实例,它本身具有带有此签名的类函数: send(std::list<std::string> recipients, std::string from, std::string message) 而这就是我迷失的地方。 我不知道如何从args中取值,并将它们转换成常规的C ++types,所以我可以将值传递给我的发送函数。 据我所知,传递给Mailer :: sendEmail的3个值将在args [0] , args [1]和args [2]中可用。 我甚至明白,我可以做一些types检查, if (!args[0]->IsArray()) ,但实际上转换args [0]为std::list<std::string>是我不知道如何去做。 编辑:我发现这样做的一个hackish的方式,但我仍然认为V8有一些内置的方法来处理这个更清洁的方式。 static Handle<Value> SendEmail(const Arguments& args) { HandleScope […]

为什么node.js不具有本地DOM?

当我发现NodeJS是build立在V8 Javascript引擎上的时候,我认为“好的,网页抓取将会更容易,因为页面将会像浏览器一样呈现,其中支持XPath的”原生“DOM以及页面中的任何AJAX调用执行“。 为什么当它使用与Chrome相同的JS引擎时,它不具有本地DOM? 同样,为什么它没有在检索页面中运行JS的模式? 我不理解JavaScript引擎与Web浏览器中的引擎? 🙂 非常感谢!

垃圾收集与node.js

我很好奇嵌套函数的node.js模式如何与v8的垃圾收集器一起工作。 这是一个简单的例子 readfile("blah", function(str) { var val = getvaluefromstr(str); function restofprogram(val2) { … } (val) }) 如果restofprogram长时间运行,是不是意味着str永远不会收集垃圾? 我的理解是,对于节点,最终会嵌套function。 如果restofprogram在外部声明,这是否会收集垃圾,所以str不能在范围内。 这是一个推荐的做法? 编辑我没有打算使问题变得复杂。 那只是粗心,所以我修改了它。

如何在node.js沙箱中安全地运行用户提交的脚本?

在node.js中运行(可能是恶意的)用户提交的脚本有什么select,安全吗? 也就是说,在阻止代码访问敏感数据和API的环境中? vm.runInNewContext(userScript, {})是一个很有吸引力的起点,但似乎有一些已知的问题 。 沙盒模块看起来很有趣,但也使用runInNewContext() ,所以我有点怀疑它。