GCに触れることなくJavaアプリケーションの一時停止に対処する方法

時々攻撃を受けるアプリケーションを修復するためにGCを何回設定する必要があり、その機能を一時的に実行しなくなりました。 作品は最も面白いものではなく、素材についての十分な知識が必要です。 このトピックでは、この問題を解決する方法が他にあることを説明します。



javaヒープが(アプリケーションの要件に応じて)数ギガ以上の場合、GC設定は役に立ちません。 CMS、JRocket、またはG1が100年にわたって開発されているとしても、この場合にあなたを救うものは何もありません。 いいえ、水平線上にはAzulの仮想Javaマシンが1つあります。 しかし、このソリューションには再び支払いが行われ、独自のハードウェアまたは仮想化が必要になり、オーバーヘッドが発生します。 気にする人は、私のポストGCチューニングへのコメントでもう少し読むことができます。 通常のJava開発者は、大量のメモリを必要とするアプリケーションを修復するために何ができますか?



もちろん、最初のことは、メモリリークがあるかどうかを調べることです。 たぶん、それらが非常に大きいか、メモリが非常に非効率的に使用されているため、リークを除去することで、問題を自動的に解決できます。



アプリケーションを定期的に再起動する機会がある場合、またはFull GCを呼び出すことができる時間間隔がある場合。 メモリを操作する特定のパターンを使用して、若い世代のサイズを小さく維持し、オブジェクトの適切なフローを古い世代に入れることができる場合、ヒープのサイズを、Old Genのアセンブリが発生する場合にのみ発生する値に増やすことができますあなたはそれを許可することができます。 しかし、このオプションは主流というよりはハッキングに似ています。



GCの一時停止を減らすためのもう1つの非常に一般的な手法は、アプリケーションを異なるJVMで実行される複数の部分に分割することです。 現在、ほとんどがこの道を進んでいます。 実際、これは、システムが疎結合であり、論理的に十分に共有されている場合に適したソリューションです。 しかし、なんらかの方法で配布を行うと、アーキテクチャが非常に複雑になり、相互作用が遅くなるため、どのアプリケーションにも適していません。



また、オプションとして、ヒッピーなものに書き込まれたリモートキャッシュを考慮することができます。 たとえば、memcached。 しかし、ここでも、以前のソリューションと同様に、分散システムとアプリケーションの速度低下が発生します。これは、オブジェクトをシリアル化してソケット経由で転送する必要があるためです。 それに加えて、通常のJavaプログラマーのサポートが困難になる可能性のある、Javaで記述されていないコンポーネントを取得します。



かなり長い間、考えられる解決策のリストはほとんどそこで終わり、Javaプログラマーは最初から残っていました。 しかし、最近、いわゆる直接バッファに基づくソリューションがますますポップアップし始めています。追加のメモリがJavaプロセス内で直接割り当てられ、ヒープの外側にある場合、アプリケーションを完全にJavaで記述することができるため、数十ギガバイトのメモリを使用して、発生する問題を回避できます配布時。 このアプローチの詳細については、 Java Off-Heap Cacheの記事をご覧ください。



また、このトピックに関する調査に参加してください。



All Articles