21 章のお話

Similar documents
ファイナライザを理解する ~ ファイナライザに起因するトラブルを避けるために ~ 2013 年 11 月 25 日 橋口雅史 Java アプリケーションでファイナライザ (finalize() メソッド ) を使用したことがあるプログラマーは多いと思います しかし ファイナライザの仕組みや注意点につ

Microsoft PowerPoint - OS08.pptx

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

PowerPoint プレゼンテーション

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

JavaプログラミングⅠ

POSIXスレッド

JavaプログラミングⅠ

Microsoft PowerPoint ppt

10-vm1.ppt

プログラミング基礎I(再)

Javaの作成の前に

// このクラスの有効期間中の各呼び出しに使用される キャッシュされた Socket オブジェクト Socket socket = null; // 非同期処理が完了したことを通知するために信号を送るオブジェクト static ManualResetEvent clientdone = new Ma

Real-Time Java ~ 組み込みからエンタープライズまで ~ サン マイクロシステムズ株式会社ソフトウェア OEM 営業本部草薙昭彦

Microsoft PowerPoint - kougi9.ppt

メディプロ1 Javaプログラミング補足資料.ppt

WebOTXプロファイラを使用したメモリリーク調査方法

Prog2_9th

計算機概論

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Microsoft PowerPoint - 09.pptx

PowerPoint プレゼンテーション

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

Microsoft PowerPoint - OS07.pptx

JavaプログラミングⅠ

02: 変数と標準入出力

とても使いやすい Boost の serialization

