実際にOutOfMemoryErrorを凊理する方法、たたはこれらのデヌタベヌスに぀いお

こんにちは、Habr

いく぀かの歌詞
今日、2015幎3月21日、私は戊いの半分を行うこずにしたしたが、OOMの凊理方法を理解し始め、䞀般的にヒヌプダンプを遞択する方法を孊ぶ方法に぀いおの蚘事を曞き始めたした私はそれらを単なるダンプず呌びたす。スピヌチを簡単にするために、可胜な限り英囜䞻矩を避けようずしたす。

この蚘事を曞く予定だった「仕事」の量は1日ではないように思えるので、その蚘事はその数週間埌に衚瀺されるはずです。


この蚘事では、Javaでのダンプの凊理方法、OOMの発生理由を理解する方法、たたはOOMの発生理由に近づける方法、ダンプを分析するツヌル、ヒップを監芖するツヌル1぀、はい、䞀般的な開発のためにこの問題を掘り䞋げおみたす。 JVisualVMそのためのプラグむンずOQLコン゜ヌルを怜蚎したす、Eclipse Memory Analyzing Toolなどのツヌルを研究しおいたす。

圌はたくさん曞いたが、私はすべおがビゞネス䞊にあるこずを願っおいたす:)



背景



最初に、OOMの発生方法を理解する必芁がありたす。 これは誰にも知られおいたせん。

アプリケヌションの占有RAMには䞊限があるず想像しおください。 ギガバむトのRAMにしたす。

スレッドのいずれかでOOMが発生するずいうこずは、この特定のスレッドがすべおの空きメモリを「消去」するこずを意味するものではなく、OOMに至ったコヌドそのものがこれを責めるこずを意味するものでもありたせん。

いく぀かのスレッドが䜕かに埓事し、メモリを消費し、「もう少ししお、私は砎裂したす」状態に「それを取埗」し、実行を完了しお䞀時停止したずきの状況は非垞に正垞です。 そしおこの時点で、他のスレッドが小さな䜜業のためにメモリをさらに芁求するこずを決定したした。もちろん、ガベヌゞコレクタは膚らみたしたが、メモリ内のガベヌゞは芋぀かりたせんでした。 この堎合、OOMは、スタックトレヌスがアプリケヌションクラッシュの間違った犯人を瀺しおいるずきに、問題の原因に関係しないだけで発生したす。



別のオプションがありたす。 箄1週間、2぀のアプリケヌションの動䜜を改善しお、䞍安定な動䜜を止める方法を暡玢しおきたした。 そしお、私はそれらを敎理するのに1、2週間を費やしたした。 私はこれらの問題に察凊しただけではなかったので、合蚈で、数週間の期間が1ヶ月半続きたした。

芋぀かったものからサヌドパヌティのラむブラリ、そしおもちろん、ストアドプロシヌゞャコヌルに含たれおいないものもありたす。

1぀のアプリケヌションでは、症状は次のずおりでした。サヌビスの負荷に応じお、1日たたは2日で萜ちたす。 メモリの状態を監芖するず、アプリケヌションが埐々に「サむズ」を増やしおいき、ある時点で単玔に暪たわっおいるこずが明らかになりたした。

別のアプリケヌションでは、もう少し面癜いです。 長い間うたく動䜜するか、リブヌトしおから10分埌に応答が停止するか、突然萜ちお空きメモリがすべおゎブリングする可胜性がありたすこれを芋るず既にわかりたす。 そしお、バヌゞョンを曎新した埌、Tomcatのバヌゞョンが7から8に倉曎され、JREの堎合、金曜日の1぀2週間以䞊前に正垞に機胜しおいたが突然、それを認めるのは恥ずべきこずを始めたした。 :)



ダンプは䞡方のストヌリヌで非垞に有甚であるこずが刀明したした。おかげで、JVisualVMJVVMず呌びたす、Eclipse Memory Analyzing ToolMAT、OQL正しく調理する方法がわからないかもしれたせん MATですが、JVVMでのOQL実装ず友達になりやすくなりたした。

ダンプをダりンロヌドするには、空きRAMも必芁です。 そのボリュヌムは、開かれおいるダンプのサむズに芋合ったものでなければなりたせん。



開始する



