[戻る]
Java読書会BOF「Java Memory Management」を読む会 第2回¶
場所 |
川崎市教育文化会館 第3会議室 |
出席者(敬称略) |
高橋(智)、岩室、平山、高橋(徹) |
本日は、「p.46 3章 Zooming in on the Heap Space の Understanding the minor garbage collection algorithm」の途中から読み始めます。
3 Zooming in on the Heap Space¶
Understanding the minor garbage collection algorithm¶
図3.5 の Edenの絵でオブジェクト間に隙間があるように見えるが、実際にはメモリに隙間はないのではないか?(パディングは使用しているものとみなせば)
図3.7 の Eden spaceについても同上
p.52 ここでヒープとは、何が含まれるのか?
→ young generation と tenured space
ヒープの各サイズの設定をするJVMオプションがあるが、デフォルト値は?
→ javaのJVMオプション -XX:+PrintFlagsFinal を指定するとデフォルト値が確認できる:
size_t MinHeapSize = 8388608 {product} {ergonomic} size_t MaxHeapSize = 4294967296 {product} {ergonomic} size_t NewSize = 1363144 {product} {default} size_t MaxNewSize = 2575302656 {product} {ergonomic} uintx SurvivorRatio = 8 {product} {default} uintx NewRatio = 2 {product} {default} size_t PretenureSizeThreshold = 0 {product} {default}
MacBook(MacOS 12, RAM 16GB), OpenJDK 17での値です。
4 Freeing Memory Management with Garbage Collection¶
オブジェクトはマークされているかどうかを決定する特別なビットを保持。
どのような構造?
誤植 p.60 上6行目
誤 "to the step"
正 "to the stack"
誤植 p.64 上のコード例の2行目
誤 "private Nest;"
正 "private Nest nest;"
参照カウントを使う言語の例 Objective C では、メモリリークの原因となることがある
宿題)参照カウントをメモリ管理に使う言語は他にあるか?
p.71 IBMとAzulは別な実装
→ IBMはJ9 VM、AzulはZing(Non stop GC)のことか?
p.72 Remembered setとは?
宿題
CMSで、同期モードが失敗した時のGCは、ストップワールドの旧来のGC?
G1 GCは今のJDKのデフォルト
G1GCには、String deduplicationがある。どれくらい効果がありそう?
JDBCのようにResultSetを持つものを繰り返し呼ぶと効果ありそう
p.75 ZGCはG1GCのように分割されたリージョン管理なのか?
ZGCに Stringのdeduplicationは含まれているの?
→ JDK18で取り込まれたようです。
https://logico-jp.io/2022/05/03/zgc-whats-new-in-jdk-18/
-XX:+UseStringDeduplication の指定は必要
宿題)deduplicatoinの効果をサンプルプログラムを作って確かめる
5 Zooming in on the Metaspace¶
p.78 PermGenがそのままMetaspaceになったのではなく、次の通り(知らなかった)
インターンされた文字列、クラス、静的変数はヒープに
クラスのメタデータはメタスペースに
6 Configuring and Monitoring the Memory Management of the JVM¶
jpsコマンドは、どこからJavaプロセスの実行情報を取得しているか?
宿題)Windows, Linux, Mac それぞれでどうなっているか調べる
p.97 Stringの値がbyte配列に格納されるとあるが、Stringの値はchar配列に格納されるのではないか?
JDK 9から、JEP254 Compact Strings Improvement がデフォルトで有効になり、Stringの値はそれまでのchar配列からbyte配列に変更となった
宿題)JDK 11/17のjavacでターゲットを1.8に指定した時に、JDK 9以降でremoveされたAPIを呼んでいたらコンパイルは通るか?
本日は、p.98 の最後まで読み終わりました。 次回は、p.99 の最初からです。 次回は、VisualVMを実際に動かしながら読み進めたいので、できる限りVisualVMを動かせる環境(ノートPC)等を持参してください。
[戻る]