SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Downloaden Sie, um offline zu lesen
Aggressive Heap の実装を
Aggressive に解析する
JJUG Night Seminar Aug, 2013
Shinya TAKEBAYASHI
自己紹介
v  名前: 竹林 信哉(たけばやし しんや)
v  職業: 某 SIer 社員 ・・・
少し前まで CGL 作っていました.今は Java サポート.
v  得意:
Ø  OS 実装 / デバイスドライバ / UNIX / Windows
Ø  C / C++ / asm(x86, SPARC) / Python / 並列(CUDA)
Ø  コンパイラ,デバッガとお友達
v  私と Java
Ø  プログラミング言語 Java は苦手です
Ø  JavaVM の実装が大好き
@chi9rin
chi9 流 Hack の考え方
v  前提として
Ø  アプリケーションは,そう簡単にソースコード通りに
動きません.
Ø  環境に依存して,書いたソースをまねて動きます.
Ø  プログラマやアーキテクトの腕の見せ所は,いかに狙った環境
で狙ったとおりに動かすか,です.
chi9 流 Hack の考え方(Cont’d)
v  だから
Ø  ソースコードばかりを追っていても,答えが得られない可能性
があります.
Ø  ソースコードと実際の動作を見て,初めて実装を理解できます.
ソースコードを読むのは予習
動いているものを trap して解析するのが Hack
-XX:+AggressiveHeap
v  大規模アプリケーションにいいよ,という触れ込みの設定
v  自動でヒープサイズを決めてくれる
v  結局何が指定されるかを解説したドキュメントが乏しい
v  なのに皆さん勧めている謎の設定
-XX:+AggressiveHeap で
何が起きるか
計算
•  メモリサイズ
•  GC スレッド数
機能の有効化
•  Parallel GC
•  Large Pages
•  JIT コンパイルポリシ
はシンプルモード
機能の無効化
•  Scavenge GC
•  TLAB の動的リサイズ
julong initHeapSize;
julong total_memory = os::physical_memory();
if (total_memory < (julong)256*M) {
jio_fprintf(defaultStream::error_stream(),
"You need at least 256mb of memory to use -XX:+AggressiveHeapn");
vm_exit(1);
}
initHeapSize = MIN2(total_memory / (julong)2, total_memory - (julong)160*M);
initHeapSize = os::allocatable_physical_memory(initHeapSize);
if (initHeapSize > MaxPermSize) {
initHeapSize = initHeapSize - MaxPermSize;
} else {
warning("AggressiveHeap and MaxPermSize values may conflict");
}
if (FLAG_IS_DEFAULT(MaxHeapSize)) {
FLAG_SET_CMDLINE(uintx, MaxHeapSize, initHeapSize);
FLAG_SET_CMDLINE(uintx, InitialHeapSize, initHeapSize);
set_min_heap_size(initHeapSize);
}
if (FLAG_IS_DEFAULT(NewSize)) {
FLAG_SET_CMDLINE(uintx, NewSize, ((julong)MaxHeapSize / (julong)8) * (julong)3);
FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize);
}
FLAG_SET_DEFAULT(UseLargePages, true);
FLAG_SET_CMDLINE(uintx, BaseFootPrintEstimate, MaxHeapSize);
FLAG_SET_CMDLINE(bool, ResizeTLAB, false);
FLAG_SET_CMDLINE(uintx, TLABSize, 256*K);
FLAG_SET_CMDLINE(uintx, YoungPLABSize, 256*K);
FLAG_SET_CMDLINE(uintx, OldPLABSize, 8*K);
FLAG_SET_CMDLINE(intx, CompilationPolicyChoice, 0);
FLAG_SET_CMDLINE(bool, UseParallelGC, true);
FLAG_SET_DEFAULT(ParallelGCThreads, Abstract_VM_Version::parallel_worker_threads());
FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100);
FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false);
FLAG_SET_CMDLINE(bool, BindGCTaskThreadsToCPUs, true);
答え
パラメータ 最近のマシン環境で設定される値(青字は自動計算されるところ)
-Xmx(MaxHeapSize) 物理メモリ量の半分 – 約 85 MB(LP64 の場合)
-Xms(InitialHeapSize) MaxHeapSize と同じ
-XX:NewSize (MaxHeapSize ÷ 8) × 3
-XX:MaxNewSize NewSize と同値
-XX:+UseLargePages 有効化
-XX:BaseFootPrintEstimates MaxHeapSize と同値
-XX:-ResizeTLAB 無効化
-XX:TALBSize 256KB
-XX:YoungPLABSize 256KB
-XX:OldPLABSize 8KB
-XX:CompilationPolicyChoice 0(SimpleCompilePolicy)
-XX:+UseParallelGC 有効化
-XX:ParallelGCThreads CPU 数が 8 以下なら CPU 数と同値,9 以上なら後述の計算式
-XX:ThreasholdTolerance 100
-XX:-ScavengeBeforeFullGC 無効化
-XX:+BindGCTaskThreadsToCPUs 有効化
・ヒープ領域を多め(Aggressive!)に確保する.
・AP を全力(Aggressive!!)で走らせる.
・極力 GC しない.GC はまとめて全力(Aggressive!!!)で.
では,Hack を始めます
環境
CPU 4 cores – メモリ 2GB - Debian/GNU Linux 64 bits
JavaVM の準備
% hg clone http://hg.openjdk.java.net/jdk7u/jdk7u2
% cd jdk7u2
% chmod +x ./get_source.sh; ./get_source.sh
% export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk-amd64
% source jdk/make/jdk_generic_profile.sh
% make sanity && make ALLOW_DOWNLOAD=true debug_build
【注意】
・make -jn しないこと.
・gcc は 4.6 以前を使うこと.clang/clang++ は使わない.
・jdk7u25 以降は ZIP_DEBUGINFO_FILES=0 が必要
JavaVM 起動と進め方
v  コマンドラインオプションを解析する箇所にブレイクポイントを
仕掛ける.
v  signal 6(SIGABRT)を投げて core を分析しても good!
% ulimit –c unlimited
% gdb ./java
(gdb) b arguments.cpp:2458
No source file named arguments.cpp
Make breakpoint pending on future shared library load? (y or [N]) y
Breakpoint 1 (arguments.cpp:2458) pending.
(gdb) r -XX:+AggressiveHeap
...
Breakpoint 1, Arguments::parse_each_vm_init_arg ......
(gdb) signal 6
Continuing with signal SIGABRT.
[Thread 0x7ffff7fd0700 (LWP 21391) exited]
No unwaited-for children left.
計算 その 1
そもそも AggressiveHeap が使えるかどうか
v  物理メモリの算出と閾値判定
Ø  物理メモリ量の算出
p  = os::Linux::_physical_memory
= sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE)
= 物理ページ数 × ページサイズ = 513,535 × 4096 = 2,103,439,360
= /proc/meminfo の MemTotal 値 × 1,024(KB)
Ø  判定: 256 MB 未満なら AggressiveHeap は使えない
% gdb ./java
(gdb) b arguments.cpp:2446
(gdb) r -XX:+AggressiveHeap
Breakpoint 1, Arguments::parse_each_vm_init_arg (args=0x7ffff7fcfe20, scp_p=0x7ffff7fcea10, ...
(gdb) p total_memory
$1 = 2103439360
% grep MemTotal /proc/meminfo | awk '{print $2;}' | xargs -I n expr n * 1024
2103439360
julong total_memory = os::physical_memory();
if (total_memory < (julong)256*M) {
jio_fprintf(defaultStream::error_stream(),
"You need at least 256mb of memory to use -XX:+AggressiveHeapn");
vm_exit(1);
}
計算 その 2
ヒープサイズの計算
v  まず基準になるサイズを求め,次にヒープサイズを確定する.
p  total_memory ÷ 2 または total_memory - 160 MB の小さい方
= 1,051,719,680 または 1,935,503,360 の小さい方
= 1,051,719,680
p  = 1,051,719,680 – 87,241,520 = 964,478,160 (← LP64)
1,051,719,680 – 67,108,864 = 984,610,816(← それ以外)
% gdb ./java
(gdb) b arguments.cpp:2469
(gdb) r -XX:+AggressiveHeap
Breakpoint 1, Arguments::parse_each_vm_init_arg (args=0x7ffff7fcfe20, scp_p=0x7ffff7fcea10, ...
(gdb) p MaxPermSize
$2 = 87241520
(gdb) p initHeapSize
$1 = 964478160
initHeapSize = MIN2(total_memory) / (julong) 2, total_memory – (julong)160 * M);
if (initHeapSize > MaxPermSize) {
initHeapSize = initHeapSize - MaxPermSize;
} else {
warning("AggressiveHeap and MaxPermSize values may conflict");
}
計算 その 2(Cont’d)
ヒープサイズの計算
v  確定した initHeapSize を MaxHeapSize,InitialHeapSize とし
て設定.
if (FLAG_IS_DEFAULT(MaxHeapSize)) {
FLAG_SET_CMDLINE(uintx, MaxHeapSize, initHeapSize);
FLAG_SET_CMDLINE(uintx, InitialHeapSize, initHeapSize);
set_min_heap_size(initHeapSize);
}
計算 その 3
New 領域サイズの計算
v  算出した MaxHeapSize をもとに計算される.
Ø  NewSize
p  (MaxHeapSize / 8) * 3) = (964,478,160 ÷ 8) × 3
= 361,679,310
Ø  MaxNewSize
p  上記で算出した NewSize と同値
% gdb ./java
(gdb) b arguments.cpp:2482
(gdb) r -XX:+AggressiveHeap
Breakpoint 1, Arguments::parse_each_vm_init_arg (args=0x7ffff7fcfe20, scp_p=0x7ffff7fcea10, ...
(gdb) p MaxHeapSize
$1 = 964478160
(gdb) p NewSize
$2 = 361679310
(gdb) p MaxNewSize
$3 = 361679310
FLAG_SET_CMDLINE(uintx, NewSize, ((julong)MaxHeapSize / (julong)8) * (julong)3);
FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize);
計算 その 4
GC スレッド数の算出
v  アクティブな CPU (/proc/cpuinfo の数)をもとに確定する.
Ø  Abstract_VM_Version::nof_parallel_worker_threads()
p  nof_parallel_worker_threads(num = 5, den = 8, switch_pt = 8)
アクティブな CPU 数に応じて適切な値が計算される.
p  アクティブ CPU 数が 8 以下なら,アクティブな CPU 数と同値.
p  9 CPU 以上なら,8 + ((アクティブ CPU 数 – 8) × 5) ÷ 8)
例)アクティブ CPU 数が 72 なら 8 + ((72 – 8) × 5) ÷ 8) = 48 ス
レッド.
(gdb) b vm_version.cpp:307
(gdb) r -XX:+AggressiveHeap
...
Breakpoint 1, Abstract_VM_Version::parallel_worker_threads () at ...
(gdb) p _parallel_worker_threads
$1 = 4
unsigned int ncpus = (unsigned int) os::active_processor_count();
return (ncpus <= switch_pt) ? ncpus : (switch_pt + ((ncpus - switch_pt) * num) / den);
おさらい
パラメータ 最近のマシン環境で設定される値 GDB での出力 jinfo 出力
-Xmx(MaxHeapSize) 物理メモリ量の半分 – 約 85 MB -XX:MaxHeapSize=964478160
-Xms(InitialHeapSize) MaxHeapSize と同じ -XX:InitialHeapSize=964478160
-XX:NewSize (MaxHeapSize ÷ 8) × 3 -XX:NewSize=361679310
-XX:MaxNewSize NewSize と同値 -XX:MaxNewSize=361679310
-XX:+UseLargePages 有効化 -XX:+UseLargePages
-XX:BaseFootPrintEstimates MaxHeapSize と同値 -XX:BaseFootPrintEstimates=964478160
-XX:-ResizeTLAB 無効化 -XX:-ResizeTLAB
-XX:TLABSize 256KB -XX:TLABSize=262144
-XX:YoungPLABSize 256KB -XX:YoungPLABSize=262144
-XX:OldPLABSize 8KB -XX:OldPLABSize=8192
-XX:CompilationPolicyChoice 0(SimpleCompilePolicy) -XX:CompilationPolicyChoice=0
-XX:+UseParallelGC 有効化 -XX:+UseParallelGC
-XX:ParallelGCThreads CPU 数が 8 以下なら CPU 数と同値 -XX:ParallelGCThreads=4
-XX:ThresholdTolerance 100 -XX:ThresholdTolerance=100
-XX:-ScavengeBeforeFullGC 無効化 -XX:-ScavengeBeforeFullGC
-XX:+BindGCTaskThreadsToCPUs 有効化 -XX:+BindGCTaskThreadsToCPUs
(gdb) p MaxHeapSize
$1 = 964478160
(gdb) p InitialHeapSize
$2 = 964478160
(gdb) p NewSize
$3 = 361679310
(gdb) p MaxNewSize
$4 = 361679310
(gdb) p UseLargePages
$5 = true
(gdb) p BaseFootPrintEstimate
$6 = 964478160
(gdb) p ResizeTLAB
$7 = false
(gdb) p TLABSize
$8 = 262144
(gdb) p YoungPLABSize
$9 = 262144
(gdb) p OldPLABSize
$10 = 8192
(gdb) p CompilationPolicyChoice
$11 = 0
(gdb) p UseParallelGC
$12 = true
(gdb) p ParallelGCThreads
$13 = 4
(gdb) p ThresholdTolerance
$14 = 100
(gdb) p ScavengeBeforeFullGC
$15 = false
(gdb) p BindGCTaskThreadsToCPUs
$16 = true
最後に
v  VM の実装を理解する勉強会をやりたい
Ø  この手のネタを受け付ける人が身近には少ないので,
ここで募集
v  JavaOne 2013@SFO 行きます
v  次回予告
Ø  ByteCode / JIT コンパイラに優しいソースコード

