ホームページ  >  記事  >  Java  >  Javaメモリオーバーフローの原因と解決策は何ですか?

Javaメモリオーバーフローの原因と解決策は何ですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-06-15 13:44:127076ブラウズ

Javaメモリオーバーフローの原因と解決策は何ですか?

#Java メモリ オーバーフローの原因と解決策は何ですか?

Java メモリ オーバーフローの原因と解決策は次のとおりです。

最初のタイプのメモリ オーバーフローは誰もが最も考えていることであり、最初の反応は次のとおりです。それは、メモリ オーバーフローはスタック オーバーフローです:

それでは、スタック オーバーフローとはどのような状況でしょうか?次のキーワードが表示された場合、それはスタック オーバーフローです:

java.lang.OutOfMemoryError: ......java heap space....

これは、何かが表示されたときです。ヒープ関連の場合はスタックオーバーフローでしょう コードに問題がなければ-Xmxや-Xmsを適当に調整することで回避できますが、コードに問題がないことが前提となります。オーバーフローしていますか? コードに問題があるか、アクセス数が多すぎて各アクセス時間が長すぎるか、データが多すぎてデータが解放されないかのいずれかです。リサイクルされる前のゴミとは何か。ここではこれらのことは考慮されません。ゴミなので当然リサイクルされません。アイデアがあふれる前に、システムが事前にエラーを報告する可能性があります。キーワードは:

java.lang.OutOfMemoryError:GC オーバーヘッド制限を超えました

この種の状況は、システムが高頻度の GC 状態にあり、リサイクル効果が依然として低い場合に、このエラーが開始されます。この状況は通常、参照の不適切な使用が原因であるか、または大きなオブジェクトの適用が原因である可能性がありますが、Java ヒープ領域のメモリ オーバーフローにより、これが報告されない可能性があります。つまり、高頻度 GC ではなく、メモリ不足が直接の原因である可能性があります。

2 番目のタイプのメモリ オーバーフローです。PermGen がオーバーフローするか、PermGen がいっぱいになると、次のようなキーワードが表示されます。 :

重要な情報は次のとおりです:

java.lang.OutOfMemoryError: PermGen space

理由: システムに大量のコードがあるか、多くのサードパーティを参照していますパッケージ、またはコード内で多数の定数が使用されているか、インターンや動的コードのロードなどを通じて定数が挿入されているため、定数プールの拡張につながりますが、JDK 1.5 以降では永続ゾーンを使用できます。設定を通じてリサイクルされますが、私たちが望んでいるのは、この場所で GC が実行されないことです。それで十分です。したがって、一般的に言えば、今年は同様の操作はあまり行わないため、この状況に直面したときに一般的に使用される方法は次のとおりです。オーバーフローと -XX:MaxPermSize のサイズ。

3 番目のタイプのメモリ オーバーフロー: ByteBuffer で assignDirect() を使用するときに使用され、多くの javaNIO フレームワークは他のメソッドとしてカプセル化されます

オーバーフロー キーワード:

java.lang.OutOfMemoryError : ダイレクトバッファメモリ
クリアせずに ByteBuffer の assignDirect メソッドを直接または間接的に使用した場合も同様の問題が発生します 通常のリファレンスプログラムの IO 出力 ダイレクトメモリに相当するカーネルモードとユーザーモード間の変換処理が存在します従来のアプリケーションでファイルの内容をクライアントに出力したい場合、OSのダイレクトメモリ変換を介してプログラムの間接メモリにファイルをコピーする必要がありました。ヒープ)、ダイレクト メモリに出力し、オペレーティング システムによって送信されます。ダイレクト メモリは、OS とアプリケーションによって共同で管理されます。非ダイレクト メモリは、アプリケーション自体によって直接制御できます。JVM ガベージ コレクション ダイレクト メモリ内のメモリメモリは回収されないので注意してください。

同様の操作が頻繁に発生する場合は、パラメータの設定を検討してください: -XX:MaxDirectMemorySize

4 番目のタイプのメモリ オーバーフロー エラー:

Overflow キーワード:

java.lang.StackOverflowError

このパラメータは、-Xss が小さすぎるという 1 つのことを直接説明しています。多くのローカル コール スタック ニードルおよびその他のコンテンツが、ユーザーが現在保持しているスレッドに格納されるように適用されます。スレッド jdk 1.4 より前のデフォルトは 256K、1.5 以降は 1M でした。このエラーが報告された場合、それは -Xss 設定が小さすぎることを意味するだけです。もちろん、一部のメーカーの JVM にはこのパラメータがありません。これこの記事はホットスポット VM のみを対象としていますが、必要に応じて、-Xss の値が使用できるようにシステムを最適化できます。

5 番目のタイプのメモリ オーバーフロー エラー:

オーバーフロー キーワード:

java.lang.OutOfMemoryError: 新しいネイティブ スレッドを作成できません

4 番目のタイプこのようなオーバーフローエラーは、スレッドのメモリ領域について説明しましたが、実際には、スレッドは基本的にヒープの外側のメモリ領域しか占有しません。つまり、このエラーは、ヒープ以外の領域以外のメモリ領域を使用できないことを意味します。これは、メモリ自体が不足しているか、ヒープ領域が大きく設定されすぎてメモリがあまり残っておらず、スレッド自体がメモリを占有するため十分ではないためです。について説明し、その変更方法について説明します。これ以上言う必要はありません。おわかりでしょう。

6 番目のタイプのメモリ オーバーフロー:

オーバーフロー キーワード

java.lang.OutOfMemoryError: スワップ外の {} バイトのリクエスト {} バイト

これクラスエラーは通常、アドレス空間の不足が原因で発生します。

一般的なオーバーフローの 6 つの主要なカテゴリが、JVM のオーバーフロー状況の 99% を占めています。物理メモリ ハードウェアによるコード キャッシュの障害など、非常に奇妙な障害が発生しない限り、これらのオーバーフロー状況から抜け出すことは非常に困難です。エラー (バイト コードからネイティブ コードへの変換のプロセスで発生しますが、確率は非常に低いです)、この場合、メモリは直接クラッシュし、スワップの頻繁な相互作用と同様に、一部のシステムでは、システムがOS のアドレス空間が十分でない場合、システムはまったく起動できません (笑)、JNI を乱用すると、ローカル メモリが解放できなくなるなどの問題も発生するため、JNI を避けるようにしてください。ソケットでソケットを開きすぎると、接続データは次のような内容も報告します: IOException: 開いているファイルが多すぎますおよびその他のエラー メッセージ。

推奨チュートリアル: 「Java ビデオ チュートリアル

以上がJavaメモリオーバーフローの原因と解決策は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。