メモリオーバーフローのいくつかの可能性
2362 ワード
JAva.lang.OutOfMemoryErrorこのエラーは、ほとんどの開発者が遭遇したことがあると信じています.このエラーの原因の多くは、JVMのメモリが小さすぎて、プログラムが厳密ではなく、ゴミが多すぎるためです.
OutOfMemoryError異常を引き起こす一般的な原因は次のとおりです.
メモリにロードされたデータの量が大きすぎて、一度にデータベースからデータを取り出しすぎたりします.
コレクションクラスにはオブジェクトへの参照があり、使用後は空になっていないため、JVMは回収できません.
コードには、デッドループまたはループが重複しすぎたオブジェクトエンティティが存在します.
使用するサードパーティ製ソフトウェアのBUG
起動パラメータのメモリ値設定が小さすぎる.
このエラーに関する一般的なエラーメッセージ:
tomcat:java.lang.OutOfMemoryError: PermGen space
tomcat:java.lang.OutOfMemoryError: Java heap space
weblogic:Root cause of ServletException java.lang.OutOfMemoryError
resin:java.lang.OutOfMemoryError
java:java.lang.OutOfMemoryError
Java.lang.OutOfMemoryErrorを解決する方法は次のとおりです.
一、jvmのメモリサイズを増やす.方法は、1)あるclassファイルを実行するときにjava-Xmx 256 M aa.classを使用してaa.classを実行するときにjvmが許容する最大メモリ256 Mを設定できます.2)tomcatコンテナでは、起動時にjvmにメモリ限度を設定できます.tomcatの場合、catalina.batに次の項目を追加できます.
または%CATALINA_をOPTS%と%JAVA_OPTS%代替-Xms 128 M-Xmx 256 M
3)resinコンテナでも、起動時にjvmにメモリ限度を設定できます.binフォルダの下にstartup.batファイルを作成します.内容は次のとおりです.
「-Xms 128 M」が最小メモリ、「-Xmx 256 M」が最大メモリです.
二、プログラムを最適化し、ゴミを放出する.
主にデッドサイクルを避けることを含んで、直ちに種の資源を解放すべきです:メモリ、データベースの各種の接続、一度に多すぎるデータをロードすることを防止します.Java.lang.OutOfMemoryErrorの根本的な原因はプログラムが丈夫ではないことです.したがって,Javaメモリオーバーフローを根本的に解決する唯一の方法は,プログラムを修正し,無駄なオブジェクトをタイムリーに解放し,メモリ空間を解放することである.このエラーに遭遇したときはプログラムをよくチェックして、へへ、このような問題に遭遇した後、後でプログラムを書くと気をつけます.
JavaコードによるOutOfMemoryErrorエラーの解決:
以下の点を重点的に調べる必要があります.
コードにデッドループまたは再帰呼び出しがあるかどうかを確認します.
大きなループが重複して新しいオブジェクトエンティティが生成されているかどうかを確認します.
データベース・クエリーで、すべてのデータを一度に取得したクエリーがあるかどうかを確認します.一般的に、一度に10万個のレコードをメモリに記録すると、メモリオーバーフローを引き起こす可能性があります.この問題は比較的に隠れていて、オンラインになる前に、データベースの中でデータが少なくて、問題が発生しにくくて、オンラインになった後に、データベースの中でデータが多くなって、1回のクエリーはメモリのオーバーフローを引き起こす可能性があります.したがって、データベース・クエリーについては、できるだけページングでクエリーします.
リスト、MAPなどの集合オブジェクトが使用済みか、クリアされていないかをチェックします.List,MAPなどの集合オブジェクトには常にオブジェクトへの参照が存在し,これらのオブジェクトはGCで回収できない.
ごみ回収メカニズム:
OutOfMemoryError異常を引き起こす一般的な原因は次のとおりです.
メモリにロードされたデータの量が大きすぎて、一度にデータベースからデータを取り出しすぎたりします.
コレクションクラスにはオブジェクトへの参照があり、使用後は空になっていないため、JVMは回収できません.
コードには、デッドループまたはループが重複しすぎたオブジェクトエンティティが存在します.
使用するサードパーティ製ソフトウェアのBUG
起動パラメータのメモリ値設定が小さすぎる.
このエラーに関する一般的なエラーメッセージ:
tomcat:java.lang.OutOfMemoryError: PermGen space
tomcat:java.lang.OutOfMemoryError: Java heap space
weblogic:Root cause of ServletException java.lang.OutOfMemoryError
resin:java.lang.OutOfMemoryError
java:java.lang.OutOfMemoryError
Java.lang.OutOfMemoryErrorを解決する方法は次のとおりです.
一、jvmのメモリサイズを増やす.方法は、1)あるclassファイルを実行するときにjava-Xmx 256 M aa.classを使用してaa.classを実行するときにjvmが許容する最大メモリ256 Mを設定できます.2)tomcatコンテナでは、起動時にjvmにメモリ限度を設定できます.tomcatの場合、catalina.batに次の項目を追加できます.
set CATALINA_OPTS=-Xms128M -Xmx256M
set JAVA_OPTS=-Xms128M -Xmx256M
または%CATALINA_をOPTS%と%JAVA_OPTS%代替-Xms 128 M-Xmx 256 M
3)resinコンテナでも、起動時にjvmにメモリ限度を設定できます.binフォルダの下にstartup.batファイルを作成します.内容は次のとおりです.
@echo off
call "httpd.exe" "-Xms128M" "-Xmx256M"
:end
「-Xms 128 M」が最小メモリ、「-Xmx 256 M」が最大メモリです.
二、プログラムを最適化し、ゴミを放出する.
主にデッドサイクルを避けることを含んで、直ちに種の資源を解放すべきです:メモリ、データベースの各種の接続、一度に多すぎるデータをロードすることを防止します.Java.lang.OutOfMemoryErrorの根本的な原因はプログラムが丈夫ではないことです.したがって,Javaメモリオーバーフローを根本的に解決する唯一の方法は,プログラムを修正し,無駄なオブジェクトをタイムリーに解放し,メモリ空間を解放することである.このエラーに遭遇したときはプログラムをよくチェックして、へへ、このような問題に遭遇した後、後でプログラムを書くと気をつけます.
JavaコードによるOutOfMemoryErrorエラーの解決:
以下の点を重点的に調べる必要があります.
コードにデッドループまたは再帰呼び出しがあるかどうかを確認します.
大きなループが重複して新しいオブジェクトエンティティが生成されているかどうかを確認します.
データベース・クエリーで、すべてのデータを一度に取得したクエリーがあるかどうかを確認します.一般的に、一度に10万個のレコードをメモリに記録すると、メモリオーバーフローを引き起こす可能性があります.この問題は比較的に隠れていて、オンラインになる前に、データベースの中でデータが少なくて、問題が発生しにくくて、オンラインになった後に、データベースの中でデータが多くなって、1回のクエリーはメモリのオーバーフローを引き起こす可能性があります.したがって、データベース・クエリーについては、できるだけページングでクエリーします.
リスト、MAPなどの集合オブジェクトが使用済みか、クリアされていないかをチェックします.List,MAPなどの集合オブジェクトには常にオブジェクトへの参照が存在し,これらのオブジェクトはGCで回収できない.
ごみ回収メカニズム:
System.gc() Runtime.getRuntime().gc() JVM , , 。