Recommended
PPTX
Java EE パフォーマンスTips #glassfish_jp
PDF
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
PDF
PDF
Migration Guide from Java 8 to Java 11 #jjug
PDF
OpenJDK コミュニティに参加してみよう #jjug
PDF
JDK9 新機能 (日本語&ショートバージョン) #jjug
PDF
WildFly Swarmではじめる「パーツとしてのJavaEE」
PDF
Deep dive into instanceof
PPTX
PDF
PDF
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PPTX
PDF
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
PDF
WildFly Swarm - Rightsize Your Java EE Apps
PPTX
PPTX
Java トラブル解析支援ツール HeapStats のご紹介
PDF
PDF
Head toward Java 13 and Java 14 #jjug
PDF
#jjug_ccc #ccc_f1 広告システム刷新の舞台裏 - PHPからJavaに変えてみました
PDF
Open Liberty / WebSphere Liberty
PDF
PDF
HeapStats @ Seasar Conference 2015 LT
PPTX
20140518 JJUG MySQL Clsuter as NoSQL
PPTX
Panamaを先取り!? JVMCIでJITと遊ぶ
PDF
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
PDF
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
PDF
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
PPT
PDF
第三回ありえる社内勉強会 「いわががのLombok」
PDF
More Related Content
PPTX
Java EE パフォーマンスTips #glassfish_jp
PDF
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
PDF
PDF
Migration Guide from Java 8 to Java 11 #jjug
PDF
OpenJDK コミュニティに参加してみよう #jjug
PDF
JDK9 新機能 (日本語&ショートバージョン) #jjug
PDF
WildFly Swarmではじめる「パーツとしてのJavaEE」
PDF
Deep dive into instanceof
What's hot
PPTX
PDF
PDF
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PPTX
PDF
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
PDF
WildFly Swarm - Rightsize Your Java EE Apps
PPTX
PPTX
Java トラブル解析支援ツール HeapStats のご紹介
PDF
PDF
Head toward Java 13 and Java 14 #jjug
PDF
#jjug_ccc #ccc_f1 広告システム刷新の舞台裏 - PHPからJavaに変えてみました
PDF
Open Liberty / WebSphere Liberty
PDF
PDF
HeapStats @ Seasar Conference 2015 LT
PPTX
20140518 JJUG MySQL Clsuter as NoSQL
PPTX
Panamaを先取り!? JVMCIでJITと遊ぶ
PDF
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
PDF
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
PDF
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
PPT
Similar to jjugccc2018 app review postmortem
PDF
第三回ありえる社内勉強会 「いわががのLombok」
PDF
PDF
Play framework 2.0のおすすめと1.2からのアップグレード
PPTX
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
PDF
PDF
[豆ナイト]Java small object programming
PDF
PPTX
Glassfish勉強会(JavaEE6について)
PDF
Clean Architectureで設計してRxJSを使った話
PDF
Xamarin で ReactiveUI を使ってみた
PDF
企業におけるSpring@日本springユーザー会20090624
PDF
PDF
Why Reactive Matters #ScalaMatsuri
KEY
関ジャバ JavaOne Tokyo 2012報告会
PPTX
PDF
Springのプログラムモデルと動く仕様~テスト編~
KEY
PDF
デブサミ2010 これからのアーキテクチャを見通す
PDF
PDF
More from tamtam180
PDF
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門
PDF
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
PDF
PDF
Getting Started GraalVM (再アップロード)
PDF
Hive undocumented feature
PDF
PDF
Recently uploaded
PPTX
【ASW22-01】STAMP:STPAロスシナリオの発想・整理支援ツールの開発 ~astah* System Safetyによる構造化・階層化機能の実装...
PDF
サーバーサイド Kotlin を社内で普及させてみた - Server-Side Kotlin Night 2025
PDF
Kubernetes Release Team Release Signal Role について ~Kubernetes Meetup Tokyo #72~
PDF
0.0001秒の攻防!?快適な運転を支えるリアルタイム制御と組み込みエンジニアの実践知【DENSO Tech Night 第四夜】
PPTX
「グローバルワン全員経営」の実践を通じて進化し続けるファーストリテイリングのアーキテクチャ
PDF
Nanami Doikawa_寄り道の誘発を目的とした旅行写真からのスポット印象語彙の推定に関する基礎検討_EC2025
PDF
Rin Ukai_即興旅行の誘発を目的とした口コミ情報に基づく雰囲気キーワード_EC2025.pdf
jjugccc2018 app review postmortem 1. 2. 3. 4. 自己紹介
• Name: Kiyotaka Suzuki
• Twitter: @tamtam180
• Main works
– SquareEnix (5.5Y)
• PlayOnline, FF-XIV, etc.
– SmartNews (4Y〜)
• Cross-functional Expert Team
– Software Engineer
– 広告, 公共
4
5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. レビューの観点
• 計算量/メモリ空間
– O(1), O(LogN), O(N), …
– メモリはワーキングメモリ/定常使用 両方
• Objectの生成数
• オンライン処理かバックグラウンド処理か
• スレッドセーフか
• ブロッキング処理になっていないか
• 副作用(他の機能を壊していないか)
• 撤退可能かどうか
• お金でスケールできる設計になっているか
• 意思のあるコードか
– (意味を理解していないコピペかどうか)
16
17. 18. 19. 20. 21. 22. 23. 指摘が多い内容/プログラム編
• Iterator
23
Long2LongMap map1;
for (Map.Entry<Long, Long> entry : map1.entrySet()) {
Long k = entry.getKey();
Long v = entry.getValue();
}
ObjectIterator<Long2LongMap.Entry> itr =
map1.long2LongEntrySet().fastIterator();
while (itr.hasNext()) {
Long2LongMap.Entry e = itr.next();
long k = e.getLongKey();
long v = e.getLongValue();
}
24. 指摘が多い内容/プログラム編
• ラッパークラスを instance で比較する
24
Boolean val = returnBooleanMethod();
Optional<Boolean> optB = hogefuga();
if (optB.orElse(null) == val) {
}
Boolean b1 = new Boolean(true);
Boolean b_box_1 = true;
Boolean b2 = Boolean.TRUE;
Boolean b3 = Boolean.FALSE;
System.out.println(b1 == b2); // false
System.out.println(b1 == b3); // false
System.out.println(b_box_1 == b2); // true
25. 指摘が多い内容/プログラム編
• 古いJavaの知識のまま止まっている
25
Charset UTF8 = Charset.forName("UTF-8");
new InputStreamReader(System.in, UTF8);
new InputStreamReader(System.in, StandardCharsets.UTF_8);
try-with-resource, exception-multi-cache, stream, lambda, etc, etc..
I/F default実装, final化
など
26. 27. 28. 29. 30. 31. 指摘が多い内容/プログラム編
• Enumのvalues()
31
enum Color {
RED(1), YELLOW(2), BLUE(3), BLACK(4), WHITE(5);
private final int value;
private Color(int value) { this.value = value; }
private Color lookup(int value) {
for (Color c : values()) {
if (c.value == value) return c;
}
return null;
}
}
逆引きMapをstatic{}で作ろう
values()は毎回配列が生成される
(配列はImmutableではないため)
32. 指摘が多い内容/プログラム編
• スレッド/ デッドロック
– ワーカースレッドから同じワーカースレッドを使う
32
ExecutorService svc;
svc.submit(() -> {
// 何かの処理
svc.submit(() -> {
// 何かの処理
});
});
ExecutorServiceのRejectポリシー実装によりますが、デッドロックします
33. 指摘が多い内容/プログラム編
• スレッド/ サイレント
– スレッドの中で例外発生に気が付かない
33
ExecutorService svc;
svc.execute(() -> {
something();
raiseException(); // ここで例外発生
veryImportantProcess(); // 実行されない
});
例外が何処にも出ないので気が付かない
34. 35. 指摘が多い内容/プログラム編
• スレッド/ スレッドローカル問題
– JettyのHttpServletRequestを別スレッドから参
照する
35
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
asyncWorkers.execute(() -> {
log.info("real-ip={}", req.getHeader("X-FORWARDED-FOR"));
});
}
JettyはRequestにThreadLocalを使用しているので、
別のスレッドでは値を参照できない
36. 指摘が多い内容/プログラム編
• スレッド/ forkJoinを使って並列処理
36
ForkJoinPool forkJoinPool = new ForkJoinPool(2);
forkJoinPool.execute(() -> {
Arrays.stream(new int[]{ 1,2,3,4,5,6,7,8,9,10 })
.parallel()
.forEach(ii -> {
// process
});
});
1つのTaskが重いと他のTaskを道連れにする
https://blog.orz.at/2017/10/18/forkjoin/
37. 指摘が多い内容/プログラム編
• スレッド/ 無限キューでOOM
37
ExecutorService svc1 = Executors.newFixedThreadPool(10);
svc1.execute(() -> {
// 重い処理
});
ピーク時に処理が追いつかなくてキューが溜まる
メモリ使用量が増える
OutOfMemoryError
new ThreadPoolExecutor(…, new LinkedBlockingQueue<Runnable>());
// 無限キュー
RejectedExecutionHandlerを実装する(CallerRunsPolicyとか)
Reject時のRetry処理を入れるとか
38. 39. 40. 指摘が多い内容/プログラム編
• Lambda + レキシカルスコープ参照
40
Lambda Compilerの問題でもある
Lambdaの中でレキシカルスコープ参照で動的内部クラス生成
(Singleton実装にならない)
JITによりバイトコード変換, Metaspaceへ
使われなく案ってClass unloadedが定常的に発生する
Object obj = new Object();
lambdaCaller.execute(() -> {
obj.toString();
});
41. 指摘が多い内容/プログラム編
• 勝手に依存を追加する
– Jackson, AwsSDK, Logbackの挙動が変わる
41
mvn dependency:tree –Doutput=dependency.txt
勝手にライブラリのバージョンを上げたり、
ライブラリを追加して他の依存バージョンを更新してしまう
依存関係をきちんとgitで管理する
気が付かないまま次の副作用が
Jackson: JSONのデフォルトの変換処理が変わる
AwsSDK: 初期化処理やCredentialの更新周りの変更
Logger: 設定ファイルの変更(<Encode>属性の場所)とか
42. 指摘が多い内容/プログラム編
• Spring FrameworkのProxy化
– Annotationが消える
42
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}
@Component @MyAnnotation
public void MyClass {
@Transactional public void dbAccess() { … }
}
@Autowired private MyClass myClass;
myClass.getClass().getAnnotation(MyAnnotation.class); // NULL
43. 44. 45. せっかくなので画像処理編
• 画像処理
– お行儀の悪い画像を読み込むと例外が出る
– APP0-JFIFが欠落しているケース
• byte[]を弄ってからImageIOを使う
• APP0-JFIFの情報を無理矢理入れる
45
http://hp.vector.co.jp/authors/VA032610/
byte[0..3] == { 0xff, 0xd8, 0xff, !{0xe0 && 0xe1} }
// 以下を差し込む
{ 0xff, 0xe0, 0x00, 0x10, 'J', 'F', 'I', 'F', 0x00,
0x01, 0x01, 0x01, 0, 72, 0, 72, 0, 0};
46. 指摘が多い内容/プログラム編
• InstanceOf / DownCast
– 正しく設計していれば殆どのケースで使う事は無い
– これが出てくる時点で設計ミスを疑ったほうが良い
• 特にDownCast
• InstanceOf <Interface>のミスマッチは特に処理
コストが高い
46
47. 指摘が多い内容/プログラム編
• String#replaceAll / String#replace
– 正規表現が不要な置換処理でもreplaceAllを使っている
– 単純な置換処理であればreplaceで良い
47
String s = "abracatabra";
s.replaceAll("ra", "&&");
String s = "abracatabra";
s.replace("ra", "&&");
48. 49. 50. 51. 52. 53. 性能問題
• CPU L2キャッシュ
– 要素数が少ない場合はシーケンシャルアクセスの方が速
い事が多い
– Sortも同様
– Mapも同様
• Get: MapはO(1)で ArrayはO(N)だけど、要素数が少な
いとArrayのが速い
• アルゴリズム上の計算量だけではなく
目に見えない定数項を考慮
53
54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. JVMの外の話
• ClockSource
– EC2(KVMベースのc5,m5は除く)はxen
– ClockSourceもxen
– getTimeOfDayはvDSOでユーザーランドで動く
• xenだとカーネルランドで動く
• System.currentTimeMillis / System.nanoTime
– gettimeofday, clock_gettime
64
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
xen
echo tsc >/sys/devices/system/clocksource/clocksource0/current_clocksource
危険
65. 66. JVMの外の話
• TCP Offload
– OFFにしないとxenのネットワークドライバの不具合を
踏む事がある
– (最近のでは直っていると思う。たぶん。)
• RabbitMQでMirror設定を入れるとこれを踏んで
Panicを起こす事があった
66
for path in /proc/sys/net/ipv4/conf/*
do
nic=$(basename "$path")
if [[ $nic == eth* ]]; then
/sbin/ifconfig $nic txqueuelen 10000
/sbin/ethtool -K $nic ¥
rx off tx off sg off tso off ufo off gso off gro off lro off
fi
done
67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83.