首页 > 解决方案 > nodejs正则表达式杀死进程

问题描述

我正在使用带有 VS Code 的 nodejs v10.13.0 作为我的 IDE。

当我运行我的 nodejs 程序时,它在这一行退出:

let matches = address.match(reallyCrazyLongRegex);

在 VS Code Terminal 然后我运行

>> echo %ERRORLEVEL%
-1073741819

请注意,如果我将 realCrazyLongRegex 替换为 reallySimpleTestingRegex,它会正常运行。

谢谢,瑞安

编辑:地址是邮寄地址

正则表达式:

 let reallyCrazyLongRegex = new RegExp([arrayOfEveryCityNameInTheUSA].map(function (v)
            {
                return "([ ]+|^)" + v + "([ ]+|$)";
            }).join("|"), "ig");

很简单,就是很长。

Edit2:我已将其拆分为多个正则表达式(每 1000 个名称),它在大多数情况下都有效,但会因 JavaScript 堆内存不足而随机崩溃, 这根本没有任何意义,因为我正在运行 --max-old -space-size=4048 并且我的节点进程永远不会超过 500MB

<--- 最近几次 GC --->

[5048:0000000000379B20] 92031 ms:Mark-sweep 293.3 (307.6) -> 293.3 (299.8) MB,271.7 / 0.0 ms(平均 mu = 0.910,当前 mu = 0.000)请求旧空间中的最后手段 GC [5048:020000000039] 92227 ms:Mark-sweep 293.3 (299.8) -> 293.3 (299.8) MB,195.9 / 0.0 ms(平均 mu = 0.850,当前 mu = 0.000)请求旧空间中的最后手段 GC

<--- JS 堆栈跟踪 --->

==== JS 堆栈跟踪 ==========================================

0: ExitFrame [pc: 00000001402BAE3D]
1: StubFrame [pc: 00000001402FB91E] Security context: 0x01abc1840921 <JSObject>
2: match [000001ABC184D011](this=0x00df6da620c1 <String[30]: room no nanjing shanghai china>,0x0352098253f1 <JSRegExp <Very long string[25794]>>)
3: findArea [000001CEE0D6B1E1] [c:\script.js:900]

[字节码=0000035209839239 偏移量=430](这=0x00fab1aeb5d1

致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足 1: 000000013F6AC80F napi_wrap+125199 2: 000000013F64BFE6 v8::base::CPU::has_sse+36198 3: 000000013F64CCB6 v8::base_::CPU::ha 000000013FE744AE v8::Isolate::ReportExternalAllocationLimitReached+94 5: 000000013FE5BC01 v8::SharedArrayBuffer::Externalize+785 6: 000000013FD22F5C v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1436 7: 000000013FD1ED69 v8::internal::Heap::AllocateExternalBackingStore +1561 8: 000000013FD39FEC v8::internal::Factory::CodeBuilder::BuildInternal+412 9: 000000013FD39E26 v8::internal::Factory::CodeBuilder::Build+22 10: 000000013F89D6E4 v8::internal::RegExpMacroAssemblerX64:: GetCode+4116 11: 000000013FAD5101 v8::internal::IrregexpInterpreter::MatchInternal+7057 12:000000013FAC6C80 v8::internal::RegExpParser::operator=+4544 13: 000000013FAC7149 v8::internal::RegExp::CompileForTesting+425 14: 000000013FAC74E5 v8::internal::RegExp::DotRegExpForTesting+245 15: 000000013FAC7D68 v8::internal:: ::Exec+1256 16:000000013FAC78F7 v8::internal::RegExp::Exec+119 17:000000013FA74B26 v8::internal::DeclarationScope::was_lazily_parsed+21974 18:00000001402BAE3D v8::Setup5IsolateDelegate+ 19:00000001402FB91E V8 ::内部:: setUpisoleateLatedElegate :: Setupheap+782382 20:00000001402A6E7E V8 :: Internal :: setupisoleatedElegate :: SetupisoleateDelegate :: SetUpheap :: Setupheap+435598 21:000000000140140140140140140140146675B :internal::SetupIsolateDelegate::SetupHeap+40555 23:000000014024675B v8::internal::SetupIsolateDelegate::SetupHeap+40555 24:0000000140272F70 v8::internal::setUpisoLatedElegate :: setUpheap+222848 25:0000000140297C52 V8 ::内部:: setupisoleatedElegate :: setUpheap+setUpheap+373602 26:000000000140265354 30908 28: 000000013FD7ED0F v8::internal::Execution::CallWasm+1551 29: 000000013FD7EE03 v8::internal::Execution::CallWasm+1795 30: 000000013FD7F1E5 v8::internal::FDExecution::TryCall10801336:4001080130013 ::internal::MicrotaskQueue::RunMicrotasks+501 32: 000000013FE26BE0 v8::internal::Builtins::builtin_handle+326608 33: 000000013FE26120 v8::internal::Builtins::builtin_handle+323856 34: 0000000013FE2688:488:46 Builtins::builtin_handle+324696 35:000000013FE2626E v8::internal::Builtins::builtin_handle+324190 36:00000001402BAF1D v8::internal::SetupIsolateDelegate::setUpheap+517677 37:000000014024675b v8 ::内部:: setupisoleateLatedElegate :: setupheap+40555 38:0000000001402442BE v8 :: Internal :: Internal :: SetUpisoledelegate :: SetUpisoledelegate :: SetUpheap :: SetUpheap +:: setUp+3014239:339:39:39:39:39:39:39:00001442; 000000013FD7EC82 v8::internal::Execution::CallWasm+1410 41: 000000013FD7E5F9 v8::internal::Execution::Call+185 42: 000000013FE520E0 v8::Function::Call+608 43: 000000013F6C~8E CallbackScope+770 44: 000000013F6C9114 节点::CallbackScope::~CallbackScope+1476 45: 000000013F6C2093 v8::internal::compiler::Operator::EffectOutputCount+179 46: 000000013F5BFE33 v8::internal::Microtasks_395595:4microtasks_1954 : 000000013F5C062C v8::internal::MicrotaskQueue::microtasks_policy+21436 48: 000000013F5BB6B5 v8::internal::MicrotaskQueue::microtasks_policy+1093 49:000000013F6E0A2B uv_tty_set_vterm_state+8299 50: 000000013F6F588C uv_loop_init+844 51: 000000013F6F5BC4 uv_run+244 52: 000000013F6173F3 EVP_CIPHER_CTX_buf_noconst+29635 53: 000000013F6740D0 node::Start+288 54: 000000013F52673C RC4_options+339516 55: 0000000140377788 v8::internal::SetupIsolateDelegate::SetupHeap +1289880 56:00000000775A556D BaseThreadInitThunk+13 57:000000007790385D RtlUserThreadStart+29

标签: node.jsregex

解决方案


使用 bash 找出错误代码:

$ printf "%x" -1073741819
ffffffffc0000005

忽略f's,这是 c0000005 - 访问冲突。

你的正则表达式太复杂了;节点无法应对;它崩溃了。


推荐阅读