Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
メモリ管理の話 
2014/09/05 エスキュービズム・テクノロジー勉強会
メモリ管理とは? 
確保したメモリは、必ず破棄する 
char *hoge = (char*)malloc(10); 
//…… 
free(hoge);
メモリ管理とは? 
確保したメモリは、必ず破棄する 
 => 結構難しい 
char *hoge = (char*)malloc(10); 
//…… <- ここでreturn、例外があるとリーク 
free(hoge);
メモリ管理とは? 
メモリ開放を絶対忘れないようにしよう
メモリ管理とは? 
メモリ開放を絶対忘れないようにしよう 
メモリ解放が必要ない仕組みを利用しよう
参照カウンタとガベージコレクション 
不要になったメモリを自動的に開放する仕組み 
参照カウント 
 参照されている数をカウントし、0になったらメモリ解放 
ガベージコレクション 
 参照関係をたどり、見つかったオブジェクト以外を開放
言語毎のメモリ管理 
手動管理 
 C C++(shared_ptrなし) 
参照カウンタ 
 C++(shard_ptrあり) 
ガベージコレクション 
 Ruby D Java  
-> Objectiv-C䛿䠛
言語毎のメモリ管理 
手動管理 
 C C++(shared_ptrなし) 
参照カウンタ 
 C++(shard_ptrあり) Objective-C(ARC) Swift 
ガベージコレクション 
 Ruby D Java  
-> PHP䛿䠛
言語毎のメモリ管理 
手動管理 
 C C++(shared_ptrなし) 
参照カウンタ 
 C++(shard_ptrあり) Objective-C(ARC) Swift PHP 
ガベージコレクション 
 Ruby D Java  
-> C#䛿䠛
言語毎のメモリ管理 
手動管理 
 C C++(shared_ptrなし) 
参照カウンタ 
 C++(shard_ptrあり) Objective-C(ARC) Swift PHP 
ガベージコレクション 
 Ruby D Java C# 
