Javaアプリケーションはどのような要素で構成されているか
これまでは、Javaによって実現している部分を「Javaアプリケーション」としていましたが、問題発生時には、その構成要素のうちのどこに問題があり、どこに問題がないのかを切り分けないといけません。
Javaアプリケーションは、大きく「アプリケーション」と「Java仮想マシン」に分けられます(図1中央)。また、アプリケーションのアーキテクチャによっては、アプリケーションサーバ上でアプリケーションを動かします(図1右)。
アプリケーション~さまざまなリソースを使用してサービスを提供する
アプリケーションには、これまで紹介したWebアプリケーションだけではなく、バッチやマイクロサービスなど、さまざまな形態のものがあります。また、Javaだけではなく、JVM上で動作するさまざまな言語でアプリケーションが書かれるケースも増えてきています。
サービスを提供するために、アプリケーションは、データベースへの接続やビジネスロジックのオブジェクトなどさまざまなリソースを使用します。アプリケーション開発者は、アプリケーション内で使用したリソース量や処理した量などの情報を取得できるような仕組みを作成する必要があります。
フレームワークをいっさい使わないことは少なく、Java EEやSpring Frameworkなどを使用します。本連載では、アプリケーションにはフレームワークも含みます。
Java仮想マシン~アプリケーションの代わりにリソースを管理する
アプリケーションは、Java仮想マシン(JVM)によって実行されます。JVMは、アプリケーションに代わってリソースを管理することで、アプリケーションが効率よく動けるようにサポートします。アプリケーション開発者は、JVMがあることで、リソース管理などの責務から解放されます。
図2は、ネイティブアプリケーションとJavaアプリケーションでのメモリリソースの管理方法の違いを表したものです。この例で行われる処理は、オブジェクトを生成し、オブジェクトへメモリ領域を割り当て、オブジェクトが不要になると割り当てていた領域を解放して、メモリを再度使えるようにするものです。
JVMには、内部で管理しているリソースに関する情報を出力する方法がたくさんあります。JVMの情報で確認するのは、次のことです。
- アプリケーションが中断されることなく実行できているか?
- Java仮想マシンがリソースを使い過ぎていないか?
これらの情報の多くは、JVMの実行時引数(-XX:+~)などで取得の有効・無効を設定できます。
アプリケーションサーバ~汎用的な機能とリソースをアプリケーションへ提供する
アプリケーションサーバは、アプリケーションが実現しなくてはならない機能のうち、データベース接続の管理や障害時のフェイルオーバなど汎用的な機能をアプリケーションへ提供します。アプリケーション開発者は、アプリケーションサーバが提供するフレームワークに則って開発することで、サービスの機能的な部分に集中することができ、アプリケーションの開発効率を上げられます。
また、アプリケーションサーバはアプリケーションとリソースを疎結合にすることで、リソースの管理を容易にします。アプリケーションサーバはリソースを管理してアプリケーションへ提供し、アプリケーションはアプリケーションサーバが提供するリソースを借りて使用します。多くのアプリケーションサーバは、アプリケーション内で使用するリソースや処理量などの情報を取得するための機能を持っています。
図3はデータベースのコネクション管理をアプリケーションが行う例(図左)と、アプリケーションサーバが行う例(図右)です。アプリケーションがコネクションを管理すると、アプリケーションの起動停止とDBへの接続/切断が同じタイミングになったり、アプリケーションの内部にデータベースサーバの設定が含まれるため環境によって異なる設定ファイルをアーカイブしなければならずにメンテナンス性が乏しくなるなど、アプリケーション開発者とインフラ開発者の仕事が混ざってしまい、管理が難しくなります。一方、アプリケーションサーバがコネクションを管理すると、インフラ開発者によってデータベースのコネクションを構築・テストしてからアプリケーションをデプロイ/起動できるため、コネクションの管理が容易になります。
次回は、問題を切り分けるためにそれぞれのレイヤーでどのように情報を取得すればいいのかをご紹介します。