Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GCを発生させないコーディングパターン
Search
Kenji Kazumura
May 23, 2022
Programming
1
46
GCを発生させないコーディングパターン
JJUG CCC 2018 Fall
Kenji Kazumura
May 23, 2022
Tweet
Share
More Decks by Kenji Kazumura
See All by Kenji Kazumura
Troubleshooting Cloud-Native Java Applications in Container Environments While Maintaining Security
kazumura
0
20
Javaプロファイラの信頼性とバイアスへの付き合い方
kazumura
4
670
コンテナ環境でのJavaトラブルシューティング
kazumura
14
4k
コンテナ環境でのJavaチューニング
kazumura
9
3k
クラウドネイティブJava技術 Jakarta EE & MicroProfile ディープダイブ
kazumura
2
450
jsummit2023-jakarta-microp.pdf
kazumura
2
280
コンテナ環境でのJava技術の進化
kazumura
8
2.4k
Make Scalable MicroProfile Application
kazumura
0
100
Javaでトランザクショナルメモリを使う
kazumura
2
85
Other Decks in Programming
See All in Programming
命名をリントする
chiroruxx
1
410
快速入門可觀測性
blueswen
0
370
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
460
From Translations to Multi Dimension Entities
alexanderschranz
2
130
競技プログラミングへのお誘い@阪大BOOSTセミナー
kotamanegi
0
360
fs2-io を試してたらバグを見つけて直した話
chencmd
0
230
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
Mermaid x AST x 生成AI = コードとドキュメントの完全同期への道
shibuyamizuho
0
160
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
6
1.3k
Kaigi on Railsに初参加したら、その日にLT登壇が決定した件について
tama50505
0
100
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
330
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録
mashirou1234
0
190
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
328
21k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Facilitating Awesome Meetings
lara
50
6.1k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Done Done
chrislema
181
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
Rails Girls Zürich Keynote
gr2m
94
13k
Building Adaptive Systems
keathley
38
2.3k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
A designer walks into a library…
pauljervisheath
204
24k
Transcript
2018年12月15日 数村 憲治 GCを発生させない コーディングパターン Copyright 2018 FUJITSU LIMITED 0
JJUG CCC 2018 Fall
.setName(“数村憲治”) .setDirectorOf(“Eclipse Foundation Board”) .setMemberOf(“Jakarta EE Committee”) .setMemberOf(“JCP Executive Committee”)
.setTwitter(“@kkzr”) .setResponsibleFor(“Launcher”) .build(); スピーカー Copyright 2018 FUJITSU LIMITED Speaker me = SpeakerBuilder 1
アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 2
アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 3
何が問題か Copyright 2018 FUJITSU LIMITED 健康診断シンドローム アプリケーションの実行が止まる アプリケーションに割り当てられるCPU時間が減る 実は何も問題ない 4
なぜ問題か Copyright 2018 FUJITSU LIMITED (Cでは、malloc/free回数に依存) チューニングがたいへん 最適解をみつけるのが難しい 環境が変わるとやりなおし 見積もりができない
GC時間は残存オブジェクトに依存 5
問題の対処方法 Copyright 2018 FUJITSU LIMITED あきらめる SLAの妥協 Javaを使わない オブジェクトの 生成数・量を減らす
アプリケーションで頑張る GCで頑張る コンパイラで頑張る 優秀なGCを作る オブジェクトの 生成を最適化 6
デモ Copyright 2018 FUJITSU LIMITED 7 Node.js
アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 8
アプリケーションで頑張る Copyright 2018 FUJITSU LIMITED オブジェクトプール スレッドプール コネクションプール 小ネタ HashMap
拡張 String.intern() Boxing/Unboxing 9
Integer AutoBoxing Copyright 2018 FUJITSU LIMITED 10 public static Integer
valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } キャッシュの範囲はプロパティで指定可能 java.lang.Integer.IntegerCache.high よく使われる範囲はIntegerオブジェクトの使いまわし Integer.java
プーリングコスト Copyright 2018 FUJITSU LIMITED 1*(メモリ割当+初期化) + p*GCp n*(メモリ割当+初期化) +
u*GCu プーリング使用時 プーリング不使用時 n: トランザクション回数 p: プーリング使用時のGC回数 u: プーリング不使用時のGC回数 GCp: プーリング使用時の1回のGC時間 GCu: プーリング不使用時の1回のGC時間 p < u GCp > GCu 初期化 < n*初期化 メモリ割当は問題にならない 11 一般的な傾向
Edenからのアロケーション Copyright 2018 FUJITSU LIMITED o = new Object(); bottom
top end lock(Eden); top = top + size; unlock(Eden); Bump The Pointer bottom top end 12
TLAB Copyright 2018 FUJITSU LIMITED (*1)https://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf only requiring around 10
native instructions Memory Management in the Java HotSpot Virtual Machine (*1) TLAB + Bump the Pointer で実現 Edenをスレッドごとに分割して割当て スレッド1スレッド2 Thread-Local Allocation Buffer Fast Allocation 13
デモ Copyright 2018 FUJITSU LIMITED 14 Bump The Pointer
TLABが向かないケース Copyright 2018 FUJITSU LIMITED スレッド N+1 用のTLABが割当てられない スレッド1スレッド2 スレッドN
・・・ スレッド数が多く、かつ、オブジェクト生成量が少ない場合 15
デモ Copyright 2018 FUJITSU LIMITED 16 Thread-Local Allocation Buffer
アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 17
デモ Copyright 2018 FUJITSU LIMITED 18 メモリアロケーション量とGC頻度
Escape Analysis (EA) Copyright 2018 FUJITSU LIMITED https://docs.oracle.com/javase/8/docs/technotes/guides/vm/performance- enhancements-7.html JDK
6 (HotSpot C2) から採用 JITによる最適化 Scalar Replacement Stack Allocation Lock Elision 19
Escapeとは Copyright 2018 FUJITSU LIMITED メソッドからの脱出 オブジェクトがアロケートされたメソッドの外で 使用されているかもしれない オブジェクトはメソッドローカルでない スレッドからの脱出
オブジェクトがアロケートされたスレッドの外で 使用されているかもしれない 他のスレッドがそのオブジェクトにアクセスするかもしれない 20
Escapeの種類 Copyright 2018 FUJITSU LIMITED オブジェクトはグローバルに脱出する オブジェクトは作成したメソッドを脱出しない オブジェクトは引数経由でメソッドを脱出するが、 スレッドは脱出しない NoEscape
ArgEscape GlobalEscape 21
Escapeの例 Copyright 2018 FUJITSU LIMITED int foo(String name) { Person
person = new Person(name); return person.id(); } void foo(String name) { Person person = new Person(name); register(person); } NoEscape ArgEscape 22
Escapeの例 Copyright 2018 FUJITSU LIMITED class bar { Person person;
void foo(String name) { person = new Person(name); } } GlobalEscape 23
最適化の組み合わせ Copyright 2018 FUJITSU LIMITED Scalar Replacement Stack Allocation Lock
Elision No Escape 〇 〇 〇 Arg Escape - - 〇 Global Escape - - - 24
Stack Allocation Copyright 2018 FUJITSU LIMITED オブジェクトをヒープではなくスタックにアロケートする メソッド終了と同時にオブジェクトは解放 HotSpotでは不採用 25
Stack Allocation Copyright 2018 FUJITSU LIMITED 32 山田 太郎 SP
メソッド 開始時 new Person() 実行後 メソッド 終了時 残骸 SP SP 26 void foo { Person person = new Person(32, “山田太郎”); ・・・ スタック
Scalar Replacement Copyright 2018 FUJITSU LIMITED オブジェクトフィールドへのアクセスを、 スタックまたはレジスターアクセスにする Stack Allocationとは異なり、
オブジェクトヘッダー等はアロケートされない 27
Scalar Replacement 例 Copyright 2018 FUJITSU LIMITED int foo(String name,
int age) { Person person = new Person(name, age); return person.getAge(); } class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } } 28
デモ Copyright 2018 FUJITSU LIMITED 29 Scalar Replacement
Lock Elision Copyright 2018 FUJITSU LIMITED スレッドローカルなオブジェクトに対するロックを削除 30 void foo()
{ Object lock = new Ojbect(); synchronized (lock) { doSomething }; }
アジェンダ Copyright 2018 FUJITSU LIMITED GC問題 アプリケーションによる対処 コンパイラによる対処 サマリ 31
サマリ Copyright 2018 FUJITSU LIMITED GCの問題と対処 JVMの種類やインライン状況によっては、 GCが発生したり、しなかったり 32 まずは、見やすいコードを
GCは日々改善されている Javaのアロケーションコストは低い EAによるメモリ最適化もあり
Copyright 2018 FUJITSU LIMITED Q/A 33
None