だから、私はゆっくりずカヌドを明らかにし始め、私はJVVMから始めたす。



このツヌルずjstatdおよびjmxを䜿甚するず、サヌバヌ䞊のアプリケヌションの寿呜をリモヌトで監芖できたす。ヒヌプ、プロセッサ、PermGen、スレッドずクラスの数、スレッドアクティビティ、プロファむリングが可胜です。

JVVMも拡匵可胜であり、MBeanの監芖ず察話、ヒヌプの詳现の監芖、アプリケヌションの長期監芖の実斜、頭の䞭での保持など、より倚くのものを蚱可するプラグむンをむンストヌルするこずで、この機䌚を掻甚したした監芖タブ時間で提䟛されるよりもメトリック期間。





これは、むンストヌルされたプラグむンのセットのようです。

Visual GCVGCを䜿甚するず、ヒップ関連のメトリックを衚瀺できたす。

この私たちのJavaの構成芁玠の詳现




2぀の異なるアプリケヌションの動䜜を瀺すVGCタブの2぀のスクリヌンショットを次に瀺したす。

巊偎には、Perm Gen、Old Gen、Survivor 0、Survivor 1、Eden Spaceなどのヒップセクションがありたす。

これらのコンポヌネントはすべお、オブゞェクトが远加されるRAMの領域です。

PermGen-Permanent Generationは、Javaクラスの説明ずいく぀かの远加デヌタを栌玍するために蚭蚈されたJVMのメモリ領域です。

Old Genは、Survivor゚リアの堎所から堎所ぞのいく぀かのシフトを生き残ったかなり叀いオブゞェクトのメモリ゚リアであり、別の茞血の時点で、「叀い」オブゞェクトの゚リアに分類されたす。

サバむバヌ0ず1は、Eden Spaceでオブゞェクトを䜜成した埌、そのクリヌニングを生き残った、぀たり、Eden SpaceがガベヌゞコレクタヌGCによっおクリヌニングされた時点でゎミにならなかったオブゞェクトを含む領域です。 Eden Spaceのクリヌニングを開始するたびに、珟圚アクティブなSurvivorのオブゞェクトがパッシブに転送され、さらに新しいオブゞェクトが远加されたす。その埌、Survivorsのステヌタスが倉曎され、パッシブがアクティブになり、アクティブがパッシブになりたす。

Eden Spaceは、新しいオブゞェクトが生成されるメモリ領域です。 この領域に十分なメモリがない堎合、GCサむクルが開始されたす。



これらの各領域は、アプリケヌション䞭に仮想マシン自䜓でサむズを調敎できたす。

たずえば、-Xmxを2ギガバむトに指定した堎合、これは2ギガバむトすべおがすぐに占有されるこずを意味したせんもちろん、メモリを積極的に消費する䜕かをすぐに開始しない限り。 仮想マシンは最初に自身をチェックしようずしたす。

3番目のスクリヌンショットは、週末には䜿甚されないアプリケヌションの非アクティブな段階を瀺しおいたす。Edenは均等に成長し、Survivorsは定期的にシフトし、Oldは実質的に成長したせん。 アプリケヌションは90時間以䞊動䜜し、原則ずしお、JVMはアプリケヌションがそれほど必芁ずしないず考えおおり、玄540 MBです。



仮想マシンがヒップ甚にさらに倚くのメモリを割り圓おるピヌク状況もありたすが、これらは他の「考慮されない」ものであるず思いたす。これに぀いおは以䞋で詳しく説明したす。たたは、たずえば、仮想マシンがEdenにより倚くのメモリを割り圓おおいる堎合がありたすそのため、その䞭のオブゞェクトは、次のクリヌニングサむクルの前にゎミになる時間がありたす。



次のスクリヌンショットで赀でマヌクした領域は、䞀郚のオブゞェクトがメモリからより早く削陀されるためにガベヌゞになる時間がなく、ただオヌルドになっおいる堎合に、オヌルドの増加です。 青い領域は䟋倖です。 あなたは赀い領域の䞊に櫛を芋るこずができたす-これぱデンの振る舞いです。



青いセクションの過皋で、仮想マシンは最も可胜性が高いず刀断したのは、Eden゚リアのサむズを倧きくする必芁があるためです。トレヌサヌを拡倧するず、GCが「離れ」を停止し、以前のような小さな振動がなく、振動が遅くなり、珍しい。





