slidenumbers: true
# ガベージコレクション(GC)10分ハック
---
# ガベージコレクション
- いわゆるGC。ゴミ掃除。
- Java仮想マシン(Javaを動かす人)がメモリの割り当てや解放を自動で行う仕組み
---
# ガベージコレクション
- いわゆるGC。ゴミ掃除。
- Java仮想マシン(Javaを動かす人)がメモリの割り当てや解放を自動で行う仕組み
プログラマのメモリ管理の負担が激減(๑′ᴗ'๑)
---
# なぜいまさらGCなのか
- 近年、「やりたいことに集中できる環境や道具」が評価される風潮を感じる。実際嬉しい。
- WIndows Azure, AWS, Heroku
- Eclipse, Intellij, Twitter Bootstrap
---
# なぜいまさらGCなのか
- 近年、「やりたいことに集中できる環境や道具」が評価される風潮を感じる。実際嬉しい。
- WIndows Azure, AWS, Heroku
- Eclipse, Intellij, Twitter Bootstrap
肩代わりしてくれている作業の実態を知っておくことは重要
その中でも完全に丸投げしているメモリ管理に注目
---
# ゴール
* Javaを起動するとき
* Javaを書くとき
GCと仲良くなる
---
# アジェンダ
* **GCの仕組み**
* GCとJava仮想マシン起動オプション
* GCとJavaプログラム
---
# GCの仕組み
Java仮想マシンが、プログラム実行中に・・・
* いらなくなったオブジェクトを掃除
* オブジェクトの生死マーク付け
* 「いらない」とマーク付されたオブジェクトを掃除
オブジェクトの生死は「参照」の有無で判断。
---
# 世代別ヒープ
* オブジェクトの生存期間に応じて、世代別ヒープで管理
* ヒープ・・・Javaが使うメモリ領域のこと
![inline](sedai.jpg)
---
# New領域はさらに細かく分割
![inline](eden.jpg)
---
# 以下考え方に基づいたアルゴリズム
* GCの対象領域を最小限にしたい
* ヒープすべてをGCの対象にするのは時間がかかる
* 生成されるオブジェクトのほとんどが短命
* 基本的にはNew領域だけを対象としてGC→Minor GC
* Tenured領域が逼迫しているときだけ→Full GC
---
# アジェンダ
* GCの仕組み
* **GCとJava仮想マシン起動オプション**
* GCとJavaプログラム
---
# GCと起動オプション
```
JAVA_OPTS="-server
-Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m
-XX:PermSize=128m -XX:MaxPermSize=512m
-XX:+UseParNewGC -XX:ParallelGCThreads=4
```
---
# GCと起動オプション
```
JAVA_OPTS="-server
-Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m
-XX:PermSize=128m -XX:MaxPermSize=512m
-XX:+UseParNewGC -XX:ParallelGCThreads=4
```
とあるエンドユーザ向けウェブアプリ