Weitere ähnliche Inhalte

Was ist angesagt?

GPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみたGPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみたRyo Sakamoto
 
GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)なおき きしだ
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームmarsee101
 
Anaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみたAnaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみたYosuke Onoue
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めMITSUNARI Shigeo
 
Hacking Ruby with Python
Hacking Ruby with PythonHacking Ruby with Python
Hacking Ruby with PythonTaisuke Yamada
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしようYasuhiro Yoshimura
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another sideKiwamu Okabe
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会Koichi Sakata
 
コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道なおき きしだ
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法NVIDIA Japan
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfaceKohei KaiGai
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも- Yusaku Watanabe
 
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)Kohei KaiGai
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応marsee101
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみるYasuhiro Yoshimura
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml ssuser3a4b8c
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 

Was ist angesagt? (20)

GPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみたGPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみた
 
GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリーム
 
Anaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみたAnaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみた
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
Hacking Ruby with Python
Hacking Ruby with PythonHacking Ruby with Python
Hacking Ruby with Python
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 
コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
 
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 

Andere mochten auch

2013 08-19 jjug
2013 08-19 jjug2013 08-19 jjug
2013 08-19 jjugsk44_
 
共変戻り値型って知ってますか?
共変戻り値型って知ってますか?共変戻り値型って知ってますか?
共変戻り値型って知ってますか?Ryota Murohoshi
 
