我收到導致我的應用程式崩潰的堆記憶體錯誤。但我的應用程式有可用記憶體。
app/web.1 [4:0x4ea2840] 27490 ms: Mark-sweep 505.7 (522.4) -> 502.2 (523.1) MB, 440.3 / 0.0 ms (average mu = 0.280, current mu = 0.148) allocation failure scavenge might not succeed
app/web.1 FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
錯誤發生在 512mb 左右。我的標準 2X 測功機有 1GB。
節點版本為 16.17.0。據我了解,超過 12 的節點版本的堆限制基于可用記憶體。
>= 12 的 Node 版本可能不需要使用 --optimize_for_size 和 --max_old_space_size 標志,因為 JavaScript 堆限制將基于可用記憶體。 源代碼
我考慮過 512mb 測功機上的一名工人。但是工人測功機會導致整個應用程式崩潰嗎?如果是這種情況,錯誤不會來自日志app/worker.1而不是app/web.1日志中顯示的那樣嗎?
更新
我想出了如何重新創建堆限制分配錯誤。這讓我得到了更多的線索。
我在512mb 愛好測功機上得到大約256mb的錯誤。
我在1024mb(1gb) 標準 2X上得到大約512mb的錯誤。
所以它總是可用記憶體的一半。我不確定這是否是heroku的某種設定。
更新 2
使用 v8 節點模塊(包含在節點中)我可以獲得更多資料:
const v8 = require('v8');
// added the code below to a route that caused a memory leak
const heapStats = v8.getHeapStatistics();
const heapStatsMB = heapStats;
for (const key in heapStatsMB) {
heapStatsMB[key] = `${(((heapStatsMB[key] / 1024 / 1024) * 100) / 100).toFixed(2)} MB`;
}
console.table(heapStatsMB);
我可以看到heap_size_limit業余測功機上的 259 和 2X 標準測功機上的 515。
┌─────────────────────────────┬─────────────┐
│ (index) │ Values │
├─────────────────────────────┼─────────────┤
│ total_heap_size │ '268.08 MB' │
│ total_heap_size_executable │ '2.25 MB' │
│ total_physical_size │ '266.73 MB' │
│ total_available_size │ '3.31 MB' │
│ used_heap_size │ '263.69 MB' │
│ heap_size_limit │ '259.00 MB' │
│ malloced_memory │ '1.01 MB' │
│ peak_malloced_memory │ '3.03 MB' │
│ does_zap_garbage │ '0.00 MB' │
│ number_of_native_contexts │ '0.00 MB' │
│ number_of_detached_contexts │ '0.00 MB' │
│ total_global_handles_size │ '0.16 MB' │
│ used_global_handles_size │ '0.16 MB' │
│ external_memory │ '18.53 MB' │
└─────────────────────────────┴─────────────┘
uj5u.com熱心網友回復:
TLDR:
--max-old-space-size=1024進入procfile。
web: node --max-old-space-size=1024 bin/www
或者
添加環境變數鍵:NODE_OPTIONS值為--max_old_space_size=1024
細節
最初我的 Procfile 是
web: node --optimize_for_size bin/www
我有一個--max-old-space-size帶有 value的環境變數鍵1024。
這不是列出環境變數的正確方法。它應該是 key:NODE_OPTIONS值為--max_old_space_size=1024. 我自己還沒有嘗試過。
相反,我將我的 procfile 更改為:
web: node --optimize_for_size --max-old-space-size=1024 bin/www
這也有效。
我不確定--optimize_for_size會做任何事情,因為node bin/wwwvsnode --optimize_for_size bin/www兩者都heap_size_limit根據測功機大小將其更改為大致相同的數量。所以后來我拿出--optimize_for_size來了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507290.html
標籤:javascript 节点.js heroku 堆内存 测功机
