1

重複の可能性:
ubuntuのjvmプロセスメモリを制限する

私のアプリケーションでは、ドキュメントをサーバーにアップロードしています。サーバーはそれを分析します。

今日は、jconsole.exeとヒープダンプを使用してアプリケーションを分析し、メモリの問題やメモリリークが発生していないかどうかを調べました。アプリケーションの実行中にアプリケーションがRAM上で非常に大きくなるため、1つ問題が発生する可能性があると思いました。

いくつかの実行後にjconsoleでヒープ/コードキャッシュ/パーマ生成などのメモリを見ていたので、次のことを見て驚いた。

小切手

画像リンク:https ://www7.pic-upload.de/13.06.12/murk9qrka8al.png

右側のjconsoleでわかるように、ヒープは、分析関連の処理を行っているときに増加していますが、作業が終了すると、通常のサイズに再び減少しています。左側には、アプリケーションがデプロイされているサーバーの「htop」が表示されます。RAMは正常に動作し、ガベージコレクターは正しく実行されているように見えますが、ほぼ3.2GBと非常に高くなっています。

これは今、私を本当に混乱させています。私のJavaVMスタックがこれで何かをしなければならないのではないかと考えていましたか?私はいくつかの調査を行い、私が見つけたものは、わずか数メガバイト(またはわずかkb)の小さなメモリとしてのvmスタックについて話しました。

私の技術的背景:

  • アプリケーションはglassfishv.3.1.2で実行されています
  • データベースはMySQLで実行されています
  • HibernateはORMフレームワークとして使用されます
  • Javaバージョンは1.7.0_04です
  • VAADINを使用して実装されています
  • このサーバーで実行されているのはMySQLデータベースとGlassfishだけです。
  • 分析中にJAXBを使用してXML-DOMスタイルのドキュメントを作成し、データベースに保存しています
  • アップロードされるドキュメントは、.txtファイルまたは.pdfファイルのいずれかです。
  • OSはLinuxです

解決?

なぜこれが起こるのか、そしてそれを修正するために私ができることについて何か考えがありますか?メモリの問題は、ヒープが爆発する原因となるメモリリークが原因であると思っていたので、現時点では本当に驚いています。しかし、今では、ヒープは問題ではありません。ヒープが同じレベルにある間、RAMがどんどん高くなります。そして、私はそれを解決するために何をすべきかわかりません。

あなたが私と共有しているすべての考えに感謝します。

編集:たぶん、この振る舞いが現在、他の人に私のアプリケーションを実際に使用させることを不可能にしていることも述べておく必要があります。RAMがいっぱいになり、サーバーが応答しなくなったとき、私は外出します。

Edit2:さらに分析が成功するたびに、このRAMが増え続けることも付け加えておきます。

4

1 に答える 1

1

JVM実装でメモリを使用するものは、ヒープ設定よりもはるかに多くあります。

を介したヒープ設定は、Javaヒープのみを制御し、JVMによるネイティブメモリ-Xmxの消費は制御しません。JVMは、実装に基づいてまったく異なる方法で消費されます。

次の記事からメモリをありがとう(JVMがWindowsおよびLinuxでネイティブメモリをどのように使用するかを理解する)

ヒープとガベージコレクターを維持するには、制御できないネイティブメモリを使用します。

Javaヒープを維持するメモリ管理システムの状態を維持するには、より多くのネイティブメモリが必要です。空きストレージを追跡し、ガベージを収集する際の進行状況を記録するには、データ構造を割り当てる必要があります。これらのデータ構造の正確なサイズと性質は実装によって異なりますが、多くはヒープのサイズに比例します。

JITコンパイラはネイティブメモリを使用しjavacます

バイトコードのコンパイルではネイティブメモリを使用しますが(gccなどの静的コンパイラが実行にメモリを必要とするのと同じ方法で)、JITからの入力(バイトコード)と出力(実行可能コード)の両方をネイティブメモリに格納する必要があります。多くのJITコンパイル済みメソッドを含むJavaアプリケーションは、小さなアプリケーションよりも多くのネイティブメモリを使用します。

次に、ネイティブメモリを使用するクラスローダーがあります

Javaアプリケーションは、オブジェクト構造とメソッドロジックを定義するクラスで構成されています。また、Javaランタイムクラスライブラリ(java.lang.Stringなど)のクラスを使用し、サードパーティのライブラリを使用する場合があります。これらのクラスは、使用されている限り、メモリに保存する必要があります。クラスの保存方法は、実装によって異なります。

スレッドに関するセクションの引用も開始しません。JVM実装でメモリを消費するのはJavaヒープだけではなく、すべてがJVMヒープに入るわけではなく、ヒープが優先されるという考えが得られると思います。管理およびブックキーピング用に指定したものよりも多くのネイティブメモリ。

ネイティブコード

多くの場合、アプリケーションサーバーには、JVMの外部で実行されるネイティブコードがありますが、アプリサーバーを制御するプロセスに関連付けられたメモリとしてOSに表示されます。

于 2012-06-13T21:56:37.210 に答える