jjugccc2018 app review postmortem

tamtam180
tamtam180 Square Enix
収益を支える
中規模アプリケーション開発奮闘記
2018/05/26
JJUG CCC Spring
@tamtam180
テーマ 2
ピーク時性能
数万リクエスト/秒
データストアとのやりとり 25万OP/秒
Java8
Webアプリ
レビュー内容
対策コード
障害事例
アジェンダ
• 自己紹介
• アーキテクチャの説明
• レビューについて
– どのレベルで?
– どういう観点で?
– 指摘が多いもの/具体的な内容
• 性能問題
– JVMの話
– JVMの外の話
• 障害例
• ボトルネックの見つけ方
• 負荷試験
• おまけ
3
自己紹介
• Name: Kiyotaka Suzuki
• Twitter: @tamtam180
• Main works
– SquareEnix (5.5Y)
• PlayOnline, FF-XIV, etc.
– SmartNews (4Y〜)
• Cross-functional Expert Team
– Software Engineer
– 広告, 公共
4
アーキテクチャの説明
対象アプリケーション
• SmartNews(ニュースアプリ)の運用型広告
配信サーバ
6
こういうの
対象アプリケーション
• SmartNews(ニュースアプリ)の運用型広告
配信サーバ
7
こういうの
チャンネル数 *	広告数 *	数万クリエイティブ *	etc
の組み合わせ最適化
アーキテクチャ 8
アーキテクチャ 9
アーキテクチャ 10
Spring	Framework
Embeded Jetty
RxJava
http://bit.ly/sn-tech-vol5-adserver
アーキテクチャ 11
Transform
Filtering
Auction
Allocation
Response
Mem	Bound
CPU	Bound
Bloom	Filter
Online	Prediction
Creative	Optimizer
Counter	Provider
Bid	Price	Calculation
In	Memory	Cache
特徴ベクトル
Master	Data
Counter
History
アクセス特性 12
設計方針
• リクエスト中は基本的に通信はしないようにする
• 一部の処理は非同期で投機的実行
• スケールしないものと直接やりとりしない
• データストア
– ユーザー情報単位の情報はDDB
• 特徴ベクトルなど
– ユーザー共通の情報はRedis -> JVMキャッシュ
– キャンペーンなどのマスタ情報は DB -> JVMキャッシュ
• Pubsub経由で更新
13
レビューについて
レビューのレベル
• 基本的にガチレビュー
• プログラムが正しいかだけではなく、プロダクトとしてどうあるべき
かのレベルで見ます
• 関連ドキュメントは基本的に読みます
– 背景/PRD/メモ
– 論文を元にしているなら論文を読みます
• 時間はめちゃくちゃかかる
• 普段から雑に共有しておくのが大事
• 人によっては教育も兼ねる
• Productionでバグ起因による障害は片手で数えら
れる程度
15
レビューの観点
• 計算量/メモリ空間
– O(1), O(LogN), O(N), …
– メモリはワーキングメモリ/定常使用 両方
• Objectの生成数
• オンライン処理かバックグラウンド処理か
• スレッドセーフか
• ブロッキング処理になっていないか
• 副作用(他の機能を壊していないか)
• 撤退可能かどうか
• お金でスケールできる設計になっているか
• 意思のあるコードか
– (意味を理解していないコピペかどうか)
16
指摘が多い内容
指摘が多い内容
• プログラムの話
• 仕事の仕方
18
指摘が多い内容
• プログラムの話
• 仕事の仕方
19
対象アプリケーションの背景によって適切なコードは異なります。
パフォーマンスに困っていないのであれば、
過度な最適化は避け、
わかりやすいプログラムを書いた⽅が良いと思います。
指摘が多い内容/プログラム編
• Boxing/Unboxingを意識していない
• (例) CollectionライブラリにFastutilを使ってい
る場合
20
指摘が多い内容/プログラム編
• PrimitiveなCollectionを使わない
21
Map<Long, String> map;
Long2ObjectMap<String> map;
指摘が多い内容/プログラム編
• PrimitiveCollectionなのに標準実装を使っている
22
Long2ObjectMap<Campaign> map = new Long2ObjectOpenHashMap<>()
long val = map.getOrDefault(10, -1); // return Long
Long2ObjectMap<Campaign> map = new Long2ObjectOpenHashMap<>()
map.defaultReturnValue(-1);
long val = map.get(10L);
指摘が多い内容/プログラム編
• 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();
}
指摘が多い内容/プログラム編
• ラッパークラスを 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
指摘が多い内容/プログラム編
• 古い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化
など
指摘が多い内容/プログラム編
• OptionalクラスでNULLを返す😱
26
public Optional<Campaign> returnOptionalValue() {
if (campaign == null) return null;
return Optional.of(campaign);
}
public Optional<Campaign> returnOptionalValue() {
return Optional.ofNullable(campaign);
}
指摘が多い内容/プログラム編
• なんでもかんでも@Lombok.Dataをつける
27
@Lombok.Data
public MyRequest {
private long campaignId;
private boolean innerFlag; // 内部フラグ
private Campaign campaign;
}
MyRequest request = JsonUtils.toObject(requestData, MyRequest.class);
このクラスでパラメータを受け取ると
内部フラグであるinnnerFlagにはsetInnnerFlagが存在するのでパラメータの
Mappingが行われてしまう。
外部のRequestから内部のパラメータを操作する事が出来てしまう。
指摘が多い内容/プログラム編
• Loggerの遅延評価機能を使わない
28
Logger.info("my error: " + hugeMap);
Logger.info("my error: {}", hugeMap);
指摘が多い内容/プログラム編
• Stacktraceを握りつぶすマン
29
try {
} catch (Exception e) {
log.error("error: {}", e.getMessage());
}
try {
} catch (Exception e) {
log.error("error", e);
}
末尾に例外Objectを指定すればstacktrace出してくれる
指摘が多い内容/プログラム編
• 初期サイズを指定しない
30
new StringBuilder();
new ArrayList<>();
new HasMap<>();
事前にある程度分かっているところは内部構造の拡張処理が走らないように指定す
る。
expand処理, grow, copyOf等非常に重い処理が何度も走る。
ピーク時にはこれがボディーブローのように地味に処理を占める。
指摘が多い内容/プログラム編
• 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
ExecutorService svc;
svc.submit(() -> {
// 何かの処理
svc.submit(() -> {
// 何かの処理
});
});
ExecutorServiceのRejectポリシー実装によりますが、デッドロックします
指摘が多い内容/プログラム編
• スレッド/ サイレント
– スレッドの中で例外発生に気が付かない
33
ExecutorService svc;
svc.execute(() -> {
something();
raiseException(); // ここで例外発生
veryImportantProcess(); // 実行されない
});
例外が何処にも出ないので気が付かない
指摘が多い内容/プログラム編
• スレッド/ スケジューラーが止まる
34
ScheduledExecutorService svc;
svc.scheduleWithFixedDelay(() -> {
raiseError(); // 例外が出る
}, 0, 5, TimeUnit.SECOND);
例外が発生するとスケジューラーは停止します
指摘が多い内容/プログラム編
• スレッド/ スレッドローカル問題
– JettyのHttpServletRequestを別スレッドから参
照する
35
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
asyncWorkers.execute(() -> {
log.info("real-ip={}", req.getHeader("X-FORWARDED-FOR"));
});
}
JettyはRequestにThreadLocalを使用しているので、
別のスレッドでは値を参照できない
指摘が多い内容/プログラム編
• スレッド/ 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/
指摘が多い内容/プログラム編
• スレッド/ 無限キューでOOM
37
ExecutorService svc1 = Executors.newFixedThreadPool(10);
svc1.execute(() -> {
// 重い処理
});
ピーク時に処理が追いつかなくてキューが溜まる
メモリ使用量が増える
OutOfMemoryError
new ThreadPoolExecutor(…, new LinkedBlockingQueue<Runnable>());
// 無限キュー
RejectedExecutionHandlerを実装する(CallerRunsPolicyとか)
Reject時のRetry処理を入れるとか
指摘が多い内容/プログラム編
• スレッド/ 何でもかんでもParallelStream
38
このアプリでは他にもスレッドが沢山動いているので
ContextSwitch多発で処理が遅くなる
指摘が多い内容/プログラム編
• N+1問題
39
ループの中で何度も単発処理を走らせてしまう
ループの中でRPCコール
ループの中でDBアクセス
事前にBulk処理をしましょう
指摘が多い内容/プログラム編
• Lambda + レキシカルスコープ参照
40
Lambda Compilerの問題でもある
Lambdaの中でレキシカルスコープ参照で動的内部クラス生成
(Singleton実装にならない)
JITによりバイトコード変換, Metaspaceへ
使われなく案ってClass unloadedが定常的に発生する
Object obj = new Object();
lambdaCaller.execute(() -> {
obj.toString();
});
指摘が多い内容/プログラム編
• 勝手に依存を追加する
– Jackson, AwsSDK, Logbackの挙動が変わる
41
mvn dependency:tree –Doutput=dependency.txt
勝手にライブラリのバージョンを上げたり、
ライブラリを追加して他の依存バージョンを更新してしまう
依存関係をきちんとgitで管理する
気が付かないまま次の副作用が
Jackson: JSONのデフォルトの変換処理が変わる
AwsSDK: 初期化処理やCredentialの更新周りの変更
Logger: 設定ファイルの変更(<Encode>属性の場所)とか
指摘が多い内容/プログラム編
• 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
指摘が多い内容/プログラム編
• 画像処理
– ImageIO / Nativeメモリリーク
• 次のクラスはdisposeを呼ばないとnativeメモリが
リークする
– ImageReader
– ImageWriter
– Graphics2D
43
せっかくなので画像処理編
• 画像処理
– アルファチャンネル付き画像(ARGB)をJPEGで保存
– YCrCb(明るさ, 色相)
• ではなくCMYK形式のJPEGで出力される
– 赤みを帯びた画像になる
– ImageIOの不具合(だと思ってる)
44
せっかくなので画像処理編
• 画像処理
– お行儀の悪い画像を読み込むと例外が出る
– 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};
指摘が多い内容/プログラム編
• InstanceOf / DownCast
– 正しく設計していれば殆どのケースで使う事は無い
– これが出てくる時点で設計ミスを疑ったほうが良い
• 特にDownCast
• InstanceOf <Interface>のミスマッチは特に処理
コストが高い
46
指摘が多い内容/プログラム編
• String#replaceAll / String#replace
– 正規表現が不要な置換処理でもreplaceAllを使っている
– 単純な置換処理であればreplaceで良い
47
String s = "abracatabra";
s.replaceAll("ra", "&&");
String s = "abracatabra";
s.replace("ra", "&&");
性能問題
性能問題
• Dockerで動かす場合のCPUの数の認識
• HostのCPUを見てしまう
• 影響
– StreamのparallelStream
– GCのスレッド数
– JITコンパイラのスレッド数
– プロセッサ数から自動で制御するもの
49
最近のJDKではサポートされている
JDK8にもバックポートされている
(--cpuset-cpusと--cpusで対応範囲が異なるので注意)
メモリも同様
性能問題
• 最初の1回目が遅い
– ワーカースレッド
– Cipher
– リフレクションキャッシュ
50
// 一気にスレッドを生成する
ThreadPoolExecutor#prestartAllCoreThreads();
起動時にWarmup処理を入れる
性能問題
• JavaでSSL処理の中に出てくるGHASH
• 一部のバージョンではGHASHがめちゃくちゃ遅い
• AWS-SDKは基本的にHTTPS通信
– CloudSearchで巨大なResponse
– DynamoDBの処理でボトルネック
• HTTP通信をする
51
ClientConfiguration awsConfig =
new ClientConfiguration();
awsConfig.setProtocol(Protocol.HTTP);
性能問題
• 同期処理問題(synchronized等)
– Propertiesクラス
– SecureRandom
• 意外とあちこちで使われている
– ChiperのInstance化まわり
– GenericObjectPool
– getClass().getName
– Collections.shuffle
– AtomicLong
– etc,etc…
52
性能問題
• CPU L2キャッシュ
– 要素数が少ない場合はシーケンシャルアクセスの方が速
い事が多い
– Sortも同様
– Mapも同様
• Get: MapはO(1)で ArrayはO(N)だけど、要素数が少な
いとArrayのが速い
• アルゴリズム上の計算量だけではなく
目に見えない定数項を考慮
53
性能問題
• Objectを作りすぎない
54
class Points {
int[] xx;
int[] yy;
}
これで同じ事が出来る
class Point { int x; int y }
ImmutableList<Point> points; // 10万要素あると10万Object生成
JVMの話
JVMの話
• Gzip処理
– Native実装ではあるが、nginxのレイヤーに任せた方が
良い
– Gzip -> crc -> 恐怖のGCLocker
56
JVMの話
• IPv6問題
– IPv6でログ等が記録されちゃうのを回避する
57
-Djava.net.preferIPv4Stack=true
JVMの話
• 例外のスタックトレースが全く出力されない
– 同じ様な箇所で組み込み例外が繰り返し発生するような
状態になるとJITによってスタックトレースのサイズが
0の例外が投げられるようになる。
58
-XX:-OmitStackTraceInFastThrow
• Dockerで動かす場合のCPUの数の認識(再掲)
• HostのCPUを見てしまう
• 影響
– StreamのparallelStream
– GCのスレッド数
– JITコンパイラのスレッド数
– プロセッサ数から自動で制御するもの
JVMの話 59
JVMの話
• 起動時にFULL GCが走る
– Metaspaceの初期サイズが小さい
– Jarが大きいとその分領域が必要
– GCの目安を指定する
60
-XX:MetaspaceSize=128m
JVMの話
• メモリ配分
– コピペで持ってこないでアプリの特性に合わせて設定
– キャッシュライブラリの設定
• 安定稼働に必要なメモリを確保していない事とメモリ
リークは異なる
• キャッシュライブラリを使う場合はきちんと見積もる
61
JVMの外の話
JVMの外の話
• Kernelの設定
• インターネットに公開されているやつは古いのが多い
– Kernel2.4/2.6の産物
– (オープンソーシャルが流行った時代)
• 最近のKernelは自動調整項目が多い
– 設定する事で逆に悪くなるものもある
63
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
危険
JVMの外の話
• Jumbo frame
– 経路によっては通信できない
65
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
障害例
障害例
• もぐら叩き問題
• Port番号Conflict
• IOPS不足
• AWSの問題
– リージョン間通信の経路がおかしくなる
– ElasticacheのARPテーブル問題(FIXED)
– DDBが定期的に短時間の間不安定になる
• GC多すぎ問題
• ブロッキング処理多発
• JVMクラッシュ
68
障害例
• JVMクラッシュ
• https://bugs.openjdk.java.net/browse/JDK-8189789
• https://bugs.openjdk.java.net/browse/JDK-8059299
• https://bugs.openjdk.java.net/browse/JDK-8054883
• https://bugs.openjdk.java.net/browse/JDK-8147585
• https://bugs.openjdk.java.net/browse/JDK-8081283
• https://bugs.openjdk.java.net/browse/JDK-8075805
69
障害例
• JVMクラッシュ
• デプロイをしてN分後くらいにセグフォルトで死ぬ
– 再現率100%
• JITの不具合
• 階層型コンパイラ
– 2000回実行でインタプリタからC1へ
– 15000回実行でC1からC2へ
• C2コンパイラの不具合でセグフォルト
70
どうやってボトルネックを見つけるか
ボトルネック発見
• JMXで色々な情報をDatadogに送っている
– 400項目以上
• System Metrics: Datadog
• Application Performance: NewRelic
• Frame Graph
• ピークタイムにjstack連打
• GCログ
• Profiler: yourkit
72
ボトルネック発見
• (例) ワーカースレッド(ThreadPoolExecutor)
• 通常の観測では意味が無い
– 値を取得するタイミングに依存する
• WindowTime(1分)の瞬間最大風速を記録する
• Submit/Executeした後に、
Queue/Activeスレッド数の最大値を記憶する
73
ボトルネック発見
• 発見したら直す
74
負荷テスト
負荷テスト
• 負荷試験とエージングテストは違う
• 単純にRequestを大量に流して性能を測るのベンチ
マーク
• 一瞬の負荷が高いサービスで平均値を取ることは意味
が薄い
– 1秒単位のスパイクを見る必要がある
76
負荷テスト
• だんだんと負荷を上げ、ボトルネックになるリソース
を見つける。その変化点を探るのが負荷テスト
• 大事な事
– 安定して稼働する閾値を見つけ、スケールの臨界点を見
つける
– 露呈したボトルネックについてどのような対策を講じる
か
77
おまけ
(レビュー/仕事の仕方編)
おまけ: 仕事の仕方編
• レビューの指摘の返答が、コピペしたので分かりません
• 指摘に対して修正をせず、問題が発生する
• 何度も同じ内容を指摘
– 他のメンバーも同じ間違いが伝播する
• 無駄に複雑にしている
• 変なレイヤーに勝手にキャッシュを作り不整合
• DIFFを小さくする事と影響範囲を小さくする事を混同して
いる
• Etc..
79
😨
おまけ: 仕事の仕方編
• テストを書かない
• 検証をしないでいきなりProductionへ投入する
• 大きな新機能をデプロイ後、誰も反応できる関係者不在
• 既存の文化に合わせないで修正コードを書きまくる
• Etc..
80
😨
おまけ: 仕事の仕方編
• パラメータの変更
– 検証/レビュー無しで適用してしまう
• パラメータの変更 > プログラムの更新
– レビュー対象にするべき
– 動作が変わるのだから
81
おまけ: 仕事の仕方編
• そもそも全く違う
• 実装のレビューの前にアーキテクチャ/設計/方針の相談
• 事前に相談する
• いきなりHugeパッチを書かない
82
おしまい
1 of 83

