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
48
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
23
Javaプロファイラの信頼性とバイアスへの付き合い方
kazumura
4
710
コンテナ環境でのJavaトラブルシューティング
kazumura
14
4k
コンテナ環境でのJavaチューニング
kazumura
9
3.1k
クラウドネイティブJava技術 Jakarta EE & MicroProfile ディープダイブ
kazumura
2
470
jsummit2023-jakarta-microp.pdf
kazumura
2
290
コンテナ環境でのJava技術の進化
kazumura
8
2.5k
Make Scalable MicroProfile Application
kazumura
0
100
Javaでトランザクショナルメモリを使う
kazumura
2
87
Other Decks in Programming
See All in Programming
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
770
.NETでOBS Studio操作してみたけど…… / Operating OBS Studio by .NET
skasweb
0
120
Fibonacci Function Gallery - Part 2
philipschwarz
PRO
0
210
Jaspr Dart Web Framework 박제창 @Devfest 2024
itsmedreamwalker
0
150
AWSのLambdaで PHPを動かす選択肢
rinchoku
2
390
asdf-ecspresso作って 友達が増えた話 / Fujiwara Tech Conference 2025
koluku
0
1.4k
PicoRubyと暮らす、シェアハウスハック
ryosk7
0
220
テストコード書いてみませんか?
onopon
2
340
はてなにおけるfujiwara-wareの活用やecspressoのCI/CD構成 / Fujiwara Tech Conference 2025
cohalz
3
2.8k
AHC041解説
terryu16
0
400
DMMオンラインサロンアプリのSwift化
hayatan
0
190
AWS re:Invent 2024個人的まとめ
satoshi256kbyte
0
100
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
192
16k
A designer walks into a library…
pauljervisheath
205
24k
A Tale of Four Properties
chriscoyier
157
23k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
500
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
Into the Great Unknown - MozCon
thekraken
34
1.6k
It's Worth the Effort
3n
183
28k
Optimizing for Happiness
mojombo
376
70k
Measuring & Analyzing Core Web Vitals
bluesmoon
5
210
What's in a price? How to price your products and services
michaelherold
244
12k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
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