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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kenji Kazumura
May 23, 2022
Programming
1
82
GCを発生させないコーディングパターン
JJUG CCC 2018 Fall
Kenji Kazumura
May 23, 2022
Tweet
Share
More Decks by Kenji Kazumura
See All by Kenji Kazumura
LangChain4jとは一味違うLangChain4j-CDI
kazumura
1
170
FFMとJVMの実装から学ぶJavaのインテグリティ
kazumura
0
300
Cloud Native Sandboxing with seccomp and AppArmor
kazumura
0
36
JakartaOne Japan 2025
kazumura
2
180
セキュリティマネジャー廃止とクラウドネイティブ型サンドボックス活用
kazumura
1
400
Troubleshooting Cloud-Native Java Applications in Container Environments While Maintaining Security
kazumura
0
70
Javaプロファイラの信頼性とバイアスへの付き合い方
kazumura
4
1k
コンテナ環境でのJavaトラブルシューティング
kazumura
14
4.3k
コンテナ環境でのJavaチューニング
kazumura
9
4k
Other Decks in Programming
See All in Programming
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
100
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
120
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
690
オブザーバビリティ駆動開発って実際どうなの?
yohfee
3
810
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
140
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
270
Ruby and LLM Ecosystem 2nd
koic
1
440
メタプログラミングで実現する「コードを仕様にする」仕組み/nikkei-tech-talk43
nikkei_engineer_recruiting
0
170
TipKitTips
ktcryomm
0
160
AI時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
710
Railsの気持ちを考えながらコントローラとビューを整頓する/tidying-rails-controllers-and-views-as-rails-think
moro
5
390
株式会社 Sun terras カンパニーデック
sunterras
0
2.1k
Featured
See All Featured
Darren the Foodie - Storyboard
khoart
PRO
3
2.8k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
The Pragmatic Product Professional
lauravandoore
37
7.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
930
Done Done
chrislema
186
16k
HDC tutorial
michielstock
1
520
The World Runs on Bad Software
bkeepers
PRO
72
12k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Un-Boring Meetings
codingconduct
0
220
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
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