JVM のいろはにほ #javajo
-
Upload
yuji-kubota -
Category
Technology
-
view
5.237 -
download
0
Transcript of JVM のいろはにほ #javajo
Copyright©2015 NTT corp. All Rights Reserved.
JVMのいろはにほ
久保田 祐史日本電信電話株式会社
OSS センタ
-私はこうやってJVMが好きになった話-
2Copyright©2015 NTT corp. All Rights Reserved.
•本スライドで示されている見解は私個人のものであり、所属組織の見解を反映したものではありません
•講義(口頭での補足)前提の資料のため、本資料だけでは解り辛い箇所があります
Disclaimer
3Copyright©2015 NTT corp. All Rights Reserved.
•ざっくばらんと話します
•極力、正確を期していますが、簡易化のために(問題ない範囲で)
正確ではない部分もあります
•ここでの JVM = HotSpot VM
•いわゆる OpenJDK/Oracle JDK
•JVM 自体は他にも色々あります
注意事項
4Copyright©2015 NTT corp. All Rights Reserved.
•解らないことがあったら講師を止めまてください
•手を挙げる
•Tweet で呼びかける(#javajo)
•よこなさんに目配せをする
注意事項 (当日)
5Copyright©2015 NTT corp. All Rights Reserved.
•自己紹介
•JVM ってなに?
•JVM の主要機能
•コードの実行
•メモリの管理
•HeapStats
目次
6Copyright©2015 NTT corp. All Rights Reserved.
•久保田 祐史 (KUBOTA Yuji)
•@sugarlife
•Java 歴 6 年?
•入社してから Java を学んだ
•約 2 年ぐらい前から OpenJDK を読み始めた
自己紹介
7Copyright©2015 NTT corp. All Rights Reserved.
自己紹介
都内のほどほどのお値段のスイーツ情報募集中
8Copyright©2015 NTT corp. All Rights Reserved.
•自己紹介
•JVM ってなに?
•JVM の主要機能
•コードの実行
•メモリの管理
•HeapStats コマーシャル
目次
9Copyright©2015 NTT corp. All Rights Reserved.
•JVM の出番はどこ?
•ソースコードを書く
•Duke.java
•ソースコードをコンパイルする
•javac Duke.java
•実行する
•java Duke
Java の動かし方
10Copyright©2015 NTT corp. All Rights Reserved.
•Java 仮想マシン (Virtual Machine)
•Java バイトコード の実行環境
•書いたコードがどこでも動く
JVM とは
Windows Linux OS
Windows用JVM
Linux用JVM
各OS用JVM
Java バイトコード
ソースコード コンパイル(javac)
11Copyright©2015 NTT corp. All Rights Reserved.
•コードの実行•新しい型の検索、ロード、検証(クラスローダ)
•メソッドの要求する命令・計算の実行(インタプリタ、JITコンパイラ)
•メモリの管理•コードの代わりにメモリ管理
JVM の主な機能
12Copyright©2015 NTT corp. All Rights Reserved.
JVM の機能イメージ
static void main(String.. args){ Duke duke = new Duke();
}
このメソッドを実行してあげないとダメ
このクラスを理解してあげないとダメ
これらを全部メモリ上に配置してやらないとダメ
※実際はバイトコード等
13Copyright©2015 NTT corp. All Rights Reserved.
寄り道:JVM?JDK?JRE?
14Copyright©2015 NTT corp. All Rights Reserved.
•JDK を導入すれば OK
寄り道:JVM と JRE と JDK
JVMクラス
ライブラリ(rt.jar)
JRE (Java Runtime Environment)
開発ツール( javac 等)
JDK (Java Development Tools)
最小限しか入れたくない場合は JRE だが、トラブルシューティングに必要なツールも入ってるので、JDK を導入したほうが良い
15Copyright©2015 NTT corp. All Rights Reserved.
•自己紹介
•JVM ってなに?
•JVM の主要機能
•コードの実行
•メモリの管理
•HeapStats
目次
16Copyright©2015 NTT corp. All Rights Reserved.
•クラスローダ
•クラスファイル (*.class) を動的にメモリ上にロードする機能
•必要になった時にロードする
•コアクラスライブラリ等は起動時に読み込まれる
•クラスローダは複数種類ある
•親子関係を持つ
JVM の機能:コードの実行
17Copyright©2015 NTT corp. All Rights Reserved.
•インタプリタ•バイトコードを逐次解釈しながら実行する機能
•JITコンパイラ (Just-In-Time)
•実行時に機械語へ変換して高速化を図る機能
•実行回数が規定値を超えたメソッドのみをJITコンパイルする
JVM の機能:コードの実行
18Copyright©2015 NTT corp. All Rights Reserved.
•イメージ
JVM の機能:コードの実行
クラスローダ
メモリ空間(※)
JIT コンパイラ
システム (OS)
マシン語
クラスファイル
インタプリタ
バイトコード
ソースコード
コンパイル (javac)
特定条件で
※:実際はクラスローダ等もメモリ空間に存在する
19Copyright©2015 NTT corp. All Rights Reserved.
•初心者の時点ではほぼない
•全体図をイメージできたらgood
•詳細を意識し始める時期
•NoClassDefFoundError
•該当クラスがクラスパスにあるのに発生したら、クラスローダの仕組みを理解すべき時期
•日本語の参考資料:IBM, @ashigeru
開発者が意識すべきポイントは?
20Copyright©2015 NTT corp. All Rights Reserved.
•詳細を意識し始める時期(続)
•ソース変えずにデバッグしたい
•バイトコードインジェクションという手段がある。例:byteman
•JITコンパイル方法を知りたい
•Java Day Tokyo 2014 の資料が手始めに良い
•知りたくなる時期はたぶん来ない
開発者が意識すべきポイントは?
21Copyright©2015 NTT corp. All Rights Reserved.
•自己紹介
•JVM ってなに?
•JVM の主要機能
•コードの実行
•メモリの管理
•HeapStats
目次
22Copyright©2015 NTT corp. All Rights Reserved.
•Java のメモリ構造
JVM の機能:メモリの管理
ヒープ(Heap)
C ヒープ(C heap)
Java アプリが使うところ
主に JVM が使うところ
非ヒープ(Non Heap)
まとめてヒープと呼ぶ場合もある
23Copyright©2015 NTT corp. All Rights Reserved.
ヒープHeap
•ヒープ
JVM の機能:メモリの管理
非ヒープNon Heap
24Copyright©2015 NTT corp. All Rights Reserved.
•ヒープ:世代分け (Generation)
JVM の機能:メモリの管理
Young 世代Tenured 世代
(Old 世代)
JDK7 以前はPermanent 世代
JDK8 以降は世代なし
25Copyright©2015 NTT corp. All Rights Reserved.
•ヒープ:領域分け (Space)
JVM の機能:メモリの管理
Old
JDK7以前:Permanent
JDK8以降:Metaspace
Eden
Survivor
0
Survivor
1
Young 世代 Tenured(Old) 世代
26Copyright©2015 NTT corp. All Rights Reserved.
•なぜヒープを分けているの?
•複数の GC を利用するため
•GC = ガベージコレクション。不要なメモリを回収する機能
•複数の GC = 世代別 GC と呼ぶ
•なぜ複数必要なの?
•可能な限りアプリケーション停止時間を短くするための工夫
JVM の機能:メモリの管理
27Copyright©2015 NTT corp. All Rights Reserved.
•各 GC の担当範囲
JVM の機能:メモリの管理
Young 世代 Tenured(Old)世代 Non Heap
Minor GC 担当 Major GC 担当(※)
※:Javaオプションや状況によって範囲が異なります
28Copyright©2015 NTT corp. All Rights Reserved.
•メモリ周りのエラー
•早い話が OutOfMemoryError
•原因をどうやって確認するか
•メモリリーク?
•メモリ不足?
•それ以外(バグ)?
開発者が意識すべきポイントは?
29Copyright©2015 NTT corp. All Rights Reserved.
•OOME も色々ある
開発者が意識すべきポイントは?
「slideshare oome」で検索。http://www.slideshare.net/Yuj
iKubota/javalangoutofmemor
yerror-java
30Copyright©2015 NTT corp. All Rights Reserved.
•OutOfMemoryError:message
•ログ (message) をまず確認する
•ヒープなら、リークか不足か
•ヒープ使用量をグラフ化して確認
OOME 原因の確認方法
31Copyright©2015 NTT corp. All Rights Reserved.
•ヒープ使用量のグラフ化方法
•GC ログをGCViewer でグラフ化
•Used Heap (青線) の動きを見る
•GC ログは以下のオプションを追加して収集する
•-Xloggc:<path_to_file>
•-XX:+PrintGCDetails
•-XX:+PrintGCDateStamps
OOME 原因の確認方法
32Copyright©2015 NTT corp. All Rights Reserved.
•Concurrent Mark-Sweep の場合
GCって?
http://www.slideshare.net/YujiKubota/concu
rrent-marksweep-garbage-collection
33Copyright©2015 NTT corp. All Rights Reserved.
•自己紹介
•JVM ってなに?
•JVM の主要機能
•コードの実行
•メモリの管理
•HeapStats
目次
34Copyright©2015 NTT corp. All Rights Reserved.
詳細は JJUG CCC 2015 Spring で!※: #javajo では説明しました