泥沼の中のパフォーマンスチューニング #JJUG
泥沼の中のパフォーマンスチューニング #JJUG泥沼の中のパフォーマンスチューニング #JJUG
泥沼の中のパフォーマンスチューニング #JJUGSatoshi Kubo
 
テンプレートエンジンの話 #jjug
テンプレートエンジンの話 #jjugテンプレートエンジンの話 #jjug
テンプレートエンジンの話 #jjugYusuke Yamamoto
 
AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発YujiSoftware
 
Thymeleafでハマったこと
ThymeleafでハマったことThymeleafでハマったこと
Thymeleafでハマったことeiryu
 
ストリーミングのげんざい
ストリーミングのげんざいストリーミングのげんざい
ストリーミングのげんざいTetsuya Morimoto
 
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみたJavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみたSatoshi Takami
 
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっているJJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっているKoichi Sakata
 
最近のSpringFramework2013 #jjug #jsug #SpringFramework
最近のSpringFramework2013 #jjug #jsug #SpringFramework最近のSpringFramework2013 #jjug #jsug #SpringFramework
最近のSpringFramework2013 #jjug #jsug #SpringFrameworkToshiaki Maki
 

Andere mochten auch (11)

2013 08-19 jjug
2013 08-19 jjug2013 08-19 jjug
2013 08-19 jjug
 
