gocha124の日記

ごちゃごちゃ書きます

Javaの性能改善メモ

Javaプログラムの性能を改善したいが、うまく原因調査できておらず、行き当たりバッタリの手当てになっている。

JDKの基本的な情報、調査方法、改善方法を調べた内容をメモしておく。

 

★Setは集合、重複無し。
Listはリスト。
LinkedListとArrayList

Java6:ArrayListは500万件で200数十ms。LinkedListは200万で数十ms。

Java8:ArrayListは2億件で100数十ms。LinkedListは5000万で100数十ms。

ArrayList、LinkedListいずれも拡張forがよい。
LinkedListのget(i)はめちゃくちゃ遅いので単純なfor(ループカウンタ)も遅い。途中の要素追加がある場合に使える。
ArrayListのcontainsはだめ、HashSetを使う。

Mapの要素はkeySetではなくentrySetでまわす。

 

★初期容量の指定
負荷係数を考慮しないような指定(n * 4 / 3 + 1)
http://d.hatena.ne.jp/Kappuccino/touch/20080723/1216787927


1) Map<K,V> map = new HashMap<K,V>();
2) HashMap<K,V> map = new HashMap<K,V>();
JITでないと1は2に比べて2倍以上遅い。
http://developer.android.com/intl/ja/guide/practices/design/performance.html#myths

★オートボクシングによる暗黙のnew
数値が-128〜127はキャッシュだが、これ以外はnewされる。
trove。
hppc。

★スレッドダンプ、ヒープダンプ、GC
jstack、jmap
http://www.techscore.com/blog/2016/02/05/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%80%E3%83%B3%E3%83%97%E3%81%A7%E3%83%9C%E3%83%88%E3%83%AB%E3%83%8D%E3%83%83%E3%82%AF%E3%82%92%E8%AA%BF%E6%9F%BB%E3%81%97%E3%82%88%E3%81%86/


★CPU、I/O
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top

https://yakst.com/ja/posts/3601