Java ランタイムアーキテクチャ
JVM、アプリケーションサーバー、リクエスト処理フロー
アーキテクチャ概要
クライアント
→ HTTP/HTTPS →
LB / Nginx
リバースプロキシ
→
App Server
Tomcat / Jetty / Undertow
→
JVM
Java Virtual Machine
→
Application
Spring Boot / Jakarta EE
JVMメモリモデル
Heap (-Xmx)
Young Generation
Eden + Survivor (S0, S1)
Old Generation
長寿命オブジェクト
Non-Heap
Metaspace
クラスメタデータ (-XX:MaxMetaspaceSize)
Code Cache
JITコンパイル済みコード
重要: -Xmx はHeapのみ。実際のメモリ使用量はHeap + Metaspace + スレッドスタック + Native Memory
データフローと制限ポイント
1
Nginx / LB
client_max_body_size, proxy_read_timeout
2
Tomcat / App Server
maxPostSize, connectionTimeout, maxThreads
acceptCount (接続キュー)
acceptCount (接続キュー)
3
JVM
-Xmx (最大ヒープ), -Xms (初期ヒープ)
GCチューニング
GCチューニング
4
Spring Boot / フレームワーク
spring.servlet.multipart.max-file-size
spring.servlet.multipart.max-request-size
spring.servlet.multipart.max-request-size
アプリケーションサーバー比較
| 項目 | Tomcat | Jetty | Undertow |
|---|---|---|---|
| タイプ | Servlet Container | Servlet Container | Web Server |
| メモリ使用量 | 中 | 低 | 低 |
| 起動時間 | 中 | 速い | 速い |
| Spring Boot | デフォルト | 対応 | 対応 |
| 非同期I/O | NIO | ネイティブ | XNIO |
各層の設定詳細
JVMオプション
1 # 本番推奨JVMオプション 2 java \ 3 # メモリ設定 4 -Xms4g -Xmx4g \ # ヒープサイズ固定 (推奨) 5 -XX:MaxMetaspaceSize=256m \ # Metaspace制限 6 7 # GC設定 (G1GC - Java 9+デフォルト) 8 -XX:+UseG1GC \ 9 -XX:MaxGCPauseMillis=200 \ # 目標GC停止時間 10 -XX:G1HeapRegionSize=16m \ 11 12 # GCログ 13 -Xlog:gc*:file=/var/log/app/gc.log:time,uptime:filecount=5,filesize=10m \ 14 15 # OOM時の動作 16 -XX:+HeapDumpOnOutOfMemoryError \ 17 -XX:HeapDumpPath=/var/log/app/heapdump.hprof \ 18 -XX:+ExitOnOutOfMemoryError \ 19 20 -jar app.jar
Tomcat server.xml
1 <!-- server.xml --> 2 <Connector port="8080" protocol="HTTP/1.1" 3 connectionTimeout="20000" <!-- 接続タイムアウト (ms) --> 4 maxPostSize="104857600" <!-- POST最大サイズ (100MB) --> 5 maxThreads="200" <!-- 最大スレッド数 --> 6 minSpareThreads="10" <!-- 最小待機スレッド --> 7 acceptCount="100" <!-- 接続キューサイズ --> 8 maxConnections="10000" <!-- 最大接続数 --> 9 enableLookups="false" <!-- DNS逆引き無効 (性能向上) --> 10 compression="on" <!-- gzip圧縮 --> 11 compressionMinSize="2048" /> 12 13 <!-- Executor (スレッドプール共有) --> 14 <Executor name="tomcatThreadPool" 15 namePrefix="catalina-exec-" 16 maxThreads="200" 17 minSpareThreads="4" />
Spring Boot application.yml
1 # application.yml 2 server: 3 port: 8080 4 tomcat: 5 max-threads: 200 6 min-spare-threads: 10 7 accept-count: 100 8 connection-timeout: 20000 9 max-http-post-size: 100MB # Tomcat 9+ 10 11 spring: 12 servlet: 13 multipart: 14 enabled: true 15 max-file-size: 100MB # 1ファイルの最大サイズ 16 max-request-size: 100MB # リクエスト全体の最大サイズ 17 file-size-threshold: 2KB # メモリ保持閾値 18 19 datasource: 20 hikari: 21 maximum-pool-size: 20 # コネクションプールサイズ 22 connection-timeout: 30000 # 接続タイムアウト (ms) 23 24 management: 25 endpoints: 26 web: 27 exposure: 28 include: health,metrics,prometheus
GC(ガベージコレクション)の種類
G1GC (推奨)
- • Java 9+のデフォルト
- • 大きなヒープに対応
- • 予測可能な停止時間
- • -XX:+UseG1GC
ZGC (低レイテンシ)
- • Java 15+で正式版
- • 超低レイテンシ (<10ms)
- • 大規模ヒープ向け
- • -XX:+UseZGC
Shenandoah
- • 低レイテンシ
- • Red Hat開発
- • コンカレントコンパクション
- • -XX:+UseShenandoahGC
Parallel GC
- • スループット重視
- • バッチ処理向け
- • 停止時間は長め
- • -XX:+UseParallelGC
よくあるエラーと対処
OutOfMemoryError: Java heap space
原因: ヒープメモリ枯渇
対処:
- -Xmx を増加
- メモリリークの調査 (heapdump分析)
- キャッシュサイズの調整
OutOfMemoryError: Metaspace
原因: クラスロード過多、ClassLoader leak
対処:
- -XX:MaxMetaspaceSize を増加
- 動的クラスロードの見直し
- ホットデプロイの回数制限
GC Overhead Limit Exceeded
原因: 98%以上の時間をGCに費やし、2%以下しかメモリ解放できない
対処:
- ヒープサイズ増加
- メモリリークの調査
- GCチューニング
監視項目
JVM
- • Heap使用率 (jvm.memory.used)
- • GC回数・時間 (jvm.gc.pause)
- • スレッド数 (jvm.threads.live)
- • CPU使用率
Tomcat
- • アクティブスレッド数
- • リクエストキューサイズ
- • コネクション数
- • エラー率