Start · Sprachen · JavaScript · Referenz · WorkerNavigator.deviceMemory

WorkerNavigator.deviceMemory

Eigenschaft

Schreibgeschützte Eigenschaft, die innerhalb eines Workers den ungefähren Arbeitsspeicher des Geräts in Gigabyte liefert, z. B. <code>0.5</code>, <code>4</code> oder <code>8</code>.

seit JavaScript Chromium 63+ (Chrome, Edge, Opera); nicht in Firef Kategorie: webapi

Signatur

WorkerNavigator.deviceMemory

Beschreibung

WorkerNavigator.deviceMemory gehört zur Device Memory API und ist in Dedicated, Shared und Service Workers über navigator.deviceMemory (bzw. self.navigator.deviceMemory) erreichbar. Die Eigenschaft liefert eine grobe Schätzung des Arbeitsspeichers (RAM) des Geräts in Gigabyte. Im Hauptthread gibt es das Gegenstück Navigator.deviceMemory.

Aus Datenschutzgründen ist der Wert absichtlich ungenau: Der Browser rundet auf eine Zweierpotenz ab und begrenzt das Ergebnis nach oben und unten. Typische Werte sind 0.25, 0.5, 1, 2, 4 und 8. Ein Gerät mit 16 GB RAM meldet in Chrome zum Beispiel 8.

Gut geeignet ist die Eigenschaft für adaptives Laden und für Entscheidungen zur Ressourcennutzung im Worker. Beispiele: die Größe von Verarbeitungsblöcken wählen, Cache-Größen im Service Worker begrenzen, die Zahl paralleler Aufgaben drosseln oder auf Geräten mit wenig Speicher leichtere Assets ausliefern. Oft kombiniert man sie mit navigator.hardwareConcurrency.

Die Eigenschaft ist nur in sicheren Kontexten (HTTPS oder localhost) verfügbar. Weil sie nicht in allen Browsern existiert, sollte man sie immer per Feature-Erkennung prüfen und einen sinnvollen Standardwert vorsehen.

Rückgabewert

Typ
number | undefined
Beschreibung
Ungefährer Arbeitsspeicher in Gigabyte als Gleitkommazahl, auf eine Zweierpotenz abgerundet, z. B. 0.25, 0.5, 1, 2, 4 oder 8. In Browsern ohne Unterstützung oder in unsicheren Kontexten existiert die Eigenschaft nicht, das Ergebnis ist dann undefined.

Beispiele

Speicher im Worker abfragen, mit Fallback

// worker.js
const memoryGB = 'deviceMemory' in navigator ? navigator.deviceMemory : undefined;

if (memoryGB === undefined) {
  console.log('Device Memory API nicht verfügbar – nutze Standardwerte');
} else {
  console.log(`Ungefährer Gerätespeicher: ${memoryGB} GB`);
}
Ungefährer Gerätespeicher: 8 GB

Blockgröße für die Datenverarbeitung anpassen

// worker.js – große Datenmengen in passenden Blöcken verarbeiten
const getChunkSize = () => {
  const mem = navigator.deviceMemory ?? 4; // Fallback: 4 GB annehmen
  if (mem <= 1) return 10_000;
  if (mem <= 4) return 50_000;
  return 200_000;
};

self.addEventListener('message', ({ data }) => {
  const chunkSize = getChunkSize();
  let sum = 0;
  for (let i = 0; i < data.length; i += chunkSize) {
    const chunk = data.slice(i, i + chunkSize);
    sum += chunk.reduce((a, b) => a + b, 0);
  }
  self.postMessage({ sum, chunkSize });
});

// main.js
// const worker = new Worker('worker.js');
// worker.onmessage = (e) => console.log(e.data);
// worker.postMessage(Array.from({ length: 1_000_000 }, (_, i) => i % 10));
{ sum: 4500000, chunkSize: 200000 }

Cache-Größe im Service Worker begrenzen

// sw.js – auf Geräten mit wenig Speicher weniger Einträge cachen
const MAX_ENTRIES = (navigator.deviceMemory ?? 4) < 2 ? 20 : 100;

const trimCache = async (cacheName) => {
  const cache = await caches.open(cacheName);
  const keys = await cache.keys();
  const excess = keys.length - MAX_ENTRIES;
  for (let i = 0; i < excess; i++) {
    await cache.delete(keys[i]); // älteste Einträge zuerst entfernen
  }
};

self.addEventListener('fetch', (event) => {
  if (event.request.destination !== 'image') return;
  event.respondWith((async () => {
    const cache = await caches.open('images-v1');
    const cached = await cache.match(event.request);
    if (cached) return cached;
    const response = await fetch(event.request);
    await cache.put(event.request, response.clone());
    event.waitUntil(trimCache('images-v1'));
    return response;
  })());
});

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Nur Chromium-basierte Browser (Chrome, Edge, Opera, Samsung Internet) unterstützen die Eigenschaft. Firefox und Safari kennen sie nicht, dort ist der Wert undefined. Deshalb immer Feature-Erkennung und einen Fallback verwenden, z. B. navigator.deviceMemory ?? 4.
  • Nur sichere Kontexte: Unter HTTP (außer localhost) fehlt die Eigenschaft.
  • Grobe Schätzung: Der Wert wird absichtlich abgerundet und gedeckelt, damit man Nutzer schwerer per Fingerprinting erkennen kann. Er zeigt weder den freien Speicher noch den Speicher, den der Tab selbst belegt. Für den aktuellen Speicherverbrauch einer Seite gibt es performance.measureUserAgentSpecificMemory().
  • Keine Änderungsereignisse: Der Wert ist statisch, es gibt kein Event dafür. Ihn einmal auszulesen und zwischenzuspeichern reicht.
  • Serverseitige Alternative: Über den Client-Hint Sec-CH-Device-Memory kann der Server denselben Wert anfordern. Dafür muss er vorher Accept-CH: Sec-CH-Device-Memory senden. So lassen sich angepasste Inhalte schon beim ersten Laden ausliefern.
  • Ein Schreibzugriff (navigator.deviceMemory = 16) wird ignoriert. Im Strict Mode löst er einen TypeError aus.