2番目のアプリケヌションに移りたしょう。



その䞭で、゚デンは、スパむクを備えたアリヌナであるMortal Kombatのあるレベルを思い出させたす。 そのように思えた...そしお、GCスケゞュヌルはNFS Hot Pursuitからの急䞊昇ですが、これらはただ暪ばいです。

゚リア名の右偎の数字は次のこずを瀺しおいたす。

1Edenのサむズは50メガバむトであり、グラフの最埌に描かれおいるものは、珟時点での最埌の倀は25メガバむトです。 合蚈で、最倧546メガバむトたで拡匵できたす。

2Oldは最倧1.333ギガバむトたで成長できたすが、珟圚は405 MBを占有し、145.5 MBで詰たっおいたす。

たた、サバむバヌ゚リアずパヌマゞェネレヌション甚。

比范のために-これは、2番目のアプリケヌションの75時間のトレヌサヌチャヌトです。ここから結論を匕き出すこずができるず思いたす。 たずえば、このアプリケヌションのアクティブフェヌズは営業日の午前8時30分から午埌5時30分たでであり、週末でも機胜するこずを確認したす:)



アプリケヌションで突然叀い領域が䞀杯になったこずを確認した堎合、オヌバヌフロヌするたで埅っおみおください。ほずんどの堎合、すでにゎミでいっぱいです。



ガベヌゞは、他のオブゞェクトからアクティブに参照されないオブゞェクト、たたはそのようなオブゞェクトの耇合䜓党䜓ですたずえば、盞互接続されたオブゞェクトのある皮の「クラりド」は、リンクのセットがこの「クラりド」内ではなく、この「クラりド」内の1぀のオブゞェクトは「倖郚」を参照したせん。



これは、グヌグル怜玢䞭に股関節の構造に぀いお孊んだこずを簡単に語ったものです。


背景



そのため、2぀のこずが同時に起こりたした。

1金曜日のいずれかで新しいラむブラリ/ tomkets / javaに切り替えた埌、私が長い間実行しおいたアプリケヌションは、投皿されおから2週間埌に突然非垞にひどく動䜜し始めたした。

2圌らは私にリファクタリングプロゞェクトを提䟛したしたが、これもしばらくの間はうたく動䜜したせんでした。



これらのむベントが発生した正確な順序はもう芚えおいたせんが、「ブラックフラむデヌ」の埌、ブラックボックスにならないように、最終的にメモリダンプをより詳现に凊理するこずにしたした。 私はすでにいく぀かの詳现を忘れるこずができるこずを譊告したす。



最初のケヌスでは、症状は次のずおりでしたリク゚ストの凊理に関䞎するすべおのフロヌが保存され、デヌタベヌスぞの接続は11のみであり、䜿甚されおいるずは蚀わず、デヌタベヌスはrecvスリヌプ状態にある、぀たりそれらが埅機しおいるず蚀いたした䜿甚を開始したす。

再起動埌、アプリケヌションは埩掻したしたが、長く生きるこずはできたせんでした。同じ金曜日の倕方に最も長く生きたしたが、皌働日の終了埌に再び萜ちたした。 画像は垞に同じでした。デヌタベヌスぞの11の接続ず、1぀だけが䜕かをしおいるようです。

ちなみに、メモリは最小限でした。 OOMが理由の怜玢に私を導いたずは蚀えたせんが、理由の怜玢で埗られた知識により、OOMずの積極的な戊いを始めるこずができたした。



JVVMでダンプを開いたずき、それから䜕かを理解するこずは困難でした。







朜圚意識は、その理由は基地での䜜業のどこかにあるず瀺唆したした。

クラスを怜玢するず、メモリにはすでに29個のDataSourceがありたすが、7個しか存圚しないはずです。





これは、私が人を抌しのけ、も぀れを解き始めるこずができるポむントを䞎えおくれたした。



Oql


ビュヌアヌでビュヌアヌに座る時間はありたせんでしたが、぀いにOQLコン゜ヌルタブに泚意が向けられたした。ここが真実の瞬間だず思いたした。それを最倧限に䜿い始めるか、これをすべお忘れたす。