共変戻り値型って知ってますか?
共変戻り値型って知ってますか?共変戻り値型って知ってますか?
共変戻り値型って知ってますか?
 
泥沼の中のパフォーマンスチューニング #JJUG
泥沼の中のパフォーマンスチューニング #JJUG泥沼の中のパフォーマンスチューニング #JJUG
泥沼の中のパフォーマンスチューニング #JJUG
 
WebSocket of WebLogic
WebSocket of WebLogicWebSocket of WebLogic
WebSocket of WebLogic
 
テンプレートエンジンの話 #jjug
テンプレートエンジンの話 #jjugテンプレートエンジンの話 #jjug
テンプレートエンジンの話 #jjug
 
AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発
 
Thymeleafでハマったこと
ThymeleafでハマったことThymeleafでハマったこと
Thymeleafでハマったこと
 
ストリーミングのげんざい
ストリーミングのげんざいストリーミングのげんざい
ストリーミングのげんざい
 
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみたJavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
 
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっているJJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
 
最近のSpringFramework2013 #jjug #jsug #SpringFramework
最近のSpringFramework2013 #jjug #jsug #SpringFramework最近のSpringFramework2013 #jjug #jsug #SpringFramework
最近のSpringFramework2013 #jjug #jsug #SpringFramework
 

Ähnlich wie 20130819 jjugnslt

Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)たけおか しょうぞう
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei KaiGai
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺MITSUNARI Shigeo
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングComputational Materials Science Initiative
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみるftnk
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件yaegashi
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリNVIDIA Japan
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介Preferred Networks
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
ソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグToru Tamaki
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127Natsutani Minoru
 
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなし20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなしMasahiro NAKAYAMA
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPyShiqiao Du
 
GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。dec9ue
 
Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊
Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊
Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊Supership株式会社
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstromKohei KaiGai
 

