2016-10-20 8 views
6

Teraz używam:Jak wykryć zużycie v8 sterty jest blisko, aby ograniczyć w node.js

const v8 = require('v8'); 

let heap = v8.getHeapStatistics(); 
let usage = 100/heap.heap_size_limit * heap.used_heap_size; 

if (usage > 90) { 
    console.log(`V8 heap usage close to the limit (${usage.toFixed()}%)`); 
} else if (usage > 95) { 
    console.log(`V8 heap usage very close to the limit (${usage.toFixed()}%)`); 
} 

To rozwiązanie nie działać poprawnie.

Kiedy próbuję polecenie: węzeł --max-old-space-size = 100 index.js Mój proces przez niezdolny alokacji pamięci, gdy mój skrypt oblicz ~ 56%

getHeapStatistics().heap_size_limit is 178 MB 
getHeapStatistics().used_heap_size is ~95 MB 

Jak dokładnie wykrywa sytuację, kiedy możemy wydostać się z błędu pamięci?

Odpowiedz

1

Stuła v8 jest faktycznie podzielona na regiony lub spacje: new_space, old_space, code_space, map_space i large_object_space. Pierwsze dwa w przybliżeniu odpowiadają przedszkolom i kupionej kupie obiektu, choć teoretycznie obiekty mogą siedzieć w dowolnym z pięciu pól.

Bardziej dokładnym środkiem byłoby użycie space_size i space_used_size z old_space.

var space = v8.getHeapSpaceStatistics(); 
var old_space_total = space[1].space_size; 
var old_space_used = space[1].space_used_size; 
var usage = 100/old_space_total * old_space_used; 
if (usage > 90) { 
    console.log(`V8 heap usage close to the limit (${usage.toFixed()}%)`); 
} else if (usage > 95) { 
    console.log(`V8 heap usage very close to the limit (${usage.toFixed()}%)`); 
} 

Statystyki tuż przed wyczerpaniem pamięci:

#node --max_old_space_size=200 heap.js 
... 
{ total_heap_size: 243306496, 
    total_heap_size_executable: 5242880, 
    total_physical_size: 243306496, 
    total_available_size: 19149632, 
    used_heap_size: 215801616, 
    heap_size_limit: 243269632 } 
[ { space_name: 'new_space', 
    space_size: 33554432, 
    space_used_size: 16464888, 
    space_available_size: 41992, 
    physical_space_size: 33554432 }, 
    { space_name: 'old_space', 
    space_size: 205475840, 
    space_used_size: 197215464, 
    space_available_size: 18462512, 
    physical_space_size: 205475840 }, 
    { space_name: 'code_space', 
    space_size: 2097152, 
    space_used_size: 680416, 
    space_available_size: 617024, 
    physical_space_size: 2097152 }, 
    { space_name: 'map_space', 
    space_size: 2179072, 
    space_used_size: 1452528, 
    space_available_size: 18800, 
    physical_space_size: 2179072 }, 
    { space_name: 'large_object_space', 
    space_size: 0, 
    space_used_size: 0, 
    space_available_size: 0, 
    physical_space_size: 0 } ] 
V8 heap usage close to the limit (96%) 
... 
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 

Jak widać, total_heap_size: 243306496 jest faktycznie podsumowanie nowej przestrzeni (33554432), starej przestrzeni (205475840), kod (2097152), map (2179072), duży obiekt (0).

I jak widać, wszystkie inne przestrzenie są zdrowe, podczas gdy stara przestrzeń zbliża się do wyczerpania, a rzeczywiste zmęczenie pochodzi stąd.

Mam nadzieję, że to pomoże.

Powiązane problemy