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
64
GCを発生させないコーディングパターン
JJUG CCC 2018 Fall
Kenji Kazumura
May 23, 2022
Tweet
Share
More Decks by Kenji Kazumura
See All by Kenji Kazumura
JakartaOne Japan 2025
kazumura
0
78
セキュリティマネジャー廃止とクラウドネイティブ型サンドボックス活用
kazumura
1
270
Troubleshooting Cloud-Native Java Applications in Container Environments While Maintaining Security
kazumura
0
43
Javaプロファイラの信頼性とバイアスへの付き合い方
kazumura
4
910
コンテナ環境でのJavaトラブルシューティング
kazumura
14
4.2k
コンテナ環境でのJavaチューニング
kazumura
9
3.4k
クラウドネイティブJava技術 Jakarta EE & MicroProfile ディープダイブ
kazumura
2
580
jsummit2023-jakarta-microp.pdf
kazumura
2
340
コンテナ環境でのJava技術の進化
kazumura
8
2.6k
Other Decks in Programming
See All in Programming
TDD 実践ミニトーク
contour_gara
1
290
プロポーザル駆動学習 / Proposal-Driven Learning
mackey0225
2
1.2k
rage against annotate_predecessor
junk0612
0
160
Putting The Genie in the Bottle - A Crash Course on running LLMs on Android
iurysza
0
140
Namespace and Its Future
tagomoris
6
700
FindyにおけるTakumi活用と脆弱性管理のこれから
rvirus0817
0
480
Testing Trophyは叫ばない
toms74209200
0
840
テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成
makun
0
240
Tool Catalog Agent for Bedrock AgentCore Gateway
licux
6
2.3k
AI時代のUIはどこへ行く?
yusukebe
17
8.7k
MCPで実現するAIエージェント駆動のNext.jsアプリデバッグ手法
nyatinte
7
1.1k
Swift Updates - Learn Languages 2025
koher
2
470
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
How GitHub (no longer) Works
holman
315
140k
GraphQLとの向き合い方2022年版
quramy
49
14k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Docker and Python
trallard
45
3.6k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Context Engineering - Making Every Token Count
addyosmani
1
30
Six Lessons from altMBA
skipperchong
28
4k
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
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