Ähnlich wie 20130819 jjugnslt (20)

Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 
Cuda
CudaCuda
Cuda
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
ソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグ
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなし20140828 #ssmjp 社内チューニンガソンで優勝したはなし
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。
 
Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊
Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊
Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom
 

Kürzlich hochgeladen

TEAMIN Education Service Overview_20240407
TEAMIN Education Service Overview_20240407TEAMIN Education Service Overview_20240407
TEAMIN Education Service Overview_20240407yukisuga3
 
KARAPATANG PANTAO.pptxhrhrhrhrhrhrhrhrhr
KARAPATANG PANTAO.pptxhrhrhrhrhrhrhrhrhrKARAPATANG PANTAO.pptxhrhrhrhrhrhrhrhrhr
KARAPATANG PANTAO.pptxhrhrhrhrhrhrhrhrhrRodolfFernandez1
 
2024年度 東京工業大学「ロボット技術」 ロボットミドルウェア (2024年4月11日)
2024年度 東京工業大学「ロボット技術」 ロボットミドルウェア (2024年4月11日)2024年度 東京工業大学「ロボット技術」 ロボットミドルウェア (2024年4月11日)
2024年度 東京工業大学「ロボット技術」 ロボットミドルウェア (2024年4月11日)NoriakiAndo
 
3年前期 交通基盤工学 第一回 ガイダンス 交通基盤工学の概要  パワーポイント
3年前期 交通基盤工学 第一回 ガイダンス 交通基盤工学の概要  パワーポイント3年前期 交通基盤工学 第一回 ガイダンス 交通基盤工学の概要  パワーポイント
3年前期 交通基盤工学 第一回 ガイダンス 交通基盤工学の概要  パワーポイントshu1108hina1020
 
Registration of travel agents - 'Explanation of the registration system under...
Registration of travel agents - 'Explanation of the registration system under...Registration of travel agents - 'Explanation of the registration system under...
Registration of travel agents - 'Explanation of the registration system under...oganekyokoi
 
