Webアプリの性能やメモリ関連の問題を、コーディング時に回避:Java Review(2/2 ページ)
アプリケーションの“作り”が悪いと、Webシステムの運用時に性能やメモリ関連の問題が発生する原因となる。今回は、Javaアプリケーション作成時に留意しておくべき基本的なポイントについて紹介する。
不要なオブジェクトを生成していないか?
次に、Javaアプリケーション内で不要なオブジェクトを生成していないかを見直そう。例えば、ログの出力時に、ログの出力レベルを考慮しないでログ出力データのオブジェクトを大量に生成してしまうと、Copy GCが多発し、パフォーマンスの低下に繋がる。オブジェクト生成については、不要なオブジェクトはできるかぎり生成しないことを念頭においてコーディングしよう。
また、オブジェクトの生成を抑えるためには、キャッシュしておいて再利用するという方法もある。ただし、オブジェクトを再利用する場合は、過度なキャッシュをしないよう留意してほしい。これは、キャッシュが多過ぎるとオブジェクトの生存期間が長くなってしまい、メモリに影響が出てしまうからだ。Java VMの高速化によって、実はオブジェクト生成の処理はそれほど重くない。キャッシュする場合は、例えば初期化処理が非常に重いときだけに限定すれば、メモリも適切に使用され、システムのパフォーマンスを改善できる。
アプリケーションの処理がシステムに対して間接的に影響を及ぼす例
Webシステムの運用を始めてから、アプリケーションの処理がシステムに対して間接的に影響を及ぼすこともある。ここでは、次に示す事象が発生したときの、原因と対処方法について紹介する。
事象 業務ピークのタイミングで、ファイルディスクリプタが枯渇してI/O処理ができなくなりエラーが発生した。ただし、しばらくするとエラーは発生しなくなり、回復するといった現象が断続的に発生する。
原因 Java.lang.Object#finalize()メソッドをオーバライドしているクラスのインスタンスはGCのタイミングで、Java VMによってファイナライズ対象としてキューに入れられる。ファイナライズ対象のオブジェクトはキューイングされたあとで、別スレッド(finalizerスレッド)によってファイナライズ処理が実行される。通常、finalizerスレッドは1つだけであるため、ファイナライズ処理は順番に実行されていくが、ファイナライズ処理に時間が掛かるオブジェクトが1つでもあると、処理全体が滞留する。
この事象の場合のアプリケーションでは、ファイナライズ処理でOSのリソースを解放される作りになっていたため、ファイナライズ処理の滞留によってリソースが解放されなかった(ファイルディスクリプタが枯渇した)。
さらに、ファイナライズ対象のオブジェクトがキューイングされている間はGCで解放されないため、量が増えるとメモリ不足にもつながる。
対処方法 まず考えられる方法は、Java SEのjava.lang.System#runFinalizationメソッドの使用だ。ユーザーアプリケーション側でこのメソッドを呼び出すと、明示的にfinalizerスレッドが生成される。これによってファイナライズ処理を促進できるので、「事象」にあるファイルディスクリプタの枯渇をユーザーアプリケーション側で回避できるのだ。
だが、この方法ではアプリケーション開発者側でファイナライズ処理を呼び出すための作り込みが必要である。また、アプリケーションからの制御では、処理が滞留し始めたタイミングで確実に呼び出されるとは限らない。例えば日立のCosminexusでは、ファイナライズ処理が滞留したときに、適切にファイナライズ処理を促進する機能―ファイナライズ滞留解消機能をアプリケーションサーバで提供している。この機能には、Java VMで定期的にファイナライズ処理を監視するための機構がサポートされている。ファイナライズ処理の監視中にfinalizerスレッドの処理遅延や、ファイナライズ処理のキューの滞留を検知すると、ファイナライズ処理を促進し、処理の滞留を解消するのだ。
ファイナライズ滞留解消機能を利用するメリットは、アプリケーションサーバの機能としてデフォルトで使用できるところにある。この機能を使用すれば、アプリケーション開発者は、ファイナライズ処理の滞留を意識する必要はないのだ。
コラム:2009年度のグッドデザイン賞を受賞したCosminexus
Cosminexusが今年のグッドデザイン賞を受賞。領域は「仕事領域― 産業・企業向けサービスシステム」となる。審査員による選評は以下の通り。
オフィスで働くワーカーにとってのルーティン業務というのはムダ、ムラ、ムリが生じていても発見しにくい。というのは、物理的な製品を製造していたラインと違って、改善の対象が目視で判断が利かないからである。日立製作所が提案するこのプラットフォームは、頭脳労働者が作業をする際に残す仕事の形跡をログ集計しながら、改善のきっかけを発見する実践的な試みである。マニュアルの検索→実際の作業→ログ集計→改善のきっかけの発見→修正マニュアルの提案→トライアル実施→ログ集計といったように、スパイラル状に業務が改善されるようになっているところが良い。
企業向け情報を集約した「ITmedia エンタープライズ」も併せてチェック
Copyright © ITmedia, Inc. All Rights Reserved.