2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory」の解決方法

2
Posted at

はじめに

HonoでAPI作成中にエラーが発生しました。

問題

開発サーバーのログ

<--- Last few GCs --->

[16718:0x88540c000]   107421 ms: Mark-Compact (reduce) 4042.6 (4054.6) -> 4040.7 (4050.4) MB, pooled: 0 MB, 194.12 / 0.00 ms  (+ 282.1 ms in 57 steps since start of marking, biggest step 5.1 ms, walltime since start of marking 493 ms) (average mu = 0.267,
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----

 1: 0x100fe083c node::OOMErrorHandler(char const*, v8::OOMDetails const&) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
 2: 0x1011e0620 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
 3: 0x10143fa1c v8::internal::Heap::stack() [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
 4: 0x101442df0 v8::internal::Heap::HasLowYoungGenerationAllocationRate() [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
 5: 0x101453fe4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags)::$_1::operator()() const [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
 6: 0x1014538b8 void heap::base::Stack::SetMarkerAndCallbackImpl<v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags)::$_1>(heap::base::Stack*, void*, void const*) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
 7: 0x101e09f10 PushAllRegistersAndIterateStack [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
 8: 0x10143d720 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
 9: 0x10143242c v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
10: 0x101413b0c v8::internal::Factory::NewFillerObject(int, v8::internal::AllocationAlignment, v8::internal::AllocationType, v8::internal::AllocationOrigin) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
11: 0x1018a3750 v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
12: 0x101efa234 Builtins_CEntry_Return1_ArgvOnStack_NoBuiltinExit [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
13: 0x101fad3c0 Builtins_CreateTypedArray [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
14: 0x12b04a304 
15: 0x20696258c0b4 
16: 0x2069625cc7cc 
17: 0x2069625c1a80 
18: 0x12b11366c 
19: 0x12b040790 
20: 0x12b1375a4 
21: 0x12b04afc4 
22: 0x12b1c72ac 
23: 0x12b0555d8 
24: 0x101e5a8cc Builtins_JSEntryTrampoline [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
25: 0x101e5a570 Builtins_JSEntry [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
26: 0x101383be0 v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
27: 0x101383544 v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::DirectHandle<v8::internal::Object>, v8::internal::DirectHandle<v8::internal::Object>, v8::base::Vector<v8::internal::DirectHandle<v8::internal::Object> const>) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
28: 0x1011f7fe0 v8::Function::Call(v8::Isolate*, v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
29: 0x100ee10f0 node::InternalCallbackScope::Close() [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
30: 0x100ee1320 node::InternalMakeCallback(node::Environment*, v8::Local<v8::Object>, v8::Local<v8::Object>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*, node::async_context, v8::Local<v8::Value>) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
31: 0x100ef5044 node::AsyncWrap::MakeCallback(v8::Local<v8::Function>, int, v8::Local<v8::Value>*) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
32: 0x101111fe0 node::StreamBase::CallJSOnreadMethod(long, v8::Local<v8::ArrayBuffer>, unsigned long, node::StreamBase::StreamBaseJSChecks) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
33: 0x101113774 node::EmitToJSStreamListener::OnStreamRead(long, uv_buf_t const&) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
34: 0x1011b7c24 node::crypto::TLSWrap::ClearOut() [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
35: 0x1011b9b40 node::crypto::TLSWrap::OnStreamRead(long, uv_buf_t const&) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
36: 0x101117a9c node::LibuvStreamWrap::OnUvRead(long, uv_buf_t const*) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
37: 0x1011181cc node::LibuvStreamWrap::ReadStart()::$_1::__invoke(uv_stream_s*, long, uv_buf_t const*) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
38: 0x101e44f70 uv__stream_io [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
39: 0x101e4d598 uv__io_poll [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
40: 0x101e39948 uv_run [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
41: 0x100ee1b44 node::SpinEventLoopInternal(node::Environment*) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
42: 0x1010348c8 node::NodeMainInstance::Run() [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
43: 0x100f9a468 node::Start(int, char**) [/Users/<user>/.nvm/versions/node/v24.14.1/bin/node]
44: 0x189747e00 start [/usr/lib/dyld]

元のコード

for (let j = 10; j <= MAX_ID; j = j + 10) {
      let Ids = [];
      for (let i = 1; i <= j; i++) {
        Ids.push(i);
      }
      const res = await Promise.all(Ids.map((id) => fetchData(id)));
      array.push(...res);
}

解決方法

for (let j = 10; j <= MAX_ID; j = j + 10) {
      let Ids = [];
      for (let i = j - 9; i <= j; i++) {
        Ids.push(i);
      }
      const res = await Promise.all(Ids.map((id) => fetchData(id)));
      array.push(...res);
}

内側のforのiがj-9からスタートするようにし、無駄に計算していたものを修正しました。

おわりに

同じデータを何度も取得して、それを配列に貯め込んだことでメモリが足りなくなったのが原因です。
このエラーが出たらfor文あたりを怪しむようにしたいです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?