在向Webworker发送大量postMessage之后,我得到了异常中止和stacktrace,如下所示。 我将间隔时间从250ms减少到6ms,然后这个问题出现的时间更早了,大约是45分钟,而不是6-9小时。
代码很简单
mainapp.js
*(a + ((dia) * (n) + (dia))
myappwebworker.js
((dia) * (n) + (dia)
这是什么原因?我是否由于垃圾收集器没有时间运行或类似原因而耗尽堆内存?在任何情况下都可以采取什么措施来防止这种情况发生?
这是最初的问题,直到我根据发现进行更新
标题: nodejs webworker-threads调试,从哪里开始?
如果在运行Nodejs应用程序7-8小时后获得了此类堆栈跟踪信息,该如何开始对其进行调试以找到代码中的罪魁祸首?
const Worker = require('webworker-threads').Worker;
var myappwebworker = new Worker('./myappwebworker.js');
myappwebworker.addEventListener('message', function(e) {
console.log(e)
});
setInterval(function() {
myappwebworker.postMessage('hello');
}, 250); // or 5 for abort in about 45min
这是一个类似的堆栈跟踪
self.addEventListener('message', function(e) {
self.postMessage('You said: ' + e.data);
}, false);
每秒至少有4条消息发布到Webworker和代码
以这种方式设置网络工作者
node[3836]: ../src/node_platform.cc:414:std::shared_ptr<node::PerIsolatePlatformData> node::NodePlatform::ForIsolate(v8::Isolate*): Assertion `data' failed.
1: 0x8dc510 node::Abort() [node]
2: 0x8dc5e5 [node]
3: 0x965687 node::NodePlatform::CallOnForegroundThread(v8::Isolate*, v8::Task*) [node]
4: 0xeda2ab v8::internal::IncrementalMarking::Start(v8::internal::GarbageCollectionReason) [node]
5: 0xed4b6c v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
6: 0xed7371 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [node]
7: 0xeac650 [node]
8: 0xeac6e7 v8::internal::Factory::NewJSObject(v8::internal::Handle<v8::internal::JSFunction>, v8::internal::PretenureFlag) [node]
9: 0xae84ae v8::Object::New(v8::Isolate*) [node]
10: 0x7ff7eb5f0913 BSONDeserializer::DeserializeDocumentInternal(bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
11: 0x7ff7eb5f0b97 BSONDeserializer::DeserializeDocument(bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
12: 0x7ff7eb5f0f40 BSONDeserializer::DeserializeValue(BsonType, bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
13: 0x7ff7eb5f0946 BSONDeserializer::DeserializeDocumentInternal(bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
14: 0x7ff7eb5f0b97 BSONDeserializer::DeserializeDocument(bool) [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
15: 0x7ff7eb5f3bcf [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
16: 0x7ff7eb5f4519 [/home/ubuntu/myapp/node_modules/webworker-threads/build/Release/WebWorkerThreads.node]
17: 0x7ff7f25536ba [/lib/x86_64-linux-gnu/libpthread.so.0]
18: 0x7ff7f228941d clone [/lib/x86_64-linux-gnu/libc.so.6]
其他事件也会触发向工作人员发送消息。系统是Ubuntu 16.04和节点V10.15.3
在节点中,什么是找出导致此问题的最佳方法?
答案 0 :(得分:0)
想到两件事。
setInterval()
我相信,不会在乎内部代码是被执行还是阻塞(也就是说,在不应该阻塞的时候阻塞或者阻塞太久)。
如果阻塞超过 250 毫秒,您将构建堆栈。也许这样的代码会给你更好的调试体验,如果 postMessage 停止,你就不会建立堆栈:
function doIt() {
mywebworker.postMessage('hello');
setTimeout(function() {
doIt();
},250);
}
doIt();