Submit Search
Upload
JVMのGCアルゴリズムとチューニング
•
22 likes
•
22,152 views
佑
佑哉 廣岡
Follow
社内勉強会で、JVMのGCについて調べて話した時の資料を最低限の修正を加えて公開してます。寺田さん監訳の『Javaパフォーマンス』をベースにいろいろ調べてまとめました。
Read less
Read more
Technology
Report
Share
Report
Share
1 of 96
Download now
Download to read offline
Recommended
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Yuji Kubota
Metaspace
Metaspace
Yasumasa Suenaga
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
AdvancedTechNight
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Norito Agetsuma
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
Takahiro YAMADA
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
Recommended
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Yuji Kubota
Metaspace
Metaspace
Yasumasa Suenaga
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
AdvancedTechNight
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Norito Agetsuma
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
Takahiro YAMADA
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
Yuki Morishita
CRDT in 15 minutes
CRDT in 15 minutes
Shingo Omura
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
NTT DATA Technology & Innovation
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga
Akkaで分散システム入門
Akkaで分散システム入門
Shingo Omura
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
Kumazaki Hiroki
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
Takahiro YAMADA
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akihiro Suda
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
Vacuum徹底解説
Vacuum徹底解説
Masahiko Sawada
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
Takahiro YAMADA
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
More Related Content
What's hot
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
Yuki Morishita
CRDT in 15 minutes
CRDT in 15 minutes
Shingo Omura
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
NTT DATA Technology & Innovation
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga
Akkaで分散システム入門
Akkaで分散システム入門
Shingo Omura
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
Kumazaki Hiroki
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
Takahiro YAMADA
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akihiro Suda
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
Vacuum徹底解説
Vacuum徹底解説
Masahiko Sawada
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
Takahiro YAMADA
What's hot
(20)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
CRDT in 15 minutes
CRDT in 15 minutes
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akkaで分散システム入門
Akkaで分散システム入門
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Docker Compose 徹底解説
Docker Compose 徹底解説
Vacuum徹底解説
Vacuum徹底解説
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
Recently uploaded
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
Recently uploaded
(9)
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
JVMのGCアルゴリズムとチューニング
1.
JVMのGCアルゴリズム とチューニング
2.
このスライド • 社内勉強会で用いたスライドです。 • アニメーションを取り除くなどの最低限の修正を 加えて公開してます。
3.
対象Java • Java6,7,8ぐらいでの話
4.
対象聴講者 • Javaのオブジェクトがインスタンス化される際、ヒー プに割り当てられてられることを知っている。 • GCがいらなくなったインスタンスをヒープから削除 してることを知っている。 (が、実際どんな風にしているかしらない) ぐらいの知識レベルの人
5.
スライドのゴール • JVMの主なGCの種類とそれぞれのアルゴリズ ムをなんとなく把握することができた。 • GC選択の際の大まかな指針を知ることができ た。 •
それぞれのGCをチューニングの基礎ふんわり 理解した。
6.
目次 • 自己紹介 • Garbage
Collectionとは • 世代で分けられたヒープ • GCアルゴリズム • GCアルゴリズムの大まかな選び方 • GCアルゴリズムのチューニング基礎
7.
自己紹介 名前:ヒロオカ Twitter: @all_became_f 仕事:都内のSIerで働いている。 趣味:漫画、酒(芋焼酎、ビール)、カメラ
8.
Garbage Collectionとは
9.
• どこからも参照されてないインスタンスを削除し、 ヒープを開放する。 • 解放されたヒープの領域は再利用可能になる。 Garbage
Collectionとは
10.
世代で分けられたヒープ
11.
ヒープをそのまま使った場合 ヒープをそのまま使うと… ⇒毎回ヒープ全領域に対してGCを行う必要があり 非効率
12.
ヒープを世代別に分けて管理 JVMでは多くのインスタンスはすぐに参照が切れる という性質を用いて世代別にヒープを管理している。 世代別に管理をする。 ⇒必要な範囲に必要な頻度でGCを行うため効率的 Eden Survivor(0,1) Old Young
13.
それぞれの領域 Survivor(0,1)領域 Eden領域にGCが走った際、参照が切れてないインスタンス割り当てられる領域 Old領域 Survivor or Eden
領域から、参照が切れなかったインスタンス割り当てられるメモ リ領域。 Eden領域 オブジェクトがインスタンス化される際に一番最初に割り当てられる領域 Eden Survivor(0,1) Old Young領域 Young
14.
領域別のGC • マイナーGC Young領域に対するGC アプリケーションプロセスを停止 時間はかからない。 • フルGC Young領域,
Old領域に対するGC アプリケーションプロセスを停止 時間がかかる。
15.
Stop The World(STW) •
アプリケーションプロセスが停止すること • アプリケーションの性能が落ちる
16.
GCアルゴリズム
17.
GCのアルゴリズム 複数ある シリアルGC パラレルGC CMS G1 経緯 • メモリやCPUの低価格化などによるサーバの高 性能化に合わせて、GCが追加されてきた。
18.
大きく2種に分けられるGCアルゴリズム GCの際に… アプリケーションが完全停止 • シリアル型 • マルチスレッド(スループット)型 部分的にアプリケーションと並行で、コンカレントに処理 •
コンカレント型 ・ CMS ・ G1
19.
Java6までのGC • シリアル型 • マルチスレッド(スループット)型 •
CMS(コンカレント型)
20.
Java6までのGC • シリアル型 • マルチスレッド(スループット)型 •
CMS(コンカレント型) まずはこの3つを見ていく
21.
マイナーGC Eden Survivor Old •
シリアル型でも、パラレル型でもコンカレント型で もアルゴリズムは同じ Young ここをGC
22.
f o o f o o f o o f o o h o g e h o g e h o g e マイナーGC発生条件 Stirng hoge =
new String(); Eden Survivor Old Stirng hogehoge = new String(); インスタンスは最初にEden領域に割り当てられる Stirng foofoo = new String(); Stirng foo = new String();
23.
p i n g f o o f o o f o o f o o h o g e h o g e h o g e マイナーGC発生条件 Stirng hoge =
new String(); Eden Survivor Old Stirng hogehoge = new String(); Eden領域がいっぱいになるとマイナーGCが発生する Stirng foofoo = new String(); Stirng foo = new String(); Stirng ping= new String(); マイナー GC発生
24.
p i n g f o o f o o f o o f o o h o g e h o g e h o g e Edenに対する処理 Stirng hoge =
new String(); Eden Survivor Old Stirng hogehoge = new String(); 参照されていないオブジェクトの領域を解放 Stirng foofoo = new String(); Stirng foo = new String(); Stirng ping= new String(); すでに使われていない オブジェクト
25.
p i n g Edenに対する処理 Eden Survivor Old 参照されていないオブジェクトの領域を解放 Stirng
ping= new String();
26.
残ったオブジェクトをSurvivor領域へ移動 p i n g Edenに対する処理 Eden Survivor Old Stirng
ping= new String();
27.
残ったオブジェクトをSurvivor領域へ移動 p i n g Edenに対する処理 Eden Survivor Old Stirng
ping= new String();
28.
p i n g p i n g p o n g f o o f o o f o o h o g e h o g e h o g e Survivorに対する処理 Stirng hoge =
new String(); Eden Survivor Old Stirng hogehoge = new String(); Young領域へのGCと同じタイミングで発生 Stirng foofoo = new String(); Stirng foo = new String(); Stirng ping = new String(); マイナー GC発生Stirng pingpong = new String();
29.
p i n g p i n g p o n g f o o f o o f o o h o g e h o g e h o g e Survivorに対する処理 Stirng hoge =
new String(); Eden Survivor Old Stirng hogehoge = new String(); Young領域へのGCと同じタイミングで発生 Stirng foofoo = new String(); Stirng foo = new String(); Stirng ping = new String(); Stirng pingpong = new String(); ※Edenだけではなく、 Survivorでも使われていな いものは解放される
30.
p i n g p i n g p o n g Survivorに対する処理 Eden Survivor Old Young領域へのGCと同じタイミングで発生 Stirng
ping = new String(); Stirng pingpong = new String(); ※Edenだけではなく、 Survivorでも使われていな いものは解放される
31.
p i n g p i n g p o n g Survivorに対する処理 Eden Survivor Old Stirng
ping = new String(); Stirng pingpong = new String(); EdenとSurvivorで参照の切れていないものをもう一つのSurvivorへ
32.
p i n g p i n g p o n g Survivorに対する処理 Eden Survivor Old Stirng
ping = new String(); EdenとSurvivorで参照の切れていないものをもう一つのSurvivorへ Stirng pingpong = new String();
33.
Old領域への移動(昇格)条件 • 複数回(デフォルト7回)Survivor領域に残り 続けた高年齢のインスタンス • Young領域がいっぱいになった際、Survivor 領域かEden領域で参照が切れていないイ ンスタンス
34.
フルGC • シリアル型、パラレル型はYoung領域からOld領 域への昇格に失敗した場合発生 • CMSではコンカレントサイクル(後述)に失敗した 場合発生 Eden
Survivor Old Young 全体をGC
35.
シリアル型のフルGC Eden Survivor Old
36.
シリアル型のフルGC Eden Survivor Old 1.
Old領域移動する昇格に失敗する。 Oldがいっぱいで 昇格できない
37.
シリアル型のフルGC 2. アプリケーションプロセスを停止する。 Eden Survivor
Old 1. Old領域移動する昇格に失敗する。 Oldがいっぱいで 昇格できない
38.
シリアル型のフルGC 2. アプリケーション(AP)プロセスを停止する。 Eden Survivor
Old 3. 参照されていないオブジェクトの解放 1. Old領域移動する昇格に失敗する。
39.
シリアル型のフルGC 2. アプリケーション(AP)プロセスを停止する。 Eden Survivor
Old 3. 参照されていないオブジェクトの解放 1. Old領域移動する昇格に失敗する。 4. コンパクト化する。 コンパクト化
40.
シリアル型のフルGC 2. アプリケーション(AP)プロセスを停止する。 Eden Survivor
Old 3. 参照されていないオブジェクトの解放 1. Old領域移動する昇格に失敗する。 4. コンパクト化する。
41.
パラレル型のフルGC 2. アプリケーションプロセスを停止する。 3. 参照されていないオブジェクトの解放 4.
コンパクト化する。 1. Old領域への昇格が失敗する。 Eden Survivor Old ここまではシリアル型と同じ
42.
パラレル型のフルGC 2. アプリケーションプロセスを停止する。 3. 参照されていないオブジェクトの解放 4.
コンパクト化する。 ここの手順を 複数スレッドで 1. Old領域への昇格が失敗する。 Eden Survivor Old
43.
CMSのコンカレントサイクルとフルGC Eden Survivor Old
44.
CMSのコンカレントサイクルとフルGC Eden Survivor Old 1.マイナーGCが走り、
Old領域の使用率が閾値 (デフォルトで7割)を超える。
45.
CMSのコンカレントサイクルとフルGC Eden Survivor Old 2.
APプロセスを止めずに参照されていない インスタンスを解放する。 1.マイナーGCが走り、 Old領域の使用率が閾値 (デフォルトで7割)を超える。
46.
CMSのコンカレントサイクルとフルGC Eden Survivor Old 2.
APプロセスを止めずに参照されていない インスタンスを解放する。 1.マイナーGCが走り、 Old領域の使用率が閾値 (デフォルトで7割)を超える。 3. 1. 2.のプロセスが繰り返される。(コンカレントサイクル)
47.
CMSのコンカレントサイクルとフルGC Eden Survivor Old 2.
APプロセスを止めずに参照されていない インスタンスを解放する。 1.マイナーGCが走り、 Old領域の使用率が閾値 (デフォルトで7割)を超える。 3. 1. 2.のプロセスが繰り返される。(コンカレントサイクル) 4. 解放が間に合わなかった場合 にフルGC(APプロセス を止めて、解放&コンパクト化)
48.
CMSのコンカレントサイクルとフルGC Eden Survivor Old 2.
APプロセスを止めずに参照されていない インスタンスを解放する。 1.マイナーGCが走り、 Old領域の使用率が閾値 (デフォルトで7割)を超える。 3. 1. 2.のプロセスが繰り返される。(コンカレントサイクル) 4. 解放が間に合わなかった場合 にフルGC(APプロセス を止めて、解放&コンパクト化) コンカレントモードが失敗 Concurrent Mode Failure
49.
Java6までのGCの問題点 • メモリが大きくなれば処理に時間がか かり、結局遅くなる。 解決策 Garbage First(G1)
50.
O OS S S S E O Garbage First(G1)GC •
Java7で追加 • ヒープを細かくわけた(デフォルトで2,048個)リー ジョンと呼ばれる単位で管理 • 世代領域をそれぞれのリージョンに分散して配置 S S O E E S OE Eden Survivor Old
51.
G1GCの大まかな処理の流れ 1. マイナーGCを行なう。 2. ヒープの使用率が高くなると、ゴミが多いOld 領域のリージョンにマーキングを開始 3.
十分にマーキングができるとサイクルを停止 4. ゴミが多い領域を集中してGC(混合GC)
52.
G1GCの大まかな処理の流れ 1. マイナーGCを行なう。 2. ヒープの使用率が高くなると、ゴミが多いOld 領域のリージョンにマーキングを開始 3.
十分にマーキングができるとサイクルを停止 4. ゴミが多い領域を集中してGC(混合GC) これゆえに、Garbage Firstと呼ばれる。
53.
G1GCの大まかな処理の流れ 1. マイナーGCを行なう。 2. ヒープの使用率が高くなると、ゴミが多いOld 領域のリージョンにマーキングを開始 3.
十分にマーキングができるとサイクルを停止 4. ゴミが多い領域を集中してGC(混合GC)
54.
SS S S E マイナーGC S S S OO O E E E 1.Eden領域を昇格&Survivor領域を再配置
55.
SS S S S ES S マイナーGC S S S OO O E E E New New New 1.Eden領域を昇格&Survivor領域を再配置
56.
S S S S ES S マイナーGC OO O New New New 1.Eden領域を昇格&Survivor領域を再配置
57.
S S S S ES S マイナーGC OO O New New New 1.Eden領域を昇格&Survivor領域を再配置 高年齢な インスタンス Survivor領域に入りきら なかったオブジェクト 2.『高年齢である』 or
『Suvivor領域に入りきら なかった』インスタンスを昇格させる。
58.
OS S S S E O S S マイナーGC OO O New New New 1.Eden領域を昇格&Survivor領域を再配置 高年齢な インスタンス Survivor領域に入りきら なかったオブジェクト 2.『高年齢である』 or
『Suvivor領域に入りきら なかった』インスタンスを昇格させる。
59.
O S O S S マイナーGC OO O New New New 1.Eden領域を昇格&Survivor領域を再配置 2.『高年齢である』 or 『Suvivor領域に入りきら なかった』インスタンスを昇格させる。
60.
G1GCの大まかな処理の流れ。 1. マイナーGCを行なう。 2. ヒープの使用率が高くなると、ゴミが多いOld 領域のリージョンにマーキングを開始 3.
十分にマーキングができるとサイクルを停止 4. ゴミが多い領域を集中してGC(混合GC)
61.
G1GCの大まかな処理の流れ。 1. マイナーGCを行なう。 2. ヒープの使用率が高くなると、ゴミが多いOld 領域のリージョンにマーキングを開始 3.
十分にマーキングができるとサイクルを停止 4. ゴミが多い領域を集中してGC(混合GC) このマーキングサイクルを コンカレントに行なう。
62.
O O S E O S S マーキングサイクル SO O E E 1.
マイナーGCの後、ヒープの使用率が閾値(デフォルト 45%)以上でマーキングサイクルが発生
63.
O O S E O S S マーキングサイクル SO O E E 1.
マイナーGCの後、ヒープの使用率が閾値(デフォルト 45%)以上でマーキングサイクルが発生 2. ほとんど不使用と判断されたOld領域をマーキング (黒色の領域)
64.
O O S E O S S マーキングサイクル SO O E E 1.
マイナーGCの後、ヒープの使用率が閾値(デフォルト 45%)以上でマーキングサイクルが発生 3. 解放可能な領域がヒープ全体の閾値(デフォルトで 5%)以上になればマーキングサイクルを停止 2. ほとんど不使用と判断されたOld領域をマーキング (黒色の領域)
65.
G1GCの大まかな処理の流れ。 1. マイナーGCを行なう。 2. ヒープの使用率が高くなると、ゴミが多いOld 領域のリージョンにマーキングを開始 3.
十分にマーキングができるとサイクルを停止 4. ゴミが多い領域を集中してGC(混合GC)
66.
S S O O O O S E O S S 混合GC SO O E E New New New New マーキングサイクルでマーキングした Old領域とYoung領域をGCする。
67.
S S O O O O 混合GC O New New New New マーキングサイクルでマーキングした Old領域とYoung領域をGCする。 マイナーGCも一緒に起きるので、混合 GCと呼ばれる。
68.
G1のフルGCの原因 主な原因 • 移動の失敗 • Concurrent
Mode Failure • 昇格の失敗
69.
移動の失敗 1. マイナーGCを行なう。 2. ヒープの使用率が高くなると、ゴミが多いOld 領域のリージョンにマーキングを開始 3.
十分にマーキングができるとサイクルを停止 4. ゴミが多い領域を集中してGC(混合GC) Suviver領域がいっぱいで移動が行えなかった場 合。フルGCが発生する可能性がある。
70.
Concurrent Mode Failure 1.
マイナーGCを行なう。 2. ヒープの使用率が高くなると、ゴミが多いOld 領域のリージョンにマーキングを開始 3. 十分にマーキングができるとサイクルを停止 4. ゴミが多い領域を集中してGC(混合GC) この際にOld領域がいっぱいになってしまう
71.
昇格の失敗 1. マイナーGCを行なう。 2. ヒープの使用率が高くなると、ゴミが多いOld 領域のリージョンにマーキングを開始 3.
十分にマーキングができるとサイクルを停止 4. ゴミが多い領域を集中してGC(混合GC) この際にOld領域がいっぱいになってしまう
72.
GCアルゴリズム の選び方
73.
デフォルトGC ・ Windows 32bit - シリアル 64bit
パラレル Linux 32bit 1CPUまたは2GBメモリ未満 シリアル 2CPU以上かつ2GBメモリ以上 パラレル 64bit パラレル • Java8まではシリアル型orパラレル型がデフォルト • Java9以降ではG1がデフォルト
74.
デフォルトのままだと… PCのスペックにあったベストなGCであるとは限 らない。
75.
『大まかにGC選択する時』のフロー図 開始 シリアル G1 CMSパラレル メモリが100MB以下 Or
単一コア メモリが4GB以上か? CPUの使用率が高い状態か? Yes No No No Yes Yes
76.
『大まかにGC選択する時』のフロー図 開始 シリアル G1 CMSパラレル メモリが100MB以下 Or
単一CPU メモリが4GB以上か? CPUの使用率が高い状態か? Yes No No No Yes Yes 詳細な条件を考えず、単一アプリケーションの 単位時間当たりの平均処理量を比較した時
77.
『大まかにGC選択する時』のフロー図 開始 シリアル G1 CMSパラレル メモリが100MB以下 Or
単一コア メモリが4GB以上か? CPUの使用率が高い状態か? Yes No No No Yes Yes 100MB以下では他では効果が薄い 単一コアのCPUだと複数スレッド持てない
78.
『大まかにGC選択する時』のフロー図 開始 シリアル G1 CMSパラレル メモリが100MB以下 Or
単一コア メモリが4GB以上か? CPUの使用率が高い状態か? Yes No No No Yes Yes G1では4G以上のメモリで最大限の性能 が発揮されるように設計されている
79.
『大まかにGC選択する時』のフロー図 開始 シリアル G1 CMSパラレル メモリが100MB以下 Or
単一コア メモリが4GB以上か? CPUの使用率が高い状態か? Yes No No No Yes Yes CPUの使用率が高い場合はCMSの性能が 劣る。
80.
あくまで大まかな指針 • 実際は、アプリケーション特性等を考える。 –アプリケーションは停止してもよいか –全体としての処理の速さが求められるのか …などを考えてGCを選択する
81.
GCアルゴリズムの チューニング基礎
82.
チューニングの必要性 • GCチューニングをしないと…. ⇒GCがアプリケーションの性能を下げてしまうこ ともある。
83.
チューニングの基本的な指針 ゴール • 長いSTWが発生する、フルGCの回数をちょうどい い感じに減らす アプローチ
84.
チューニングの基本的な指針 ゴール • 長いSTWが発生する、フルGCの回数をちょうどい い感じに減らす アプローチ ※何も考えずに単に減らすと、 逆に性能が悪くなったりする。
85.
チューニングの基本的な指針 ゴール • 長いSTWが発生する、フルGCの回数をちょうどい い感じに減らす アプローチ それぞれのGCによって違う。 ※何も考えずに単に減らすと、 逆に性能が悪くなったりする。
86.
パラレル(シリアル)型のチューニング アプローチ • Old領域を調整する。 ・ ヒープサイズの拡大 ・
Young領域、Old領域の調整 トレードオフ ・ ヒープサイズを大きくすると… フルGCの頻度 一回のフルGCの停止時間 ・ Young領域を大きくすると… フルGCの頻度 一回のフルGCの停止時間
87.
パラレル(シリアル)型のチューニング アプローチ • Old領域を大きくする。 ・ ヒープサイズの拡大 ・
Young領域、Old領域の調整 トレードオフ ・ ヒープサイズを大きくすると… フルGCの頻度 一回のフルGCの停止時間 ・ Young領域を大きくすると… フルGCの頻度 一回のフルGCの停止時間 これらを考慮して 調整していくのは大変
88.
パラレル(シリアル)型のチューニング アプローチ • Old領域を大きくする。 ・ ヒープサイズの拡大 ・
Young領域、Old領域の調整 トレードオフ ・ ヒープサイズを大きくすると… フルGCの頻度 フルGCの所要時間 ・ Young領域を大きくすると… フルGCの頻度 フルGCの所要時間 Adaptive Sizingが うまいことやってくれる。 お任せください JVM
89.
Adaptive Sizing • パラレルGCのパラメータを自動で調整してくれる。 以下の2つのどちらかを設定してすると、ベストエ フォート型で調整 MaxGCPauseMillis STWの最長時間。ミリ秒で指定 GCTimeRatio APプロセスがGCに対して何%をしめるか
90.
Adaptive Sizing • パラレルGCのパラメータを自動で調整してくれる。 以下の2つのどちらかを設定してすると、ベストエ フォート型で調整 MaxGCPauseMillis STWの最長時間。ミリ秒で指定 GCTimeRatio APプロセスがGCに対して何%をしめるか •
性能目標に合わせて値を設定 • 『MaxGCPauseMillis』が優先
91.
CMSのチューニング • Old領域の拡大 ・ ヒープ領域の拡大が効果的 ・
Adaptive Sizingあり • バックグラウンドのスレッド数 ⇒CPUに余裕があれば増やす方がよい。 • コンカレントサイクルが起こる頻度の設定 ⇒常にコンカレントサイクルを起こしていてもよいがこのサイ クルには部分的に停止(STW)するため調整が必要
92.
G1のチューニング • Old領域を大きくする ⇒トレードオフ • バックグラウンドのスレッド数を増やす ⇒CPUに余裕があれば… •
バックグラウンドの処理頻度を増やす ⇒CPUの(ry • 一回の混合GCで行なわれる量を増やす。 ⇒むつかしい….
93.
G1のチューニング • Old領域を大きくする ⇒トレードオフ • バックグラウンドのスレッド数を増やす ⇒CPUに余裕があれば… •
バックグラウンドの処理頻度を増やす ⇒CPUの(ry • 一回の混合GCで行なわれる量を増やす。 ⇒むつかしい…. 考えなければいけない ことが多すぎる…
94.
G1のチューニング • Old領域を大きくする ⇒トレードオフ • バックグラウンドのスレッド数を増やす ⇒CPUに余裕があれば… •
バックグラウンドの処理頻度を増やす ⇒CPUの(ry • 一回の混合GCで行なわれる量を増やす。 ⇒むつかしい…. • G1GCの目的の1つに『多くのチューニングを求 めない』がある。 • MaxGPauseMillsフラグがG1でも用意されている。 まずはMaxGPauseMillsの設定を考える。 JVM 働きます!
95.
まとめ • GCの種類について ⇒ シリアル型、パラレル型、CMS、G1 •
GCの選び方 ⇒ヒープに割り当てることができるメモリの大きさ、 コア数をなど考慮して選択 • チューニング ⇒ MaxGPauseMillsなどの自動調整の仕組みに任 せて、細かいところはひとまずJVMに任せる。
96.
Thank you for
your attention
Download now