レポートの書き方講座 [大学生初年次向けに対する講義資料] Lecture on how to write a report [lecture mater...
レポートの書き方講座 [大学生初年次向けに対する講義資料] Lecture on how to write a report [lecture mater...レポートの書き方講座 [大学生初年次向けに対する講義資料] Lecture on how to write a report [lecture mater...
レポートの書き方講座 [大学生初年次向けに対する講義資料] Lecture on how to write a report [lecture mater...yutakashikano1984
 
The first time I used CANVA to create a slide document.
The first time I used CANVA to create a slide document.The first time I used CANVA to create a slide document.
The first time I used CANVA to create a slide document.oganekyokoi
 

Kürzlich hochgeladen (7)

TEAMIN Education Service Overview_20240407
TEAMIN Education Service Overview_20240407TEAMIN Education Service Overview_20240407
TEAMIN Education Service Overview_20240407
 
KARAPATANG PANTAO.pptxhrhrhrhrhrhrhrhrhr
KARAPATANG PANTAO.pptxhrhrhrhrhrhrhrhrhrKARAPATANG PANTAO.pptxhrhrhrhrhrhrhrhrhr
KARAPATANG PANTAO.pptxhrhrhrhrhrhrhrhrhr
 
2024年度 東京工業大学「ロボット技術」 ロボットミドルウェア (2024年4月11日)
2024年度 東京工業大学「ロボット技術」 ロボットミドルウェア (2024年4月11日)2024年度 東京工業大学「ロボット技術」 ロボットミドルウェア (2024年4月11日)
2024年度 東京工業大学「ロボット技術」 ロボットミドルウェア (2024年4月11日)
 
3年前期 交通基盤工学 第一回 ガイダンス 交通基盤工学の概要  パワーポイント
3年前期 交通基盤工学 第一回 ガイダンス 交通基盤工学の概要  パワーポイント3年前期 交通基盤工学 第一回 ガイダンス 交通基盤工学の概要  パワーポイント
3年前期 交通基盤工学 第一回 ガイダンス 交通基盤工学の概要  パワーポイント
 
Registration of travel agents - 'Explanation of the registration system under...
Registration of travel agents - 'Explanation of the registration system under...Registration of travel agents - 'Explanation of the registration system under...
Registration of travel agents - 'Explanation of the registration system under...
 
レポートの書き方講座 [大学生初年次向けに対する講義資料] Lecture on how to write a report [lecture mater...
レポートの書き方講座 [大学生初年次向けに対する講義資料] Lecture on how to write a report [lecture mater...レポートの書き方講座 [大学生初年次向けに対する講義資料] Lecture on how to write a report [lecture mater...
レポートの書き方講座 [大学生初年次向けに対する講義資料] Lecture on how to write a report [lecture mater...
 
The first time I used CANVA to create a slide document.
The first time I used CANVA to create a slide document.The first time I used CANVA to create a slide document.
The first time I used CANVA to create a slide document.
 

20130819 jjugnslt

  • 1. Aggressive Heap の実装を Aggressive に解析する JJUG Night Seminar Aug, 2013 Shinya TAKEBAYASHI
  • 2. 自己紹介 v  名前: 竹林 信哉(たけばやし しんや) v  職業: 某 SIer 社員 ・・・ 少し前まで CGL 作っていました.今は Java サポート. v  得意: Ø  OS 実装 / デバイスドライバ / UNIX / Windows Ø  C / C++ / asm(x86, SPARC) / Python / 並列(CUDA) Ø  コンパイラ,デバッガとお友達 v  私と Java Ø  プログラミング言語 Java は苦手です Ø  JavaVM の実装が大好き @chi9rin
  • 3. chi9 流 Hack の考え方 v  前提として Ø  アプリケーションは,そう簡単にソースコード通りに 動きません. Ø  環境に依存して,書いたソースをまねて動きます. Ø  プログラマやアーキテクトの腕の見せ所は,いかに狙った環境 で狙ったとおりに動かすか,です.
  • 4. chi9 流 Hack の考え方(Cont’d) v  だから Ø  ソースコードばかりを追っていても,答えが得られない可能性 があります. Ø  ソースコードと実際の動作を見て,初めて実装を理解できます. ソースコードを読むのは予習 動いているものを trap して解析するのが Hack
  • 5. -XX:+AggressiveHeap v  大規模アプリケーションにいいよ,という触れ込みの設定 v  自動でヒープサイズを決めてくれる v  結局何が指定されるかを解説したドキュメントが乏しい v  なのに皆さん勧めている謎の設定
  • 6. -XX:+AggressiveHeap で 何が起きるか 計算 •  メモリサイズ •  GC スレッド数 機能の有効化 •  Parallel GC •  Large Pages •  JIT コンパイルポリシ はシンプルモード 機能の無効化 •  Scavenge GC •  TLAB の動的リサイズ julong initHeapSize; julong total_memory = os::physical_memory(); if (total_memory < (julong)256*M) { jio_fprintf(defaultStream::error_stream(), "You need at least 256mb of memory to use -XX:+AggressiveHeapn"); vm_exit(1); } initHeapSize = MIN2(total_memory / (julong)2, total_memory - (julong)160*M); initHeapSize = os::allocatable_physical_memory(initHeapSize); if (initHeapSize > MaxPermSize) { initHeapSize = initHeapSize - MaxPermSize; } else { warning("AggressiveHeap and MaxPermSize values may conflict"); } if (FLAG_IS_DEFAULT(MaxHeapSize)) { FLAG_SET_CMDLINE(uintx, MaxHeapSize, initHeapSize); FLAG_SET_CMDLINE(uintx, InitialHeapSize, initHeapSize); set_min_heap_size(initHeapSize); } if (FLAG_IS_DEFAULT(NewSize)) { FLAG_SET_CMDLINE(uintx, NewSize, ((julong)MaxHeapSize / (julong)8) * (julong)3); FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize); } FLAG_SET_DEFAULT(UseLargePages, true); FLAG_SET_CMDLINE(uintx, BaseFootPrintEstimate, MaxHeapSize); FLAG_SET_CMDLINE(bool, ResizeTLAB, false); FLAG_SET_CMDLINE(uintx, TLABSize, 256*K); FLAG_SET_CMDLINE(uintx, YoungPLABSize, 256*K); FLAG_SET_CMDLINE(uintx, OldPLABSize, 8*K); FLAG_SET_CMDLINE(intx, CompilationPolicyChoice, 0); FLAG_SET_CMDLINE(bool, UseParallelGC, true); FLAG_SET_DEFAULT(ParallelGCThreads, Abstract_VM_Version::parallel_worker_threads()); FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100); FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false); FLAG_SET_CMDLINE(bool, BindGCTaskThreadsToCPUs, true);
  • 7. 答え パラメータ 最近のマシン環境で設定される値(青字は自動計算されるところ) -Xmx(MaxHeapSize) 物理メモリ量の半分 – 約 85 MB(LP64 の場合) -Xms(InitialHeapSize) MaxHeapSize と同じ -XX:NewSize (MaxHeapSize ÷ 8) × 3 -XX:MaxNewSize NewSize と同値 -XX:+UseLargePages 有効化 -XX:BaseFootPrintEstimates MaxHeapSize と同値 -XX:-ResizeTLAB 無効化 -XX:TALBSize 256KB -XX:YoungPLABSize 256KB -XX:OldPLABSize 8KB -XX:CompilationPolicyChoice 0(SimpleCompilePolicy) -XX:+UseParallelGC 有効化 -XX:ParallelGCThreads CPU 数が 8 以下なら CPU 数と同値,9 以上なら後述の計算式 -XX:ThreasholdTolerance 100 -XX:-ScavengeBeforeFullGC 無効化 -XX:+BindGCTaskThreadsToCPUs 有効化 ・ヒープ領域を多め(Aggressive!)に確保する. ・AP を全力(Aggressive!!)で走らせる. ・極力 GC しない.GC はまとめて全力(Aggressive!!!)で.
  • 8. では,Hack を始めます 環境 CPU 4 cores – メモリ 2GB - Debian/GNU Linux 64 bits
  • 9. JavaVM の準備 % hg clone http://hg.openjdk.java.net/jdk7u/jdk7u2 % cd jdk7u2 % chmod +x ./get_source.sh; ./get_source.sh % export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk-amd64 % source jdk/make/jdk_generic_profile.sh % make sanity && make ALLOW_DOWNLOAD=true debug_build 【注意】 ・make -jn しないこと. ・gcc は 4.6 以前を使うこと.clang/clang++ は使わない. ・jdk7u25 以降は ZIP_DEBUGINFO_FILES=0 が必要
  • 10. JavaVM 起動と進め方 v  コマンドラインオプションを解析する箇所にブレイクポイントを 仕掛ける. v  signal 6(SIGABRT)を投げて core を分析しても good! % ulimit –c unlimited % gdb ./java (gdb) b arguments.cpp:2458 No source file named arguments.cpp Make breakpoint pending on future shared library load? (y or [N]) y Breakpoint 1 (arguments.cpp:2458) pending. (gdb) r -XX:+AggressiveHeap ... Breakpoint 1, Arguments::parse_each_vm_init_arg ...... (gdb) signal 6 Continuing with signal SIGABRT. [Thread 0x7ffff7fd0700 (LWP 21391) exited] No unwaited-for children left.
  • 11. 計算 その 1 そもそも AggressiveHeap が使えるかどうか v  物理メモリの算出と閾値判定 Ø  物理メモリ量の算出 p  = os::Linux::_physical_memory = sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) = 物理ページ数 × ページサイズ = 513,535 × 4096 = 2,103,439,360 = /proc/meminfo の MemTotal 値 × 1,024(KB) Ø  判定: 256 MB 未満なら AggressiveHeap は使えない % gdb ./java (gdb) b arguments.cpp:2446 (gdb) r -XX:+AggressiveHeap Breakpoint 1, Arguments::parse_each_vm_init_arg (args=0x7ffff7fcfe20, scp_p=0x7ffff7fcea10, ... (gdb) p total_memory $1 = 2103439360 % grep MemTotal /proc/meminfo | awk '{print $2;}' | xargs -I n expr n * 1024 2103439360 julong total_memory = os::physical_memory(); if (total_memory < (julong)256*M) { jio_fprintf(defaultStream::error_stream(), "You need at least 256mb of memory to use -XX:+AggressiveHeapn"); vm_exit(1); }
  • 12. 計算 その 2 ヒープサイズの計算 v  まず基準になるサイズを求め,次にヒープサイズを確定する. p  total_memory ÷ 2 または total_memory - 160 MB の小さい方 = 1,051,719,680 または 1,935,503,360 の小さい方 = 1,051,719,680 p  = 1,051,719,680 – 87,241,520 = 964,478,160 (← LP64) 1,051,719,680 – 67,108,864 = 984,610,816(← それ以外) % gdb ./java (gdb) b arguments.cpp:2469 (gdb) r -XX:+AggressiveHeap Breakpoint 1, Arguments::parse_each_vm_init_arg (args=0x7ffff7fcfe20, scp_p=0x7ffff7fcea10, ... (gdb) p MaxPermSize $2 = 87241520 (gdb) p initHeapSize $1 = 964478160 initHeapSize = MIN2(total_memory) / (julong) 2, total_memory – (julong)160 * M); if (initHeapSize > MaxPermSize) { initHeapSize = initHeapSize - MaxPermSize; } else { warning("AggressiveHeap and MaxPermSize values may conflict"); }
  • 13. 計算 その 2(Cont’d) ヒープサイズの計算 v  確定した initHeapSize を MaxHeapSize,InitialHeapSize とし て設定. if (FLAG_IS_DEFAULT(MaxHeapSize)) { FLAG_SET_CMDLINE(uintx, MaxHeapSize, initHeapSize); FLAG_SET_CMDLINE(uintx, InitialHeapSize, initHeapSize); set_min_heap_size(initHeapSize); }
  • 14. 計算 その 3 New 領域サイズの計算 v  算出した MaxHeapSize をもとに計算される. Ø  NewSize p  (MaxHeapSize / 8) * 3) = (964,478,160 ÷ 8) × 3 = 361,679,310 Ø  MaxNewSize p  上記で算出した NewSize と同値 % gdb ./java (gdb) b arguments.cpp:2482 (gdb) r -XX:+AggressiveHeap Breakpoint 1, Arguments::parse_each_vm_init_arg (args=0x7ffff7fcfe20, scp_p=0x7ffff7fcea10, ... (gdb) p MaxHeapSize $1 = 964478160 (gdb) p NewSize $2 = 361679310 (gdb) p MaxNewSize $3 = 361679310 FLAG_SET_CMDLINE(uintx, NewSize, ((julong)MaxHeapSize / (julong)8) * (julong)3); FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize);
  • 15. 計算 その 4 GC スレッド数の算出 v  アクティブな CPU (/proc/cpuinfo の数)をもとに確定する. Ø  Abstract_VM_Version::nof_parallel_worker_threads() p  nof_parallel_worker_threads(num = 5, den = 8, switch_pt = 8) アクティブな CPU 数に応じて適切な値が計算される. p  アクティブ CPU 数が 8 以下なら,アクティブな CPU 数と同値. p  9 CPU 以上なら,8 + ((アクティブ CPU 数 – 8) × 5) ÷ 8) 例)アクティブ CPU 数が 72 なら 8 + ((72 – 8) × 5) ÷ 8) = 48 ス レッド. (gdb) b vm_version.cpp:307 (gdb) r -XX:+AggressiveHeap ... Breakpoint 1, Abstract_VM_Version::parallel_worker_threads () at ... (gdb) p _parallel_worker_threads $1 = 4 unsigned int ncpus = (unsigned int) os::active_processor_count(); return (ncpus <= switch_pt) ? ncpus : (switch_pt + ((ncpus - switch_pt) * num) / den);
  • 16. おさらい パラメータ 最近のマシン環境で設定される値 GDB での出力 jinfo 出力 -Xmx(MaxHeapSize) 物理メモリ量の半分 – 約 85 MB -XX:MaxHeapSize=964478160 -Xms(InitialHeapSize) MaxHeapSize と同じ -XX:InitialHeapSize=964478160 -XX:NewSize (MaxHeapSize ÷ 8) × 3 -XX:NewSize=361679310 -XX:MaxNewSize NewSize と同値 -XX:MaxNewSize=361679310 -XX:+UseLargePages 有効化 -XX:+UseLargePages -XX:BaseFootPrintEstimates MaxHeapSize と同値 -XX:BaseFootPrintEstimates=964478160 -XX:-ResizeTLAB 無効化 -XX:-ResizeTLAB -XX:TLABSize 256KB -XX:TLABSize=262144 -XX:YoungPLABSize 256KB -XX:YoungPLABSize=262144 -XX:OldPLABSize 8KB -XX:OldPLABSize=8192 -XX:CompilationPolicyChoice 0(SimpleCompilePolicy) -XX:CompilationPolicyChoice=0 -XX:+UseParallelGC 有効化 -XX:+UseParallelGC -XX:ParallelGCThreads CPU 数が 8 以下なら CPU 数と同値 -XX:ParallelGCThreads=4 -XX:ThresholdTolerance 100 -XX:ThresholdTolerance=100 -XX:-ScavengeBeforeFullGC 無効化 -XX:-ScavengeBeforeFullGC -XX:+BindGCTaskThreadsToCPUs 有効化 -XX:+BindGCTaskThreadsToCPUs (gdb) p MaxHeapSize $1 = 964478160 (gdb) p InitialHeapSize $2 = 964478160 (gdb) p NewSize $3 = 361679310 (gdb) p MaxNewSize $4 = 361679310 (gdb) p UseLargePages $5 = true (gdb) p BaseFootPrintEstimate $6 = 964478160 (gdb) p ResizeTLAB $7 = false (gdb) p TLABSize $8 = 262144 (gdb) p YoungPLABSize $9 = 262144 (gdb) p OldPLABSize $10 = 8192 (gdb) p CompilationPolicyChoice $11 = 0 (gdb) p UseParallelGC $12 = true (gdb) p ParallelGCThreads $13 = 4 (gdb) p ThresholdTolerance $14 = 100 (gdb) p ScavengeBeforeFullGC $15 = false (gdb) p BindGCTaskThreadsToCPUs $16 = true
  • 17. 最後に v  VM の実装を理解する勉強会をやりたい Ø  この手のネタを受け付ける人が身近には少ないので, ここで募集 v  JavaOne 2013@SFO 行きます v  次回予告 Ø  ByteCode / JIT コンパイラに優しいソースコード