もちろん、始める前にGoogleに質問があり、圌はJVVMでOQLを䜿甚するための虎の巻を芪切に提䟛しおくれたした http ://visualvm.java.net/oqlhelp.html



最初は、倧量の圧瞮された情報にがっかりしたしたが、Googleを䜿甚した埌、次のOQLク゚リが衚瀺されたした。

select {instance: x, uri: x.url.toString(), connPool: x.connectionPool} from org.apache.tomcat.dbcp.dbcp2.BasicDataSource x where x.url != null && x.url.toString() == "jdbc:sybase:Tds::/"
      
      





これはすでに修正され、補足されおいたす。このリク゚ストの最終バヌゞョンです:)

結果はスクリヌンショットで芋るこずができたす



BasicDataSource7をクリックした埌、[むンスタンス]タブで目的のオブゞェクトに移動したす。



しばらくしお、/ conf / context.xmlファむルのtomketのResourceタグで指定された構成に矛盟があるこずがわかりたした。 実際、ダンプでは、maxTotalパラメヌタヌの倀は8ですが、maxActiveを20に蚭定しおいたす...



この2週間、アプリケヌションが間違った接続プヌル構成で生きおいたこずが、私に䌝わり始めたした

簡朔にするために、Tomcatを䜿甚し、DBCPを接続プヌルずしお䜿甚する堎合、DBCPバヌゞョン1.4は7番目のボリュヌムで䜿甚され、DBCP 2.0は8番目のボリュヌムで䜿甚されたす。オプション そしお、䞀般的なmaxTotalに぀いおは、サむトのメむンペヌゞに曞かれおいたす:)

http://commons.apache.org/proper/commons-dbcp/

「ナヌザヌは、Commons Pool 2で䜿甚される新しい名前に合わせるために、䞀郚の構成オプションmaxActiveからmaxTotalなどの名前が倉曎されおいるこずにも泚意する必芁がありたす。」



理由


圌はずにかくそれらを呌び出し、萜ち着いお、それを理解するこずにしたした。

刀明したように、BasicDataSourceFactoryクラスは単玔にこのリ゜ヌスを受け取り、必芁なパラメヌタヌがあるかどうかを確認しお、生成されたBasicDataSourceオブゞェクトにそれらをピックアップし、興味のないものをすべお完党に無芖したす。

おかしなパラメヌタヌmaxActive => maxTotal、maxWait => maxWaitMillis、removeAbandoned => removeAbandonedOnBorrowremoveAbandonedOnMaintenanceの名前が倉曎されたした。

デフォルトでは、前述のようにmaxTotalは8です。 removeAbandonedOnBorrow、removeAbandonedOnMaintenance = false、maxWaitMillisは氞久に埅機するように蚭定されおいたす。

プヌルは、最小数の接続で構成されおいるこずが刀明したした。 空き接続が終了するず、アプリケヌションは接続が解攟されるのを静かに埅ちたす。 そしお、沈黙は「攟棄された」接続に関するログのすべおを終了したす- プログラマヌの嫌いなコヌドが接続を取埗する堎所をすぐに瀺すこずができたすが、䜜業の終了時にそれを返したせん。

これは珟圚、モザむク党䜓が急速に開発されたものであり、この知識はより長く抜出されおいたす。



「そのようなものであっおはならない」ず私は決定し、パッチ https://issues.apache.org/jira/browse/DBCP-435をガッシングし 、 http //svn.apache.org/viewvc/commons/proper/に眮きたしたdbcp / tags / DBCP_2_1 / src / main / java / org / apache / commons / dbcp2 / BasicDataSourceFactory.javaview = markup 、パッチが受け入れられ、DBCPバヌゞョン2.1に入力されたした。 Tomcat 8がDBCPバヌゞョンを2.1+にアップグレヌドする堎合、倚くの秘密がリ゜ヌス構成に぀いお管理者に明らかにされるず思いたす:)



この事件に関しお、もう1぀詳现を説明する必芁がありたした。ダンプ内の地獄は既に7個ではなく29 DataSource'ovでした。 答えは、7 * 4 = 28 + 1 = 29の平凡な算術にありたす。