Recommended

OpenJDK コミュニティに参加してみよう #jjug by
OpenJDK コミュニティに参加してみよう #jjugOpenJDK コミュニティに参加してみよう #jjug
OpenJDK コミュニティに参加してみよう #jjugYuji Kubota
8.1K views31 slides
Deep dive into instanceof by
Deep dive into instanceofDeep dive into instanceof
Deep dive into instanceofHiroshi Saito
4.4K views46 slides
WildFly Swarmではじめる「パーツとしてのJavaEE」 by
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」Hiroaki NAKADA
6.6K views20 slides
Migration Guide from Java 8 to Java 11 #jjug by
Migration Guide from Java 8 to Java 11 #jjugMigration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjugYuji Kubota
13.2K views45 slides
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc by
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccYahoo!デベロッパーネットワーク
12.5K views85 slides
JDK9 新機能 (日本語&ショートバージョン) #jjug by
JDK9 新機能 (日本語&ショートバージョン) #jjugJDK9 新機能 (日本語&ショートバージョン) #jjug
JDK9 新機能 (日本語&ショートバージョン) #jjugYuji Kubota
26.6K views34 slides

More Related Content

What's hot

WildFly Swarm - Rightsize Your Java EE Apps by
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsYoshimasa Tanabe
5.1K views52 slides
Java EE8 Report by
Java EE8 ReportJava EE8 Report
Java EE8 ReportNorito Agetsuma
8.2K views41 slides
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4 by
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4bitter_fox
23.4K views63 slides
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側 by
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側賢 秋穂
4.2K views100 slides
JVM上でのストリーム処理エンジンの変遷 by
JVM上でのストリーム処理エンジンの変遷JVM上でのストリーム処理エンジンの変遷
JVM上でのストリーム処理エンジンの変遷Sotaro Kimura
8K views51 slides

