Skip Navigation
Show nav
Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log inorSign up
View categories

Categories

  • Heroku のアーキテクチャ
    • Dyno (アプリコンテナ)
      • Dyno Management
      • Dyno Concepts
      • Dyno Behavior
      • Dyno Reference
      • Dyno Troubleshooting
    • スタック (オペレーティングシステムイメージ)
    • ネットワーキングと DNS
    • プラットフォームポリシー
    • プラットフォームの原則
  • Developer Tools
    • コマンドライン
    • Heroku VS Code Extension
  • デプロイ
    • Git を使用したデプロイ
    • Docker によるデプロイ
    • デプロイ統合
  • 継続的デリバリーとインテグレーション
    • 継続的統合
  • 言語サポート
    • Node.js
      • Working with Node.js
      • Node.js Behavior in Heroku
      • Troubleshooting Node.js Apps
    • Ruby
      • Rails のサポート
      • Bundler の使用
      • Working with Ruby
      • Ruby Behavior in Heroku
      • Troubleshooting Ruby Apps
    • Python
      • Working with Python
      • Python でのバックグランドジョブ
      • Python Behavior in Heroku
      • Django の使用
    • Java
      • Java Behavior in Heroku
      • Working with Java
      • Maven の使用
      • Spring Boot の使用
      • Troubleshooting Java Apps
    • PHP
      • PHP Behavior in Heroku
      • Working with PHP
    • Go
      • Go の依存関係管理
    • Scala
    • Clojure
    • .NET
      • Working with .NET
  • データベースとデータ管理
    • Heroku Postgres
      • Postgres の基礎
      • Postgres スターターガイド
      • Postgres のパフォーマンス
      • Postgres のデータ転送と保持
      • Postgres の可用性
      • Postgres の特別なトピック
      • Migrating to Heroku Postgres
    • Heroku Data For Redis
    • Apache Kafka on Heroku
    • その他のデータストア
  • AI
    • Working with AI
    • Heroku Inference
      • Inference API
      • Quick Start Guides
      • AI Models
      • Inference Essentials
    • Vector Database
    • Model Context Protocol
  • モニタリングとメトリクス
    • ログ記録
  • アプリのパフォーマンス
  • アドオン
    • すべてのアドオン
  • 共同作業
  • セキュリティ
    • アプリのセキュリティ
    • ID と認証
      • シングルサインオン (SSO)
    • Private Space
      • インフラストラクチャネットワーキング
    • コンプライアンス
  • Heroku Enterprise
    • Enterprise Accounts
    • Enterprise Team
    • Heroku Connect (Salesforce 同期)
      • Heroku Connect の管理
      • Heroku Connect のリファレンス
      • Heroku Connect のトラブルシューティング
  • パターンとベストプラクティス
  • Heroku の拡張
    • Platform API
    • アプリの Webhook
    • Heroku Labs
    • アドオンのビルド
      • アドオン開発のタスク
      • アドオン API
      • アドオンのガイドラインと要件
    • CLI プラグインのビルド
    • 開発ビルドパック
    • Dev Center
  • アカウントと請求
  • トラブルシューティングとサポート
  • Salesforce とのインテグレーション
  • 言語サポート
  • Java
  • Working with Java
  • Java プロセスのウォームアップ

Java プロセスのウォームアップ

日本語 — Switch to English

最終更新日 2024年05月07日(火)

Table of Contents

  • アプリケーションの Preboot
  • ウォームアップスクリプトの作成
  • ウォームアップスクリプトの有効化
  • ウォームアップスクリプトのカスタマイズ
  • 参考情報

Java または JVM Web アプリケーションに対して行われる最初のリクエストは多くの場合、そのプロセスの有効期間を通した平均応答時間より大幅に遅くなります。このウォームアップ期間は通常、低速なクラスのロードと、同一のコードを実行する以降のリクエストのために JVM を最適化するジャストインタイムコンパイルが原因であると考えることができます。

その結果、多くのユーザーは JVM プロセスを使用して実際のトラフィックを処理する前に、これにいくつかの人工的なリクエストを送信すると有効であることに気が付きます。アプリケーションへの単純な一連のノーオペレーションリクエストでさえ、通常はリクエストのオーバーヘッドの大きな部分を構成する、ネットワークやスタックのメッセージング部分をウォームアップすることができます。

この記事では、Heroku でこのような動作を実装するための 1 つの方法について説明します。