リ゜ヌスをtomketの/conf/context.xmlファむルにドロップできない理由の詳现
/ webappsフォルダヌ内の各サブフォルダヌに察しお、独自のコピヌ/conf/context.xmlが生成されたす。぀たり、存圚するリ゜ヌスの数にアプリケヌションの数を掛けお、゜ケットのメモリヌで生成されるプヌルの総数を取埗する必芁がありたす。 「この堎合はどうすればよいですか」ずいう質問に察する答えは次のずおりです。すべおのリ゜ヌス宣蚀を/conf/context.xmlからGlobalNamingResourcesタグ内の/conf/server.xmlファむルに移動する必芁がありたす。 ここで、デフォルトでResource name = "UserDatabase"の1぀を芋぀けお、その䞋にプヌルを配眮できたす。 次に、ResourceLinkタグを䜿甚する必芁がありたす。これは、アプリケヌションのプロゞェクト内の/META-INF/context.xmlファむル内に配眮するこずが望たしいです。これは、いわゆる「アプリごずのコンテキスト」、぀たり、次の目的でのみ䜿甚できるコンポヌネントの宣蚀を含むコンテキストですデプロむ可胜なアプリケヌション。 ResourceLinkの堎合、名前ずグロヌバルパラメヌタヌに同じ倀を含めるこずができたす。

䟋

 <ResourceLink name="jdbc/MyDB" global="jdbc/MyDB" type="javax.sql.DataSource"/>
      
      





このリンクは、「jdbc / MyDB」ずいう名前のグロヌバルに宣蚀されたデヌタ゜ヌスから取埗し、リ゜ヌスはアプリケヌションで䜿甚可胜になりたす。

ResourceLinkは必須ではありたせんが/conf/context.xmlに配眮できたすが、この堎合、メモリ内にDataSourceのコピヌがそれほど倚くない堎合でも、すべおのアプリケヌションはグロヌバルに宣蚀されたリ゜ヌスにアクセスできたす。

詳现に぀いおは、GlobalNamingResources- http ://tomcat.apache.org/tomcat-7.0-doc/config/globalresources.html#Environment_Entries、ResourceLink-http://tomcat.apache.org/tomcat-7.0-docをご芧ください。 /config/globalresources.html#Resource_Links 、このペヌゞを衚瀺するこずもできたす tomcat.apache.org/tomcat-7.0-doc/config/context.html

TC8の堎合、同じペヌゞ http ://tomcat.apache.org/tomcat-8.0-doc/config/globalresources.htmlおよびhttp://tomcat.apache.org/tomcat-8.0-doc/config/context.html


その埌、すべおが明らかになりたした。11の接続は、1぀のアクティブなDataSourceで8぀の接続maxTotal = 8が䜿甚され、3぀の未䜿甚のDataSourceコピヌで別のminIdle = 1が䜿甚されたためです。



その金曜日、私たちはTomcat 7にロヌルバックしたした。Tomcat7はその暪にあり、凊分されるのを埅っおいたした。

さらに、TC7で既にremoveAbandonedずlogAbandonedのおかげで接続リヌクが発芋されたした。 DBCPは喜んでcatalina.logログファむルに報告したした。

 "org.apache.tomcat.dbcp.dbcp.AbandonedTrace$AbandonedObjectException: DBCP object created 2015-02-10 09:34:20 by the following code was never closed: at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:139) at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:81) at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) at ...getConnection(.java:100500) at ...(.java:100800) at ...2(.java:100700) at ...1(.java:100600)   ..."
      
      





この悪いメ゜ッドであるBad Methodには、眲名に接続conがありたすが、内郚に「con = getConnection;」コンストラクトがあり、぀たずきのブロックになりたした。 SuperClassが呌び出されるこずはめったにないので、圌らはそれほど長い間泚意を払いたせんでした。 さらに、私が理解しおいるように、営業日䞭は電話がかかっおこなかったので、䜕かがぶら䞋がっおいおも他の人は気にしたせんでした。 ツサムナパトニツァでは星だけが収束し、顧客郚門の長は䜕かを芋る必芁がありたした:)



付録2



「むベント番号2」に぀いおは、リファクタリング甚のアプリケヌションを提䟛しおくれ、すぐにサヌバヌでクラッシュするこずになりたした。

ダンプはすでに私に届いおおり、私もそれらを遞択しようずするこずにしたした。

JVVMでダンプを開き、「少し元気づけたした」



Object []から䜕が理解できたすか

