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
65
GCを発生させないコーディングパターン
JJUG CCC 2018 Fall
Kenji Kazumura
May 23, 2022
Tweet
Share
More Decks by Kenji Kazumura
See All by Kenji Kazumura
Cloud Native Sandboxing with seccomp and AppArmor
kazumura
0
7
JakartaOne Japan 2025
kazumura
2
97
セキュリティマネジャー廃止とクラウドネイティブ型サンドボックス活用
kazumura
1
300
Troubleshooting Cloud-Native Java Applications in Container Environments While Maintaining Security
kazumura
0
46
Javaプロファイラの信頼性とバイアスへの付き合い方
kazumura
4
930
コンテナ環境でのJavaトラブルシューティング
kazumura
14
4.2k
コンテナ環境でのJavaチューニング
kazumura
9
3.4k
クラウドネイティブJava技術 Jakarta EE & MicroProfile ディープダイブ
kazumura
2
580
jsummit2023-jakarta-microp.pdf
kazumura
2
340
Other Decks in Programming
See All in Programming
開発生産性を上げるための生成AI活用術
starfish719
1
170
NetworkXとGNNで学ぶグラフデータ分析入門〜複雑な関係性を解き明かすPythonの力〜
mhrtech
3
1k
Playwrightはどのようにクロスブラウザをサポートしているのか
yotahada3
7
2.3k
CSC305 Lecture 01
javiergs
PRO
1
400
XP, Testing and ninja testing ZOZ5
m_seki
2
280
AIエージェント時代における TypeScriptスキーマ駆動開発の新たな役割
bicstone
4
1.5k
AIで開発生産性を上げる個人とチームの取り組み
taniigo
0
130
メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
kwzr
1
860
エンジニアとして高みを目指す、 利益を生み出す設計の考え方 / design-for-profit
minodriven
23
12k
私はどうやって技術力を上げたのか
yusukebe
43
17k
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
2
450
猫と暮らすネットワークカメラ生活🐈 ~Vision frameworkでペットを愛でよう~ / iOSDC Japan 2025
yutailang0119
0
220
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
9
580
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
960
Measuring & Analyzing Core Web Vitals
bluesmoon
9
610
Site-Speed That Sticks
csswizardry
11
880
Six Lessons from altMBA
skipperchong
28
4k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.2k
Balancing Empowerment & Direction
lara
4
680
Optimising Largest Contentful Paint
csswizardry
37
3.4k
GitHub's CSS Performance
jonrohan
1032
460k
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