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 (接続キュー)
3
JVM
-Xmx (最大ヒープ), -Xms (初期ヒープ)
GCチューニング
4
Spring Boot / フレームワーク
spring.servlet.multipart.max-file-size
spring.servlet.multipart.max-request-size

アプリケーションサーバー比較

項目TomcatJettyUndertow
タイプServlet ContainerServlet ContainerWeb Server
メモリ使用量
起動時間速い速い
Spring Bootデフォルト対応対応
非同期I/ONIOネイティブXNIO

各層の設定詳細

JVMオプション

1# 本番推奨JVMオプション
2java \
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
2server:
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
11spring:
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
24management:
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

  • • アクティブスレッド数
  • • リクエストキューサイズ
  • • コネクション数
  • • エラー率