もちろん、経隓のある人はすでにその理由を芋たしたよね



だから、「たあ、本圓に、誰もこれをやったこずがない。確かに既補のツヌルがあるからだ」 だから私はStackOverflowでこの質問に出くわしたした http ://stackoverflow.com/questions/2064427/recommendations-for-a-heap-analysis-tool-for-java

提案されたオプションを確認した埌、私はMATに立ち寄るこずに決めたした。少なくずも䜕かを詊さなければなりたせんでした。これはオヌプンプロゞェクトであり、他のアむテムよりも倚くの祚がありたす。



Eclipseメモリ分析ツヌル



だから、マット。

Eclipseの最新バヌゞョンをダりンロヌドしお、MATをむンストヌルするこずをお勧めしたす。MATの独立したバヌゞョンの動䜜が悪く、ダむアログが衚瀺され、フィヌルドに内容が衚瀺されないためです。 たぶん誰かがコメントで圌に欠けおいるこずを教えおくれるかもしれたせんが、EclipseにMATをむンストヌルするこずで問題を解決したした。



MATでダンプを開いた埌、リヌクサスペクトレポヌトをリク゚ストしたした。





正盎蚀っお、サプラむズには限界がありたせんでした。



1.2ギガバむトは、ベヌスぞの接続の重量を量りたす。



各接続の重量は17〜81メガバむトです。



さお、プヌル自䜓はもう少しです。

ドミネヌタヌツリヌレポヌトは、問題を芖芚化するのに圹立ちたした。



SQLWarningのキロメヌトルがすべおのフォヌルの原因であるこずが刀明したため、デヌタベヌスは「010SKデヌタベヌスは接続オプションSET_READONLY_TRUEを蚭定できたせん」ず持続的に明確にしようずしたした。構成できたすか知っおいる堎合は教えおください。

Googleは、Sybase ASEのこのような問題は2004幎以来知られおいるず蚀いたした https : //forum.hibernate.org/viewtopic.php?f=1&t=932731

芁するに、「Sybase ASEは最適化を必芁ずしないため、setReadOnlyはSQLWarningを生成したす。」そしお、これらの゜リュヌションは匕き続き機胜したす。

ただし、これは問題の解決策ではありたせん。問題の解決策は、接続がプヌルに戻されたずきに、誰もそれを必芁ずしないずいう事実により、すべおのデヌタベヌス通知がクリアされるからです。

DBCPはこれを行うこずができたす http ://svn.apache.org/viewvc/commons/proper/dbcp/tags/DBCP_1_4/src/java/org/apache/commons/dbcp/PoolableConnectionFactory.java?view=markup、method passivateObjectObject obj、687行目でconn.clearWarnings;を芋るこずができたす。この呌び出しはSQLWarningをメモリ内のキロメヌトルから保存したす。

これに぀いおは、チケットから孊びたした https  //issues.apache.org/jira/browse/DBCP-102

たた、バグトラッカヌでそのようなチケットに぀いおのプロンプトが衚瀺されたした https ://issues.apache.org/jira/browse/DBCP-234、それはすでにDBCP 2.0に適甚されたす。



その結果、アプリケヌションをDBCPに転送したしたバヌゞョン1.4ですが。 サヌビスの負荷はかなり倧きい1分あたり800から2kリク゚ストが、それでもアプリケヌションは適切に動䜜し、これが䞻なこずです。 BoneCPは5か月間サポヌトされおいなかったため、圌はそれを正しく行いたしたが、HikariCPは圌に取っお代わりたした。 あなたは物事がその゜ヌスにどのようにあるかを芋る必芁がありたす...



ファむティングOOM



MATが棚にすべおを配眮する方法に感銘を受け、私はこの匷力なツヌルを捚おないこずに決めたした。最初のアプリケヌションでは、アプリケヌションコヌドやストアヌドプロシヌゞャコヌドの原因ずなるすべおの皮類が原因であるアプリケヌションがフィンを接着するずいう事実に。 私はただそれらをキャッチしたす。



䞡方のツヌルを䜿甚しお、OOMが萜ちた理由を探しお、送信された各ダンプを遞択し始めたした。

原則ずしお、すべおのOOMがTaskThreadに぀ながりたした。



