yoklateknik mülakat

Backend Nodejs Memory Performance Mülakat Soruları

75 doğrulanmış Backend Nodejs Memory Performance mülakat sorusu — cevaplarıyla çöz, açıklamalarıyla öğren, gerçek simülasyonda kendini test et.

Gerçek simülasyonu dene →

Örnek sorular

Nodejs Memory PerformanceZorluk 1
Node.js'te process.memoryUsage().heapUsed neyi temsil eder?
  • aNode.js sürecinin işletim sisteminde kapladığı toplam bellek (RSS); buffer'lar ve native kod dahil
  • bNode.js'in kullanmasına izin verilen maksimum heap boyutu, --max-old-space-size bayrağıyla ayarlanır
  • cV8 JavaScript heap'inde yaşayan nesnelerin şu an kullandığı bellek miktarı
  • dSon garbage collection döngüsünde serbest bırakılan bellek miktarı
Açıklama:heapUsed, çağrının yapıldığı anda V8'in JavaScript heap'inde o an kapladığı byte miktarını raporlar — çoğunlukla yaşayan nesnelerdir, ama bir sonraki toplama döngüsü tarafından henüz geri kazanılmamış çöp de buna dahil olabilir. Bu, rss'ten (native buffer'lar ve kod dahil sürecin tüm resident belleği), heapTotal'dan (V8'in heap için ayırdığı, kullanılsın kullanılmasın bellek) farklıdır ve garbage collection'ın ürettiği bir fark (delta) değildir.
Nodejs Memory PerformanceZorluk 2
let cache = {};

function handleRequest(id, data) {
  cache[id] = data;
}

Bu fonksiyon, her gelen istekte benzersiz bir id ile çağrılıyor. Uzun süre çalışan bir sunucu sürecinde bellek üzerindeki en olası etki nedir?
  • acache, girdiler hiç kaldırılmadığı için sınırsız büyür ve her data nesnesini sonsuza kadar erişilebilir tutar
  • bHiçbir etki olmaz — düz bir nesnenin özelliklerine atanan nesneler, istek bittiğinde otomatik olarak temizlenir
  • cV8, cache sabit bir boyut sınırını aştığında en eski girdileri otomatik olarak tahliye eder
  • dV8'in garbage collector'ı nesne özellik sayısını sınırladığı için yalnızca en son 100 girdi tutulur
Açıklama:cache, modül kapsamından referans verilen düz bir nesnedir; dolayısıyla modül yüklü olduğu sürece cache ve üzerine atanan her şey erişilebilir kalır. id her istekte benzersiz olduğundan ve hiçbir şey eski anahtarları silmediğinden, bu klasik bir sınırsız-cache bellek sızıntısıdır: bellek kullanımı istek hacmiyle birlikte durmadan artar.
Nodejs Memory PerformanceZorluk 2
function makeLogger() {
  const bigBuffer = new Array(1000000).fill('x');
  return function log(msg) {
    console.log(msg);
  };
}

const logger = makeLogger();

bigBuffer, log içinde hiç kullanılmıyor. makeLogger() döndükten ve logger canlı tutulduktan sonra bigBuffer'a ne olur?
  • alog ona hiç referans vermediği için hemen garbage collection'a uygun hale gelir
  • bDeğer olarak log'un kendi özel kapsamına kopyalanır, bu yüzden makeLogger içindeki orijinal dizi fonksiyon döner dönmez hemen serbest bırakılır
  • cOtomatik olarak Node'un old generation heap'ine kalıcı olarak taşınır ve dondurulur, hangi koşulda olursa olsun bir daha asla toplanmaz
  • dlog ona hiç dokunmasa bile, logger erişilebilir olduğu sürece closure'ın dış kapsamı üzerinden erişilebilir kalır
