タブは どこから来て
どこへ消えるのか。

気づくと 30 個ぐらい開いてる。
そもそも「タブ」って、何?
CHROME の中身を覗く回

気づくと、タブ 30 個

動作が重くなる。「Chrome がメモリ食いすぎ」と怒られる。
でも、そもそも「タブを開く」って何が起きてるのか。 — 一番身近なアプリの中身を覗いてみました。
今日は 「タブが生まれてから消えるまで」 を追っていきます。
QUESTION 01

タブって、アプリ全体の中の
1機能じゃないの?

実は違います。Chrome では 1つのタブ = 1つの独立したプロセス
OS から見ると、Chrome は1個のアプリじゃなくて、たくさんの小さいプロセスの集合です。
タブ 30 個なら、30 個以上のプロセスが同時に動いている。 これを「マルチプロセス・アーキテクチャ」と呼びます。2008 年の初代 Chrome から採用。

1 タブ = 1 プロセス の構造

一般的なアプリ 1 プロセス すべての機能がここに Chrome Browser Process(本体) Renderer Tab A Renderer Tab B Renderer Tab C + GPU, Network ... 全部別プロセス

Chrome は機能をプロセス単位で分離しています。

タブ、GPU、ネットワーク処理がそれぞれ独立したプロセスで動いている。

1つのタブが落ちても他は無事。
悪意あるサイトが他タブのメモリを覗けない。 安定性とセキュリティのために、あえてメモリを使う設計。
QUESTION 02

なぜわざわざ分けているのか?

1プロセスにまとめた方がメモリは節約できる。
でも Chrome は あえて分けるコストを払っています。
1
安定性 — 1つのタブが落ちても、他のタブ・ブラウザ本体は無事
2
セキュリティ — 悪意あるサイトが、別タブの Gmail のメモリを覗けない
3
並列性能 — CPU の複数コアを活かして、タブごとに並列実行できる

タブの一生を辿る

タブには 5つのステップ があります。
01
誕生
+ ボタンで
プロセス生成
02
読み込み
URL を解決
HTML を取得・描画
03
活動中
フルにメモリと
CPU を使う
04
休眠
凍結(Frozen)や
破棄(Discarded)
05
× ボタンで
プロセス終了
ここから1つずつ、「その瞬間に何が起きているか」を見ていきます。
STEP 01

+ を押すと、何が起きる

+ ボタン Chrome 本体が OS に依頼 OS がメモリ空間を確保 タブ用のプロセスが起動 V8 (JS) + Blink (描画) + DOM

Browser Process が OS に「新しいプロセスを作って」と依頼します。

そのプロセスの中に V8(JS エンジン)と Blink(描画エンジン)が入っている。
これがタブの正体

空のタブでも 30〜50 MB 使う。 中身がゼロでも、エンジンの起動コストがかかる。
STEP 02

URL を打つと、何が起きる

1. DNS ドメイン → IP アドレス 2. HTTP HTML をダウンロード 3. Parse CSS / JS / 画像も取得 4. Render ピクセルに描画 この間、メモリにデータが溜まっていく

URL からページが表示されるまで、おおまかに 4ステップ

DNS でアドレスを変換し、HTML を取得、
CSS/JS/画像を並列で取得して、最後に画面に描画します。

Gmail のような重いサイトだと、ここで 300〜500 MB まで膨らむことも。
STEP 03

タスクマネージャーに
Chrome が何個もあるのは?

news.example.com のタブ メインページ example.com YouTube 動画 youtube.com 広告 ads.com 解析タグ analytics.com 1タブの中でも、サイトごとにプロセスが分かれる 1タブで 4〜6 プロセスになることも これを Site Isolation と呼ぶ (2018年〜)

Site Isolation という仕組みで、1タブ内でもサイトが違えばプロセスが分かれます。

埋め込みの YouTube、広告、解析タグ…がそれぞれ別プロセスに。

Spectre 脆弱性への対策。同じプロセスだと悪意あるサイトが他サイトのメモリを覗けるため。 代償として、メモリ使用量が 10〜15% 増える。
STEP 04

バックグラウンドのタブは
どうなる

Chrome はタブを4つの状態で管理しています。
ACTIVE
表示中
フルにメモリとCPUを使っている状態。
PASSIVE
裏にいる
他のタブに切り替えた直後。まだ生きている。
FROZEN
凍結
5分以上放置 → JS の実行が停止。メモリは保持。
DISCARDED
破棄
プロセスごと終了。タブの見た目だけ残る。
「あれ、このタブ更新かかった?」→ Discarded からの復帰でリロードされた状態。 Chrome の Memory Saver モードは、使ってないタブを積極的に Discard してメモリを返す機能。

タブの状態はこう遷移する

Active 表示中 切替 Passive 裏にいる 5分 Frozen JS 停止 メモリ不足 Discarded プロセス終了 クリックで復帰(Discarded はリロード) 300-500 MB 300-500 MB ~200 MB ~0 MB
STEP 05

× を押すと、何が起きる

× ボタン Chrome 本体 → OS: プロセス停止 メモリ空間を解放 数ミリ秒で完了 残るもの: 閲覧履歴、Cookie、localStorage

× を押すと、OS がそのプロセスを即座に停止して、メモリを回収します。

タブを閉じれば、そのタブ分のメモリは確実に戻ってくる。
30タブ閉じれば 2〜4 GB 返ってきても不思議じゃない。

bfcache(戻る/進む用のキャッシュ)がある場合は、閉じてもしばらくメモリを使い続けることも。
BONUS

タブ 30 個のメモリは?

~50 MB
空のタブ
プロセス起動コストだけ。
~100 MB
ニュース記事
軽めのページ。
~300 MB
Gmail / Notion
重い Web アプリ。
~500 MB+
Figma / Sheets
ヘビーな計算系。
タブ 30 個 = 2〜4 GB は普通。そこに拡張機能の分も加わる。 Chrome が「重い」のは設計通りの動作。Shift+Esc でタブごとの内訳が見られます。

タブは どこから来てどこへ消えるのか。

どこから来るのか + を押すと、OS が新しいプロセスとメモリ空間を作る。
そこに JS エンジンと描画エンジンが起動する。それがタブの正体。
どこへ消えるのか 使われなくなったタブは、Frozen(凍結)→ Discarded(破棄)と段階的にメモリを返す。
× を押せば OS がプロセスを停止し、メモリは即座に解放される。
Chrome が「重い」のは、1タブ = 1プロセス という設計の代償。
安定性とセキュリティを買うために、あえてメモリを使っている。

タブは OS のプロセスから来て、
OS のメモリ解放へ消える。

+ を押せば OS がプロセスを生み、
× を押せば OS がプロセスを殺す。
タブの一生は、OS のプロセスの一生だった。 — ご清聴ありがとうございました
1 / 15