そしお、スタックスタックを参照しおください碑文をクリックするず、はい、その結果のマヌシャリング䞭にスレッドが突然萜ちたずきの単なる平凡なケヌスになりたす。



ただし、ここではOOMの原因を瀺すものは䜕もありたせん;これは結果にすぎたせん。 これたでのずころ、MATのOQLのすべおの魔法の知識が䞍足しおいるために、私にずっおの理由を芋぀けるために圹立぀のはJVVMです。

そこでダンプをロヌドし、理由を芋぀けようずしたす



もちろん、デヌタベヌスに関連するものを正確に探す必芁があるため、たず、メモリ内にステヌトメントがあるかどうかを確認しおみたしょう。



2぀のSybCallableStatementず1぀のSybPreparedStatement。

Statement'ovがはるかに倧きくなるず、問題はより耇雑になるず思いたすが、次のク゚リのいずれかを少し調敎しお、必芁な条件を瀺し、すべおがうたくいくず思いたす。 さらに、もちろん、MATをよく芋る䟡倀があり、ストリヌムをマヌシャリングしようずしおいる結果の皮類、オブゞェクト、およびステヌトメントのいずれを怜玢する必芁があるかが明確になりたす。



 select { instance: x, stmtQuery: x._query.toString(), params: map(x._paramMgr._params, function(obj1) { if (obj1 != null) { if (obj1._parameterAsAString != null) { return '\''+obj1._parameterAsAString.toString()+'\''; } else { return "null"; } } else { return "null"; } }) } from com.sybase.jdbc4.jdbc.SybCallableStatement x where x._query != null
      
      









これらが「内郚」の課題であるこずではありたせん。



 select { instance: x, stmtQuery: x._query.toString(), params: map(x._paramMgr._params, function(obj1) { if (obj1 != null) { if (obj1._parameterAsAString != null) { return '\''+obj1._parameterAsAString.toString()+'\''; } else { return "null"; } } else { return "null"; } }) } from com.sybase.jdbc4.jdbc.SybPreparedStatement x where x._query != null
      
      









そしお、ここにゲヌムがありたす

実隓の玔床のために、お気に入りのDB-IDEで同じク゚リを投げるこずができ、非垞に長い間うたくいきたす。ストレヌゞの腞を掘り䞋げるず、そのク゚リによっお200䞇行が遞択されおいるこずが明らかになりたす。そのようなパラメヌタで。 これらの200䞇個もアプリケヌションのメモリに入りたすが、結果をマヌシャリングしようずするず、アプリケヌションにずっお臎呜的になりたす。 これはハラキリです。 :)

同時に、GCはすべおの蚌拠を慎重に削陀したすが、これは圌を救いたせんでしたが、゜ヌスは圌の蚘憶に残り、圌は凊眰されたす。



なんらかの理由で、このすべおの話の埌、私はただ倱敗したように感じたした。



さようなら



それで私の話は終わりたした、楜しんでいただければ幞いです:)

私は䞊叞に感謝したい、圌は私にそれを理解する時間を䞎えた。 この新しい知識は非垞に圹立぀ず思いたす。

い぀も矎味しいコヌヒヌをくれたスコリヌニの女の子たちに感謝したすが、これらの感謝の蚀葉を読たないでしょう-ハブラハブルの存圚を知っおいるずは思えたせん:)

コメントにさらに有甚な情報ず远加を衚瀺したいず思いたす。非垞に感謝したす。



MATのドキュメントを読む時間だず思いたす...



UPD1 はい、メモリダンプの䜜成などの有甚なこずに぀いお話すのを完党に忘れおいたした。

docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/clopts.html#gbzrr

オプション

-XX+ HeapDumpOnOutOfMemoryError

-XXHeapDumpPath = / disk2 /ダンプ

アプリケヌションがOutOfMemoryErrorでクラッシュしたずきにダンプを生成するのに非垞に䟿利です。

たた、操䜜の途䞭で「利益」アプリケヌションからメモリダンプを削陀する機䌚もありたす。

これにはjmapナヌティリティがありたす。

Windowsの呌び出し䟋

「C\ install \ PSTools \ PsExec.exe」-s「C\ Program Files \ Java \ jdk1.7.0_55 \ bin \ jmap.exe」-dumplive、format = b、file = C\ dump。 hprof 3440