What's hot(20)

WildFly Swarm - Rightsize Your Java EE Apps by Yoshimasa Tanabe
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
Yoshimasa Tanabe5.1K views
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4 by bitter_fox
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
bitter_fox23.4K views
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側 by 賢 秋穂
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
賢 秋穂4.2K views
JVM上でのストリーム処理エンジンの変遷 by Sotaro Kimura
JVM上でのストリーム処理エンジンの変遷JVM上でのストリーム処理エンジンの変遷
JVM上でのストリーム処理エンジンの変遷
Sotaro Kimura8K views
Open Liberty / WebSphere Liberty by Takakiyo Tanaka
Open Liberty / WebSphere LibertyOpen Liberty / WebSphere Liberty
Open Liberty / WebSphere Liberty
Takakiyo Tanaka883 views
20140518 JJUG MySQL Clsuter as NoSQL by Ryusuke Kajiyama
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
Ryusuke Kajiyama4.4K views
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々 by torutk
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
torutk9.4K views
Java9新機能概要 by HonMarkHunt
Java9新機能概要Java9新機能概要
Java9新機能概要
HonMarkHunt16.1K views
Panamaを先取り!? JVMCIでJITと遊ぶ by Yasumasa Suenaga
Panamaを先取り!? JVMCIでJITと遊ぶPanamaを先取り!? JVMCIでJITと遊ぶ
Panamaを先取り!? JVMCIでJITと遊ぶ
Yasumasa Suenaga4.6K views
HeapStats @ Seasar Conference 2015 LT by Yuji Kubota
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
Yuji Kubota3.9K views
Java トラブル解析支援ツール HeapStats のご紹介 by Shinya Takebayashi
Java トラブル解析支援ツール HeapStats のご紹介Java トラブル解析支援ツール HeapStats のご紹介
Java トラブル解析支援ツール HeapStats のご紹介
Shinya Takebayashi10.5K views
Head toward Java 13 and Java 14 #jjug by Yuji Kubota
Head toward Java 13 and Java 14 #jjugHead toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjug
Yuji Kubota11.6K views
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c by Norito Agetsuma
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cCDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
Norito Agetsuma6.4K views
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ- by PE-BANK
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PE-BANK2K views

