Start · Sprachen · JavaScript · Referenz · Navigator.deviceMemory

Navigator.deviceMemory

Eigenschaft

Gibt den ungefähren Arbeitsspeicher des Geräts in Gigabyte zurück, gerundet auf eine Zweierpotenz, z. B. <code>0.5</code>, <code>4</code> oder <code>8</code>.

seit JavaScript Chromium-Browser (Chrome 63+, Edge 79+, Opera 50+) Kategorie: webapi

Signatur

get Navigator.deviceMemory

Beschreibung

navigator.deviceMemory ist eine schreibgeschützte Eigenschaft aus der Device Memory API. Sie gibt einen groben Wert für den Arbeitsspeicher (RAM) des Geräts in Gigabyte zurück. Damit sich Geräte nicht eindeutig wiedererkennen lassen (Fingerprinting), liefert der Browser keinen genauen Wert. Er rundet auf die nächstniedrigere Zweierpotenz ab und begrenzt das Ergebnis nach oben und unten. Üblich sind die Werte 0.25, 0.5, 1, 2, 4 und 8.

Die Eigenschaft eignet sich für adaptive Auslieferung: Auf Geräten mit wenig Speicher kann eine Anwendung leichtere Inhalte laden. Beispiele sind kleinere Bilder, weniger Animationen, kein Vorladen, eine vereinfachte Oberfläche oder kleinere Caches. Geräte mit viel Speicher bekommen die volle Ausstattung.

Denselben Wert gibt es auch in Web Workern über WorkerNavigator.deviceMemory. Auf dem Server steht er über den Client-Hint-Header Sec-CH-Device-Memory bereit (früher Device-Memory), wenn der Server ihn mit Accept-CH anfordert. Die Eigenschaft gibt es nur in sicheren Kontexten (HTTPS oder localhost).

Rückgabewert

Typ
number | undefined
Beschreibung
Ungefährer Arbeitsspeicher in Gigabyte als Gleitkommazahl, z. B. 0.25, 0.5, 1, 2, 4 oder 8. In Browsern ohne Unterstützung ist die Eigenschaft nicht vorhanden. Der Zugriff ergibt dann undefined.

Beispiele

Gerätespeicher auslesen, wenn verfügbar

if ('deviceMemory' in navigator) {
  console.log(`Ungefährer Arbeitsspeicher: ${navigator.deviceMemory} GB`);
} else {
  console.log('Device Memory API wird nicht unterstützt');
}
Ungefährer Arbeitsspeicher: 8 GB

Leichtere Inhalte für Geräte mit wenig Speicher

// Fehlende Unterstützung: vorsichtig einen mittleren Wert annehmen
const memory = navigator.deviceMemory ?? 4;
const isLowEnd = memory < 2;

document.documentElement.classList.toggle('lite-mode', isLowEnd);

const imageQuality = isLowEnd ? 'low' : memory >= 8 ? 'high' : 'medium';
console.log({ memory, isLowEnd, imageQuality });
{ memory: 8, isLowEnd: false, imageQuality: 'high' }

Cache-Größe am Speicher ausrichten

const getCacheLimit = () => {
  const gb = navigator.deviceMemory;
  if (gb === undefined) return 100; // Standardwert
  if (gb <= 1) return 25;
  if (gb <= 4) return 100;
  return 500;
};

const cache = new Map();
const limit = getCacheLimit();

const remember = (key, value) => {
  if (cache.size >= limit) {
    // ältesten Eintrag entfernen (Map behält die Einfügereihenfolge)
    cache.delete(cache.keys().next().value);
  }
  cache.set(key, value);
};

remember('user:1', { name: 'Anna' });
console.log(`Cache-Limit: ${limit}, Einträge: ${cache.size}`);
Cache-Limit: 500, Einträge: 1

Nutzung im Web Worker

// worker.js
self.postMessage({ deviceMemory: self.navigator.deviceMemory ?? null });

// main.js
const worker = new Worker('worker.js');
worker.addEventListener('message', ({ data }) => {
  console.log('Speicher laut Worker:', data.deviceMemory);
});
Speicher laut Worker: 8

// Wichtig · Fallstricke

  • Browser-Unterstützung: Nur Chromium-Browser unterstützen die Eigenschaft (Chrome, Edge, Opera, Samsung Internet). Firefox und Safari haben sie nicht. Prüfe deshalb immer mit 'deviceMemory' in navigator oder lege mit ?? einen Standardwert fest.
  • Nur sicherer Kontext: Über http:// (außer localhost) ist die Eigenschaft nicht vorhanden.
  • Absichtlich ungenau: Zum Schutz vor Fingerprinting wird der Wert gerundet und begrenzt. Ein Rechner mit 32 GB meldet also meist nur 8, und aus 6 GB wird 4. Der Wert eignet sich nur für grobe Leistungsklassen, nicht für genaue Speicherberechnungen.
  • Der Wert beschreibt den gesamten Arbeitsspeicher des Geräts, nicht den freien Speicher und nicht den Speicher, den der Tab nutzen darf. Den Speicherverbrauch der eigenen Seite misst man mit performance.measureUserAgentSpecificMemory().
  • Für die Anpassung auf dem Server den Client Hint Sec-CH-Device-Memory verwenden. Das spart eine zusätzliche Rundreise zwischen Browser und Server.
  • Die Entscheidung am besten mit anderen Angaben kombinieren, etwa navigator.hardwareConcurrency und navigator.connection.saveData.