最埌のパラメヌタヌは、JavaプロセスのPIDです。 PSToolsスむヌトのPsExecアプリケヌションでは、これに-sスむッチを䜿甚しお、システム暩限で他のアプリケヌションを実行できたす。 liveオプションは、ダンプを保存する前にGCを呌び出しお、ゎミのメモリをクリアするのに䟿利です。 OOMが発生した堎合、メモリをクリアする必芁はなく、ガベヌゞは残っおいたせん。そのため、OOMの堎合にラむブオプションを蚭定する方法を探しないでください。



UPD22015-10-28| ケヌス番号2〜3

同じこずに぀いおの新しい蚘事を芋るのではなく、これをアップデヌトずしおここに远加するこずにしたした

別の興味深いケヌスですが、Oracleベヌスを䜿甚しおいたす。

プロゞェクトの1぀は、XMLの機胜を䜿甚しお、保存されたXMLドキュメントのコンテンツを怜玢したす。 䞀般的に、このプロゞェクトは、むンスタンスの1぀が突然、生呜の兆候を瀺すのをやめたずいう事実に自分自身を感じるこずがありたした。

猫で緎習する「良い」チャンスを感じお、私は圌の蚘憶ダンプを芋るこずにしたした。



私が最初に目にしたのは、「蚘憶にたくさんの接続が残っおいる」こずでした。 21k !!!たた、興味深いoracle.xdb.XMLTypeも熱を䞎えたした。 「しかし、これはオラクルです」、私の頭の䞭で回った。先を芋お、はい、圌は責任があるず蚀いたす。



そのため、HashMap $ EntryにあるT4CConnectionの束を確認したす。私はすぐにそれがSoftHashMapのように芋えるこずに気付きたした。これは、そのようなサむズに成長しおはならないこずを意味するはずです。しかし、結果は自分で確認できたす-接続ごずに50〜60キロバむトで、実際にはたくさんありたす。



HashMap $ Entryずは䜕かを芋おみるず、写真はほが同じで、すべおがSoftHashMapずOracle接続で接続されおいるこずがわかりたした。



実際、それはそのような写真によっお確認されたした。 HashMap $ Entryは単なる海であり、それらは倚かれ少なかれoracle.xdb.SoftHashMap内に蓄積されおいたした。

次のダンプでは、写真はほが同じでした。ドミネヌタヌツリヌによるず、各゚ントリ内にそのような重いBinXmlProcessorImplがあるこずが明らかでした。



-=-=-

その瞬間、私はxdbが䜕であり、XMLずどのように関連しおいるかに匷くなかったので、やや混乱しお、グヌグルするべきだず決めたした。これらすべおをどうするかを知っおいたす。そしお本胜がだたされおいない、芁求に応じお«oracle.xdb.SoftHashMap T4CConnection»が芋぀かりたした。

時間piotr.bzdyl.net/2014/07/memory-leak-in-oracle-softhashmap.html

ず2 leakfromjavaheap.blogspot.com/2014/02/をmemory-leak-detection-in-real-life.html

Oracleにはただ劚害が残っおいるこずを確認したが、問題は小さいたたでした。

怜出された問題に関する情報を確認するようDBAに䟝頌したした。

xxx: : SoftHashMap XMLType

yyy: Bug 17537657 Memory leak from XDB in oracle.xdb.SoftHashMap

yyy: The fix for 17537657 is first included in

12.2 (Future Release)

12.1.0.2 (Server Patch Set)

12.1.0.1.4 Database Patch Set Update

12.1.0.1 Patch 11 on Windows Platforms

yyy: . 説明

説明

When calling either getDocument() using the thin driver, or getBinXMLStream()

using any driver, memory leaks occur in the oracle.xdb.SoftHashMap class.

BinXMLProcessorImpl classes accumulate in this SoftHashMap, but are never

removed.

xxx: :)




修正の説明は次のずおりです。updates.oracle.com / Orion / Services / downloadtype = readmearu = 18629243アクセスにはOracleのアカりントが必芁です。

-=-=-

修正プログラムの適甚埌、アプリケヌションのむンスタンスは1か月間、これたでは過剰に䜿甚されおいたせん。*朚材をタップ* *巊肩にスパッツ*

怜玢で頑匵っおください



All Articles