Similar to jjugccc2018 app review postmortem

JavaOne2015報告会 Java EE アップデート #j1jp by
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpNorito Agetsuma
13.4K views49 slides
XPages 開発 Tips 百連発 by
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発Mitsuru Katoh
20.3K views102 slides
企業におけるSpring@日本springユーザー会20090624 by
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
1.9K views36 slides
Tech Fielders 2009/9/18 LT by
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTterurou
1.5K views39 slides
「Oracle Database + Java + Linux」 環境における性能問題の調査手法 ~ミッションクリティカルシステムの現場から~ Part.1 by
「Oracle Database + Java + Linux」環境における性能問題の調査手法 ~ミッションクリティカルシステムの現場から~ Part.1「Oracle Database + Java + Linux」環境における性能問題の調査手法 ~ミッションクリティカルシステムの現場から~ Part.1
「Oracle Database + Java + Linux」 環境における性能問題の調査手法 ~ミッションクリティカルシステムの現場から~ Part.1Shogo Wakayama
4.9K views27 slides
Jjug springセッション by
Jjug springセッションJjug springセッション
Jjug springセッションYuichi Hasegawa
2.6K views70 slides

Similar to jjugccc2018 app review postmortem(20)

JavaOne2015報告会 Java EE アップデート #j1jp by Norito Agetsuma
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
Norito Agetsuma13.4K views
XPages 開発 Tips 百連発 by Mitsuru Katoh
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
Mitsuru Katoh20.3K views
企業におけるSpring@日本springユーザー会20090624 by Yusuke Suzuki
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
Yusuke Suzuki1.9K views
Tech Fielders 2009/9/18 LT by terurou
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LT
terurou1.5K views
「Oracle Database + Java + Linux」 環境における性能問題の調査手法 ~ミッションクリティカルシステムの現場から~ Part.1 by Shogo Wakayama
「Oracle Database + Java + Linux」環境における性能問題の調査手法 ~ミッションクリティカルシステムの現場から~ Part.1「Oracle Database + Java + Linux」環境における性能問題の調査手法 ~ミッションクリティカルシステムの現場から~ Part.1
「Oracle Database + Java + Linux」 環境における性能問題の調査手法 ~ミッションクリティカルシステムの現場から~ Part.1
Shogo Wakayama4.9K views
Apache Torqueについて by tako pons
Apache TorqueについてApache Torqueについて
Apache Torqueについて
tako pons2.2K views
PHP 2大 web フレームワークの徹底比較! by Shohei Okada
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada13.4K views
Statically detecting vulnerability under memory pressure using exhaustive search by Ruo Ando
Statically detecting vulnerability under memory pressure usingexhaustive searchStatically detecting vulnerability under memory pressure usingexhaustive search
Statically detecting vulnerability under memory pressure using exhaustive search
Ruo Ando398 views
アドテク×Scala×パフォーマンスチューニング by Yosuke Mizutani
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
Yosuke Mizutani14.4K views
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン by Kazuyuki Miyake
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Kazuyuki Miyake5.5K views
単なるキャッシュじゃないよ!?infinispanの紹介 by AdvancedTechNight
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
AdvancedTechNight16K views
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~ by normalian
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
normalian10.4K views
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug by Y Watanabe
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe5.4K views
CodeIgniter入門 by Sho A
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
Sho A13.1K views
20120405 setsunaセミナー by Takahiro Iwase
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
Takahiro Iwase848 views
EC-CUBEプラグイン講義 by ria1201
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
ria120116.9K views