(ch2 + i)->next = ch1 + r; doit(ch1, ch2); 図 1 ランダムアクセスする C ソース 時間 (elapsed) 32 ビットプログラム (gcc -O2 -m32 でコンパイル ) 6.23 秒 秒 64 ビットプログラム (gcc -O2 -m

Prog1_15th

Prog1_10th

12.1 インターネットアドレス インターネットアドレス インターネットアドレス 32 ビットの長さを持つインターネットに接続されたマシンを識別するのに使う インターネットアドレスは ピリオドで区切られたトークンの並びで表現されることもある インターネットアドレス

kantan_C_1_iro3.indd

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Java言語 第1回

Microsoft Word - 中間試験 その1_解答例.doc

PowerPoint プレゼンテーション

05-scheduling.ppt

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

ファイル操作-バイナリファイル

02: 変数と標準入出力

Microsoft PowerPoint - os ppt [互換モード]

Microsoft PowerPoint - kougi7.ppt

プログラミング入門1

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.


Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Microsoft PowerPoint - sp ppt [互換モード]

PowerPoint プレゼンテーション

02: 変数と標準入出力

JAVA とテンプレート

Microsoft PowerPoint - lec06 [互換モード]

NetworkVantage 9

HashMapからConcurrentHashMapへの移行

Full GC発生を抑止するメモリ管理技術

文字列操作と正規表現

Microsoft PowerPoint - prog03.ppt

目次 目次... 1 はじめに... 3 概要... 4 サポート環境... 5 関数... 6 MEC_OpenDevice... 7 MECDevice_Release... 8 MECDevice_GetFirmVersion... 9 MECDevice_GetCoreTemperature

Microsoft PowerPoint - chap10_OOP.ppt

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

f-secure 2006 インストールガイド

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

JAVA入門

メソッドのまとめ

プログラミングI第10回

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

ガイダンス

Windows10の標準機能だけでデータを完全バックアップする方法 | 【ぱそちき】パソコン初心者に教えたい仕事に役立つPC知識

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

JavaプログラミングⅠ

PowerPoint プレゼンテーション

C#の基本2 ~プログラムの制御構造~

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

02: 変数と標準入出力

Microsoft PowerPoint - prog04.ppt

Operating System 仮想記憶

PowerPoint プレゼンテーション

GEC-Java

基本情報STEP UP演習Java対策

Microsoft PowerPoint - prog09.ppt

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

Microsoft PowerPoint - OS11.pptx

GEC-Java

< F2D B838A835882CC8CF68EAE2E6A7464>

JavaプログラミングⅠ

Microsoft PowerPoint ppt

スライド 1

1

Microsoft PowerPoint - prog09.ppt

C#の基本


プログラミング入門1

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

Sort-of-List-Map(A)

グラフィックトレーニング 概要.NET のグラフィック描画は どんなことができるのでしょうか? グラフィックオブジェクトやグラフィック環境 概念を理解するためには クラスを使って馴れることが近道です 本 書に記載されているコードをカットアンドペーストして 一つ一つの機能を体験してください 前提 グラ

2 / 8 オンデマンドダウンロード機能 を使用するときに次の制約があります 1. インターネットに接続されていない ( オフライン ) 場合は OneDrive エリアのみにあるファイルを開くことはできない 2.OneDrive エリアからダウンロードが完了するまでいくらか待たされるし ( 特に大

ガイダンス

Transcription:

21 章のお話

オブジェクトヘッダ 型オブジェクトポインター (4byte, 8byte) 型の構造体へのポンタ 同期ブロックインデックス (4byte, 8byte) ロックとか COM で利用する フィールド

マネージヒープ NextObjPtr

マネージヒープ NextObjPtr オブジェクト A を割り当てたい! 同期ブロック 同期ブロックインデックス ~ フィールドまでが入るようにする 型ハンドル フィールド

マネージヒープ A NextObjPtr オブジェクト A を割り当てたら NextObjPtrj がオブジェクトの直後まで進む

マネージヒープ A B NextObjPtr

マネージヒープ A B C NextObjPtr オブジェクトの割り当ては単なるポインタの加算なので非常に速い

マネージヒープ A B C D E F G H オブジェクトを割り当てようとしたが十分なアドレス空間がのこっていない! NextObjPtr ガベージコレクション実行!

全てのスレッドを一時停止 ガベージコレクション終わるまですべてのスレッドがオブジェクトにアクセスできない GC マーキングフェイズ 使ってないオブジェクトを探す コンパクションフェイズ 不要なオブジェクトを削除して圧縮する

ルート : フィールドや変数 マネージヒープ A B C D E F G H 参照を表す クラスの静的またはインスタンスフィールド メソッドの実引数 ローカル変数などで参照型の変数を総称してルートと呼びます NextObjPtr

ルート : フィールドや変数 マネージヒープ A B C D E F G H 0 0 0 0 0 0 0 0 全オブジェクトの同期ブロックインデックスフィールドに含まれているビットに 0 を指定 これはすべてのオブジェクトを削除するという意味 NextObjPtr

ルート : フィールドや変数 マネージヒープ A B C D E F G H 1 0 1 1 0 1 0 0 ルートから直接参照されているオブジェクトをマークします NextObjPtr

ルート : フィールドや変数 マネージヒープ A B C D E F G H 1 0 1 1 0 1 1 0 マークをする際に もし他のオブジェクトを NextObjPtr 参照している場合は そのオブジェクトもマークします この例だとDをマークするときはGもマークします

ルート : フィールドや変数 マネージヒープ A B C D E F G H 1 0 1 1 0 1 1 0 これでマーキングフェイズが完了です マークされたオブジェクトは到達可能といいます マークされていないのは到達不能といいます NextObjPtr

ルート : フィールドや変数 マネージヒープ A B C D E F G H 1 0 1 1 0 1 1 0 マークされているオブジェクトによって使用されているメモリを移動させてメモリ上に連続するようにします NextObjPtr

ルート : フィールドや変数 A C C D F G マネージヒープ オブジェクトを移動させる際に オブジェクトを参照しているルートなどは移動した分のバイト数を引く必要があります

ルート : フィールドや変数 マネージヒープ A C D F G マークされているすべてのオブジェクトに対して行います

メモリの空容量を連続的にすることで マネージヒープ上でメモリの断片化がなくなります

OutOfMemoryException の例外が発生します アプリケーションはその例外をキャッチして回復を試みることができますが ほとんどのアプリケーションはやってないのでプロセスが終了して OS がプロセスが使用していたメモリを解放します

メソッド内のオブジェクトの生存期間は最後に参照したところまでです メソッドの終了時までじゃ ないです

static void Main(string[] args) { Timer t = new Timer(TimerCallback, null, 0, 2000); } // タイミング A Console.ReadLine(); // オブジェクト t の参照 Console.WriteLine(t.ToString()); // タイミング B Console.ReadLine();

static void Main(string[] args) { Timer t = new Timer(TimerCallback, null, 0, 2000); // タイミング A Console.ReadLine(); } // オブジェクト t の参照 Console.WriteLine(t.ToString()); // タイミング B Console.ReadLine(); オブジェクト t は保障される オブジェクト t は保障されないガベージコレクションが実行されたら消える

なお Debug でビルドした場合 JIT コンパイラが生存期間を恣意的にメソッドの最後まで伸ばします Release ビルドと Debug ビルドで動きがかわるぞ! がっでむ!

CLR の GC は世代別ガレージコレクタを採用している 世代別 GC は次のことを前提にしている オブジェクトが新しいほど その生存期間は短い オブジェクトが古いほど その生存期間は長い ヒープの一部分の回収はヒープ全体の回収より高速である

マネージヒープ A B C D E 世代 0 新しく追加されるオブジェクトは常に世代 0 に追加される

マネージヒープ A B C D E 世代 0 しばらくしてオブジェクト C と E が到達不能となるその後 ガベージコレクションが発生したとする

マネージヒープ A B D 世代 1 世代 0 ガベージコレクションの後に世代 0 で生き残ったオブジェクトが世代 1 に移動して世代 0 は空になる

マネージヒープ A B D F G H 世代 1 世代 0 新しいオブジェクトは世代 0 に割り当てられていく 世代 0 の予約サイズを超えた場合にガベージコレクションが実行される

マネージヒープ A B D F H 世代 1 世代 0 世代 0 のオブジェクトのみが検査され 生き残ったオブジェクトは世代 1 に移動する 世代 1 は検査していないので オブジェクト B は生き残る

マネージヒープ A B D F H I J K L 世代 1 世代 0

マネージヒープ A B D F H I L 世代 1 世代 0 ガベージコレクションを実行していくとこのように世代 1 が徐々に増加していく

マネージヒープ A B D F H I L M N O 世代 1 世代 0 世代 1 のサイズが上限を超えた時にガベージコレクションが発生したとしよう

マネージヒープ A D L M O 世代 2 世代 1 世代 0 世代 1~ 世代 0 のオブジェクトを検査する 世代 1 の到達可能オブジェクトは世代 2 となる 世代 0 の到達可能オブジェクトは世代 1 となる

世代別に GC を行うので すべてのオブジェクトを検査しなくてすむ

世代 0 の使用量が予約サイズを超えた 予約サイズは CLR が動的に決める System.GC をコードで実行 Windows が空容量低下の状況を報告

CLR は個々のオブジェクトをスモールオブジェクトかラージオブジェクトのどちらかであると見なす 現在 85,000 バイト以上をラージオブジェクト ただし 変更される可能性あり ラージオブジェクトはスモールオブジェクトと違うアドレス空間に割り当てられる ラージオブジェクト Large Object Heap(LOH) スモールオブジェクト Small Object Heap (SOH)

現時点では GC はラージオブジェクトに対してコンパクションを行わない ラージオブジェクトは割り当て後 すぐに世代 2 の一部とみなされる 世代 2 で GC が実行される時じゃないとラージオブジェクトに対して GC は行われない

ラージオブジェクトだとメモリの断片化 ( フラグメンテーション ) が発生します

Large Object Heap A B C D

Large Object Heap A B C D オブジェクト B,C が到達不能になった

Large Object Heap A D ガベージコレクション発生後 到達不能のオブジェクトは解放され 1 つの空き容量を作成する コンパクションは行わない

Large Object Heap A E D オブジェクト E の割り当て要求に対応するために作成した空き容量が使用できる

Large Object Heap このような形で長いこと使っていると コンパクションしないので LOH だと メモリの断片化が発生する可能性がある OutOfMemoryException がスルーされる可能性ある

Using System; Using System.Runtime; // LOH に対するコンパクションを要求 GCSettings.LOHCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; // GC が発生して LOH がコンパクションされる GC.Collect(): LOH もコンパクションできる そう.NET4.5.1 ならね!

オブジェクトが GC により回収対象になった後で オブジェクトのメモリが解放される前に何らかのコードを実行できる

class Hoge{ // Finalize メソッド ~Hode() { // } } C++ のデストラクタと似ていますが 動作は異なる C++ ではスコープを外れた時に 確実に呼ばれます C# では Finalize メソッドが実行されるタイミングは全く制御できません

マネージヒープ A B C D E F B C E F ファイナライセ ーションリスト F リーチャフ ルキュー Finalize メソッドが定義してあるオブジェクトを割り当てる際 型インス箪笥コンストラクターが呼ばれる前に Finalization リストにオブジェクトのポインタが配置される

マネージヒープ A B C D E F B C E F ファイナライセ ーションリスト F リーチャフ ルキュー C D F が参照されなくなった

マネージヒープ A B C E F B E ファイナライセ ーションリスト C F F リーチャフ ルキュー ガベージコレクションが実行されると Finalize メソッドのないオブジェクト D は削除され Finalize メソッドのあるオブジェクト C F は F リーチャフ ルキューへ参照が移動する

マネージヒープ A B C E F B E ファイナライセ ーションリスト C F F リーチャフ ルキュー

マネージヒープ A B C E F B E ファイナライセ ーションリスト F リーチャフ ルキュー F リーチャフ ルキューにデータが入ると Finalize 用のスレッドが動作してキューからデータを取り出して Finalize メソッドを実行します F リーチャフ ルキューから参照が消えて C,F オブジェクトは到達不能となる

マネージヒープ A B E B E ファイナライセ ーションリスト F リーチャフ ルキュー その次のタイミングのガベージコレクションでオブジェクトは削除される

Finalize を使うオブジェクトは削除されるまでに 2 回のガベージコレクションが必要になる

CLR オブジェクトヘッダーの構造 http://dotnetlogbook.blogspot.jp/2009/09/clr.html 大きなオブジェクトヒープの秘密 http://msdn.microsoft.com/ja-jp/magazine/cc53499 The Dangers of the Large Object Heap https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-thelarge-object-heap/