29
ガベージコレクション GC)10分ハック 1

ガベージコレクション(GC)10分ハック

Embed Size (px)

DESCRIPTION

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 ``` とあるエンドユーザ向けウェブアプリ

Citation preview

Page 1: ガベージコレクション(GC)10分ハック

ガベージコレクション(GC)10分ハック

1

Page 2: ガベージコレクション(GC)10分ハック

ガベージコレクション4 いわゆるGC。ゴミ掃除。4 Java仮想マシン(Javaを動かす人)がメモリの割り当てや解放を自動で行う仕組み

2

Page 3: ガベージコレクション(GC)10分ハック

ガベージコレクション4 いわゆるGC。ゴミ掃除。4 Java仮想マシン(Javaを動かす人)がメモリの割り当てや解放を自動で行う仕組み

プログラマのメモリ管理の負担が激減(๑′ᴗ'๑)

3

Page 4: ガベージコレクション(GC)10分ハック

なぜいまさらGCなのか4 近年、「やりたいことに集中できる環境や道具」が評価される風潮を感じる。実際嬉しい。4 WIndows Azure, AWS, Heroku

4 Eclipse, Intellij, Twitter Bootstrap

4

Page 5: ガベージコレクション(GC)10分ハック

なぜいまさらGCなのか4 近年、「やりたいことに集中できる環境や道具」が評価される風潮を感じる。実際嬉しい。4 WIndows Azure, AWS, Heroku

4 Eclipse, Intellij, Twitter Bootstrap

肩代わりしてくれている作業の実態を知っておくことは重要その中でも完全に丸投げしているメモリ管理に注目

5

Page 6: ガベージコレクション(GC)10分ハック

ゴール4 Javaを起動するとき4 Javaを書くときGCと仲良くなる

6

Page 7: ガベージコレクション(GC)10分ハック

アジェンダ4 GCの仕組み4 GCとJava仮想マシン起動オプション4 GCとJavaプログラム

7

Page 8: ガベージコレクション(GC)10分ハック

GCの仕組みJava仮想マシンが、プログラム実行中に・・・4 いらなくなったオブジェクトを掃除4 オブジェクトの生死マーク付け4 「いらない」とマーク付されたオブジェクトを掃除

オブジェクトの生死は「参照」の有無で判断。

8

Page 9: ガベージコレクション(GC)10分ハック

世代別ヒープ4 オブジェクトの生存期間に応じて、世代別ヒープで管理4 ヒープ・・・Javaが使うメモリ領域のこと

9

Page 10: ガベージコレクション(GC)10分ハック

New領域はさらに細かく分割

10

Page 11: ガベージコレクション(GC)10分ハック

以下考え方に基づいたアルゴリズム4 GCの対象領域を最小限にしたい4 ヒープすべてをGCの対象にするのは時間がかかる4 生成されるオブジェクトのほとんどが短命

4 基本的にはNew領域だけを対象としてGC→Minor GC

4 Tenured領域が逼迫しているときだけ→Full GC

11

Page 12: ガベージコレクション(GC)10分ハック

アジェンダ4 GCの仕組み4 GCとJava仮想マシン起動オプション4 GCとJavaプログラム

12

Page 13: ガベージコレクション(GC)10分ハック

GCと起動オプションJAVA_OPTS="-server-Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m-XX:PermSize=128m -XX:MaxPermSize=512m-XX:+UseParNewGC -XX:ParallelGCThreads=4

13

Page 14: ガベージコレクション(GC)10分ハック

GCと起動オプションJAVA_OPTS="-server-Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m-XX:PermSize=128m -XX:MaxPermSize=512m-XX:+UseParNewGC -XX:ParallelGCThreads=4

とあるエンドユーザ向けウェブアプリケーションの起動オプション(抜粋)

14

Page 15: ガベージコレクション(GC)10分ハック

ヒープサイズに関連するオプション

15

Page 16: ガベージコレクション(GC)10分ハック

パーマネント領域に関連するオプションクラスやメソッドの情報を格納

16

Page 17: ガベージコレクション(GC)10分ハック

GCの実行方法に関連するオプション4 -XX:+UseParNewGC

New領域のGCをマルチスレッドで実行する4 -XX:ParallelGCThreads=4

GCをマルチスレッドで実行する場合、そのスレッド数は4である

17

Page 18: ガベージコレクション(GC)10分ハック

GCに関する起動オプションはたくさんある参考になった:チューニングのためのJava VM講座(後編):ガベージコレクタの仕組みを理解する (2/2) - @IT http://www.atmarkit.co.jp/ait/articles/0404/02/news079_2.html

18

Page 19: ガベージコレクション(GC)10分ハック

アジェンダ4 GCの仕組み4 GCとJava仮想マシン起動オプション4 GCとJavaプログラム

19

Page 20: ガベージコレクション(GC)10分ハック

JBoss: JBoss Cluster is error stateOutOfMemoryError

20

Page 21: ガベージコレクション(GC)10分ハック

JBoss: JBoss Cluster is error stateOutOfMemoryError

OutOfMemoryError

21

Page 22: ガベージコレクション(GC)10分ハック

JBoss: JBoss Cluster is error stateOutOfMemoryError

OutOfMemoryErrorサーバはしぬ

22

Page 23: ガベージコレクション(GC)10分ハック

実装時からメモリと仲良くなっておく4 OutOfMemoryを抑制する4 Full GCを抑制する

23

Page 24: ガベージコレクション(GC)10分ハック

OutOfMemoryが発生するタイプ4 サイズオーバー4 メモリリーク

24

Page 25: ガベージコレクション(GC)10分ハック

サイズオーバー巨大なバッチ処理などでメモリを食いつくす(Bad) DBから取得した情報を一気にCSVに加工して吐き出す(Good) ストリーミング処理で順次にメモリを使う

25

Page 26: ガベージコレクション(GC)10分ハック

メモリリーク掃除されないオブジェクトが蓄積されていき、最後にはヒープ領域を食いつぶす(Bad) 生き続けるオブジェクトの変数領域が増えていく(Good)ライフサイクルを理解し、適切な場所に変数を宣言する

26

Page 27: ガベージコレクション(GC)10分ハック

実装時からメモリと仲良くなっておく4 OutOfMemoryを抑制する4 Full GCを抑制する

27

Page 28: ガベージコレクション(GC)10分ハック

Full GCの発生を抑制する4 オブジェクトのスコープを必要最小限に抑える4 長期間利用するオブジェクトのサイズを調節する1

4 セッション・コネクションプール4 短命オブジェクトが多い場合、New領域を大きめに取る4 長期オブジェクトが多い場合、Old領域を大きめに取る1 Javaパフォーマンス改善 - Full GCの原因とその解決方法について - Java入門

28

Page 29: ガベージコレクション(GC)10分ハック

[まとめ] GCと仲良くなるには4 Full GCを抑制する実装4 メモリリークのない実装4 起動オプションで世代別ヒープサイズを調節4 監視のときにGCの動きを想像

29