参照カウンタ
参照カウンタ
参照カウンタ
参照カウンタ
参照カウンタ
参照カウンタ
参照カウンタ
参照カウンタ
参照カウンタ
参照カウンタ
参照カウンタ 
プロパティからの参照
参照カウンタ 
プロパティからの参照
参照カウンタ 
プロパティからの参照
参照カウンタ 
プロパティからの参照
参照カウンタ 
プロパティからの参照
参照カウンタ 
プロパティからの参照
参照カウンタ 
弱点:循環参照
参照カウンタ 
弱点:循環参照
参照カウンタ 
対策:弱参照 (参照カウントを上げない参照)
参照カウンタ 
多くの場合、子から親への参照をweakにする
参照カウンタ 
多くの場合、子から親への参照をweakにする 
代表的な例が、Objective-Cのdelegete 
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
self.text_clientName.delegate = self; 
self.text_orderId.delegate = self; 
}
参照カウンタ 
多くの場合、子から親への参照をweakにする 
代表的な例が、Objective-Cのdelegete 
プロパティの定義でweakに 
@property (weak) id<ChoiceGroupViewControllerDelegate> delegate;
ガベージコレクタ(GC) 
空いた時間に自動的にメモリを解放 
使われているオブジェクトの参照を辿って使用中の 
オブジェクトを判別 
● コピーGC 
● マーク&スイープ 
● これらに+αした方式(世代別GC) 
等が代表的
ガベージコレクタ(GC)
ガベージコレクタ(GC)
ガベージコレクタ(GC)
ガベージコレクタ(GC)
ガベージコレクタ(GC)
ガベージコレクタ(GC) 
ただし、万能ではない 
無限に配列に追加する 
子のオブジェクトを次々に参照する 
等プログラムのバグでリークを起こすことも 
後はライブラリのバグとか......
ガベージコレクタ(GC)
ガベージコレクタ(GC) 
メモリリーク対策 
● グローバルなコレクションへの追加は注意 
● Viewなど複雑な参照関係に注意 
● 怪しいと思ったら変数にnullを代入 
● 弱参照を使う(GCにも弱参照はある)
クロージャに気をつけよう 
クロージャとは? 
wikipedia(http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83% 
BC%E3%82%B8%E3%83%A3)より引用 
䜽䝻䞊䝆䝱䠄䜽䝻䞊䝆䝱䞊䚸ⱥ: closure䠅䚸㛵ᩘ㛢ໟ䛿䝥䝻䜾䝷 
䝭䞁䜾ゝㄒ䛻䛚䛡䜛㛵ᩘ䜸䝤䝆䜵䜽䝖䛾୍✀䚹䛔䛟䛴䛛䛾ゝㄒ 
䛷䛿䝷䝮䝎ᘧ䜔↓ྡ㛵ᩘ䛷ᐇ⌧䛧䛶䛔䜛䚹ᘬᩘ௨እ䛾ኚᩘ䜢 
ᐇ⾜᫬䛾⎔ቃ䛷䛿䛺䛟䚸⮬㌟䛜ᐃ⩏䛥䜜䛯⎔ቃ䠄㟼ⓗ䝇䝁䞊 
䝥䠅䛻䛚䛔䛶ゎỴ䛩䜛䛣䛸䜢≉ᚩ䛸䛩䜛䚹 
=> 㛵ᩘእ䛾ኚᩘ䛜฼⏝䛷䛝䜛䝷䝮䝎ᘧ
クロージャに気をつけよう 
function convertEncording($line) { 
$encoding = mb_detect_encoding(implode(" ", $line)); 
if ($encoding !== 'UTF-8') { 
$line = __::map($line, function($v, $k, $line) { 
$encoding = mb_detect_encoding(implode(" ", $line)); 
return mb_convert_encoding($v, 'UTF-8', $encoding); 
}); 
} 
return $line; 
} 
ECsvUpload䜘䜚 
䚷㔜」䛧䛯㛵ᩘ࿧䜃ฟ䛧䛜䛒䜛
クロージャに気をつけよう 
function convertEncording($line) { 
$encoding = mb_detect_encoding(implode(" ", $line)); 
if ($encoding !== 'UTF-8') { 
$line = __::map($line, function($v, $k, $line) { 
// $encoding = mb_detect_encoding(implode(" ", $line)); 
return mb_convert_encoding($v, 'UTF-8', $encoding); 
}); 
} 
return $line; 
} 
䛣䜜䛿䛷䛝䛺䛔
クロージャに気をつけよう 
function convertEncording($line) { 
$encoding = mb_detect_encoding(implode(" ", $line)); 
if ($encoding !== 'UTF-8') { 
$line = __::map($line, function($v, $k, $line) use ($encoding) { 
// $encoding = mb_detect_encoding(implode(" ", $line)); 
return mb_convert_encoding($v, 'UTF-8', $encoding); 
}); 
} 
return $line; 
} 
᫂♧ⓗ䛻䜻䝱䝥䝏䝱䛧䛺䛡䜜䜀䛺䜙䛺䛔 
䚷=> 䜽䝻䞊䝆䝱䛿እ㒊ኚᩘ䜈䛾ཧ↷䜢ᣢ䛴
クロージャに気をつけよう 
昔、RequestHelperにも 
クロージャによる循環参照があった。
クロージャに気をつけよう
クロージャに気をつけよう 
䜽䝻䞊䝆䝱ෆ䛷䜽䝻䞊䝆䝱⮬㌟䜢ཧ↷ 
䚷-> 䝁䞁䝟䜲䝷䛻䜒㆙࿌䛥䜜䛶䜛
クロージャに気をつけよう
クロージャに気をつけよう
クロージャに気をつけよう
クロージャに気をつけよう 
循環参照!
C#のイベントに気をつけよう 
C#のイベントは強参照のコレクション 
Viewに登録することが多い 
イベントにはクロージャを登録できる 
=> リークしやすい 
view.onClick += (Event e) { 
// ……. 
}

More Related Content

メモリ管理の話_エスキュービズム勉強会20140926