Upload
yusuke-wada
View
363
Download
3
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
ガベージコレクション(GC)10分ハック
1
ガベージコレクション4 いわゆるGC。ゴミ掃除。4 Java仮想マシン(Javaを動かす人)がメモリの割り当てや解放を自動で行う仕組み
2
ガベージコレクション4 いわゆるGC。ゴミ掃除。4 Java仮想マシン(Javaを動かす人)がメモリの割り当てや解放を自動で行う仕組み
プログラマのメモリ管理の負担が激減(๑′ᴗ'๑)
3
なぜいまさらGCなのか4 近年、「やりたいことに集中できる環境や道具」が評価される風潮を感じる。実際嬉しい。4 WIndows Azure, AWS, Heroku
4 Eclipse, Intellij, Twitter Bootstrap
4
なぜいまさらGCなのか4 近年、「やりたいことに集中できる環境や道具」が評価される風潮を感じる。実際嬉しい。4 WIndows Azure, AWS, Heroku
4 Eclipse, Intellij, Twitter Bootstrap
肩代わりしてくれている作業の実態を知っておくことは重要その中でも完全に丸投げしているメモリ管理に注目
5
ゴール4 Javaを起動するとき4 Javaを書くときGCと仲良くなる
6
アジェンダ4 GCの仕組み4 GCとJava仮想マシン起動オプション4 GCとJavaプログラム
7
GCの仕組みJava仮想マシンが、プログラム実行中に・・・4 いらなくなったオブジェクトを掃除4 オブジェクトの生死マーク付け4 「いらない」とマーク付されたオブジェクトを掃除
オブジェクトの生死は「参照」の有無で判断。
8
世代別ヒープ4 オブジェクトの生存期間に応じて、世代別ヒープで管理4 ヒープ・・・Javaが使うメモリ領域のこと
9
New領域はさらに細かく分割
10
以下考え方に基づいたアルゴリズム4 GCの対象領域を最小限にしたい4 ヒープすべてをGCの対象にするのは時間がかかる4 生成されるオブジェクトのほとんどが短命
4 基本的にはNew領域だけを対象としてGC→Minor GC
4 Tenured領域が逼迫しているときだけ→Full GC
11
アジェンダ4 GCの仕組み4 GCとJava仮想マシン起動オプション4 GCとJavaプログラム
12
GCと起動オプションJAVA_OPTS="-server-Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m-XX:PermSize=128m -XX:MaxPermSize=512m-XX:+UseParNewGC -XX:ParallelGCThreads=4
13
GCと起動オプションJAVA_OPTS="-server-Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m-XX:PermSize=128m -XX:MaxPermSize=512m-XX:+UseParNewGC -XX:ParallelGCThreads=4
とあるエンドユーザ向けウェブアプリケーションの起動オプション(抜粋)
14
ヒープサイズに関連するオプション
15
パーマネント領域に関連するオプションクラスやメソッドの情報を格納
16
GCの実行方法に関連するオプション4 -XX:+UseParNewGC
New領域のGCをマルチスレッドで実行する4 -XX:ParallelGCThreads=4
GCをマルチスレッドで実行する場合、そのスレッド数は4である
17
GCに関する起動オプションはたくさんある参考になった:チューニングのためのJava VM講座(後編):ガベージコレクタの仕組みを理解する (2/2) - @IT http://www.atmarkit.co.jp/ait/articles/0404/02/news079_2.html
18
アジェンダ4 GCの仕組み4 GCとJava仮想マシン起動オプション4 GCとJavaプログラム
19
JBoss: JBoss Cluster is error stateOutOfMemoryError
20
JBoss: JBoss Cluster is error stateOutOfMemoryError
OutOfMemoryError
21
JBoss: JBoss Cluster is error stateOutOfMemoryError
OutOfMemoryErrorサーバはしぬ
22
実装時からメモリと仲良くなっておく4 OutOfMemoryを抑制する4 Full GCを抑制する
23
OutOfMemoryが発生するタイプ4 サイズオーバー4 メモリリーク
24
サイズオーバー巨大なバッチ処理などでメモリを食いつくす(Bad) DBから取得した情報を一気にCSVに加工して吐き出す(Good) ストリーミング処理で順次にメモリを使う
25
メモリリーク掃除されないオブジェクトが蓄積されていき、最後にはヒープ領域を食いつぶす(Bad) 生き続けるオブジェクトの変数領域が増えていく(Good)ライフサイクルを理解し、適切な場所に変数を宣言する
26
実装時からメモリと仲良くなっておく4 OutOfMemoryを抑制する4 Full GCを抑制する
27
Full GCの発生を抑制する4 オブジェクトのスコープを必要最小限に抑える4 長期間利用するオブジェクトのサイズを調節する1
4 セッション・コネクションプール4 短命オブジェクトが多い場合、New領域を大きめに取る4 長期オブジェクトが多い場合、Old領域を大きめに取る1 Javaパフォーマンス改善 - Full GCの原因とその解決方法について - Java入門
28
[まとめ] GCと仲良くなるには4 Full GCを抑制する実装4 メモリリークのない実装4 起動オプションで世代別ヒープサイズを調節4 監視のときにGCの動きを想像
29