More from tamtam180

Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門 by
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門tamtam180
10.2K views86 slides
Japanese font test by
Japanese font testJapanese font test
Japanese font testtamtam180
590 views1 slide
Getting Started GraalVM (再アップロード) by
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)tamtam180
504 views92 slides
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2 by
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2tamtam180
8.3K views92 slides
PipelineDBとは? by
PipelineDBとは?PipelineDBとは?
PipelineDBとは?tamtam180
2.3K views51 slides
動画共有ツール by
動画共有ツール動画共有ツール
動画共有ツールtamtam180
6.9K views39 slides

More from tamtam180 (7)

Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門 by tamtam180
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門
tamtam180 10.2K views
Japanese font test by tamtam180
Japanese font testJapanese font test
Japanese font test
tamtam180 590 views
Getting Started GraalVM (再アップロード) by tamtam180
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)
tamtam180 504 views
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2 by tamtam180
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
tamtam180 8.3K views
PipelineDBとは? by tamtam180
PipelineDBとは?PipelineDBとは?
PipelineDBとは?
tamtam180 2.3K views
動画共有ツール by tamtam180
動画共有ツール動画共有ツール
動画共有ツール
tamtam180 6.9K views
Hive undocumented feature by tamtam180
Hive undocumented featureHive undocumented feature
Hive undocumented feature
tamtam180 7.9K views

jjugccc2018 app review postmortem