Açıklama:Bir closure yalnızca gerçekten referans verdiği değişkenleri canlı tutar; bulunduğu kapsamda tanımlı her değişkeni değil. V8, bir fonksiyon gövdesinin hangi dış değişkenleri yakaladığını derleme zamanında belirler; log, bigBuffer'a hiç dokunmadığı için V8'in onu log'un closure'ı üzerinden erişilebilir tutmasına bir neden yoktur. makeLogger() döndükten sonra bigBuffer'ı canlı tutan başka bir referans kalmadığından, hemen garbage collection'a uygun hale gelir — bu, aynı kapsamı paylaşan bir kardeş closure'ın değişkeni GERÇEKTEN kullandığı ve bu yüzden onu canlı tutabildiği durumdan farklıdır.
Nodejs Memory PerformanceZorluk 1
Node.js'te bellek yönetimini doğru tanımlayan ifade hangisidir?
  • aGeliştiriciler oluşturdukları her nesnede manuel olarak delete çağırmalıdır, yoksa süreç çöker
  • bBellek, V8'in garbage collector'ı tarafından otomatik olarak yönetilir; sıradan JS nesneleri için manuel bir free() tarzı API yoktur
  • cNode.js, bir nesnenin tuttuğu belleği serbest bırakmak için process.free(obj) çağrısını gerektirir
  • dNode.js'te garbage collection tamamen isteğe bağlıdır ve hiç çalışmadan önce açıkça bir komut satırı bayrağıyla etkinleştirilmesi gerekir
Açıklama:Node.js, belleği garbage collection yoluyla otomatik yöneten V8 üzerinde çalışır: nesneler erişilemez hale geldiğinde, uygulama kodundan herhangi bir manuel free() tarzı çağrı olmadan serbest bırakılır. process.free() diye bir API yoktur, delete yalnızca bir nesne özelliğini kaldırır (nesnenin kendisini değil) ve garbage collection varsayılan olarak her zaman açıktır, isteğe bağlı bir özellik değildir.
Nodejs Memory PerformanceZorluk 2
function startTicker() {
  const state = { count: 0 };
  setInterval(() => {
    state.count++;
  }, 1000);
}

startTicker();

startTicker() bir kez çağrılıyor ve dönüş değeri kullanılmıyor. state'e ve oluşturduğu interval'e ne olur?
  • aInterval (temizlenmediği sürece) sonsuza kadar çalışmaya devam eder ve callback'inin closure'ı state'i süresiz erişilebilir tutar
  • bstartTicker dışında hiçbir şey onlara referans vermediği için ikisi de hemen garbage collection'a uğrar
  • cNode.js, dönüş değerine dışarıdan referans olmayan interval'leri otomatik olarak temizler
  • dstate, tam olarak ilk tick ateşlendikten hemen sonra toplanır ama interval'in kendisi count kalıcı olarak 0'da sabitken sonsuza kadar çalışmaya devam eder
Açıklama:setInterval, callback'ini Node'un timer alt sistemine kaydeder ve bu alt sistem, clearInterval çağrılana kadar o callback'e referans tutar. Callback state'i closure ile kapsadığı için, interval ateşlenmeye devam ettiği sürece state de bu closure üzerinden erişilebilir kalır — burada hiçbir yerde clearInterval çağrılmadığından, hem timer hem de state sürecin geri kalanı boyunca yaşar.
Nodejs Memory PerformanceZorluk 2
const { EventEmitter } = require('events');
const bus = new EventEmitter();

function onRequest() {
  bus.on('data', () => {
    console.log('handling data');
  });
}

for (let i = 0; i < 15; i++) {
  onRequest();
}

Bu döngüyü çalıştırmanın en olası gözlemlenebilir etkisi nedir?
  • aHiç olağandışı bir şey olmaz — EventEmitter, tam olarak aynı event adı için kaydedilen tekrarlanan listener fonksiyonlarını sessizce yok sayar
  • bO emitter örneğinde 11. listener kaydedildiği anda senkron olarak bir TypeError fırlatılır
  • cBir MaxListenersExceededWarning yazdırılır, çünkü tek bir emitter'daki 'data' event'ine varsayılan 10'dan fazla listener eklenmiştir
  • dYalnızca ilk 10 listener tutulur; 11'den 15'e kadar olan çağrılar sessizce yok sayılır
Açıklama:EventEmitter örnekleri, salt sızıntı-tespit sezgisi olarak varsayılan biçimde event başına en fazla 10 listener'a ayarlıdır. Aynı bus örneğinde 'data' için 11. listener eklendiğinde bu varsayılan zaten aşılmış olur ve sürecin stderr'ine bir MaxListenersExceededWarning yazdırılır — bu bir hata değil uyarıdır ve eklenen her listener (15'i de dahil) yine tutulur, tetiklenmeye de devam eder.

3300 soruluk Backend bankasında kendini sına.

Mülakata başla