SlideShare a Scribd company logo
1 of 29
Download to read offline
ガベージコレクション
(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 state
OutOfMemoryError
20
JBoss: JBoss Cluster is error state
OutOfMemoryError
OutOfMemoryError
21
JBoss: JBoss Cluster is error state
OutOfMemoryError
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

More Related Content

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

Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)Koichi Sakata
 
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)sogdice
 
システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法Takuma Watabiki
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsYoshimasa Tanabe
 
Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!ymmt
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルにHiroko Tamagawa
 
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)kojiokb
 
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイントKentaro Matsui
 

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

Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
 
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
 
システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
 
Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
 
20121215 DevLOVE2012 Mahout on AWS
20121215 DevLOVE2012 Mahout on AWS20121215 DevLOVE2012 Mahout on AWS
20121215 DevLOVE2012 Mahout on AWS
 
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント
 

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