アプリケーションの Preboot

ルーターがプロセスにリクエストを送信し始める前に、そのプロセスを使用して何かを実行するには、Heroku の Preboot 機能​を有効にする必要があります。これにより、アプリが起動してから、実際のトラフィックを処理し始めるまでの間にある程度の時間が確保されます。

ウォームアップスクリプトの作成

Preboot が有効になっている場合は、アプリケーションと並行して実行されるスクリプトを作成し、それがアクティブな dyno のプールに移動される前にいくつかのリクエストを送信できます。

プロジェクトのルートに bin/​ ディレクトリを追加し、bin/warmup​ ファイルを作成します。そのファイルをお気に入りのエディタで開き、次のコードを追加します。

until $(curl -o /dev/null -s -I -f http://localhost:$PORT); do
  sleep 5
done

これにより、このスクリプトは何らかのリクエストを送信する前に、メインプロセスが起動して $PORT​ にバインドされるまで確実に待機するようになります。

次に、リクエストを送信するために、次のコードを追加します。

for ROUTE in $WARMUP_ROUTES; do
  echo "[warmup] calling $ROUTE"
  curl -L "http://localhost:$PORT$ROUTE" >/dev/null 2>&1
done

このコードは、$WARMUP_ROUTES​ 環境設定で定義されているルートに 1 つのリクエストを送信します。これは、次のように設定できます。

$ heroku config:set WARMUP_ROUTES="/ /hello /db"

これにより、ウォームアップリクエストが /​、/hello​、/db​ の 3 つの異なるルートに送信されます。この設定をアプリケーションのルートに合わせてカスタマイズする必要があります。ユーザーによっては、ウォームアップ専用の特殊なルートを追加する場合があります。アプリケーション固有のロジックを実行する必要はありませんが、それが役立つこともあります。

ルートを選択した後、このスクリプトを Procfile​ に追加する必要があります。

ウォームアップスクリプトの有効化

bin/warmup​ スクリプトを使用するには、web​ プロセスの既存の Procfile​ コマンドを、それに sh bin/warmup &​ プレフィックスを追加することによって変更します。たとえば、次のようにします。

web: sh bin/warmup & java -jar my-app.jar

これにより、ウォームアップスクリプトがバックグラウンドで、java​ プロセスがフォアグラウンドで起動されます。

Windows をローカルで実行している場合は、heroku local​ を実行してもこのスクリプトが動作しないことに注意してください。これは (Heroku 上のものと同様に) Linux プラットフォームに固有です。この場合は、Procfile.windows​ を作成し、heroku local -f Procfile.windows​ を実行してそれをコマンドに追加する必要があります。Windows Procfile には、web:​ エントリの java​ コマンドのみが含まれます。

これが完了したら、変更を Git に追加して再デプロイします。

$ git add bin/warmup Procfile
$ git commit -m "warmup"
$ git push heroku master

アプリは再起動すると、通常どおりに動作しますが、ログにいくつかの [warmup]​ ステートメントが表示されます。これは、前に定義したルートに対応しています。

この方法で設定されたアプリケーションの完全な例は、Github 上のサンプルアプリ​で見つけることができます。

ウォームアップスクリプトのカスタマイズ

bin/warmup​ スクリプトは Bash​ で記述されているため、数行のコードを記述することによってカスタマイズできます。

たとえば、ウォームアップリクエストを複数回繰り返す場合は、curl​ コマンドの前後に for​ ループを追加することができます。次に例を示します。

for i in {1..10}; do
   curl ...
done

各ウォームアップリクエストを数百回繰り返すことも妥当ですが、通常は必要ありません。

より堅牢なウォームアップスクリプトを作成したい場合は、Bash 以外の言語を使用できます。Ruby と Python はどちらも Cedar スタック​で使用でき、この目的で単純な JVM アプリを記述することもできます。

参考情報

上級ユーザーは、ジャストインタイムコンパイルがアプリケーション向けにより適切に最適化され、それによってウォームアップ時間が改善されるように JVM を設定することもできます。このための優れたリソースは、Scott Oaks による「Java Performance: The Definitive Guide​」です。

Heroku の Java サポート​についての詳細は、Dev Center を参照してください。

関連カテゴリー

  • Working with Java
Webapp Runner を使用した Tomcat ベースの Java Web アプリケーションのデプロイ Java アプリケーションの HTTP ポートの設定

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2025 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices