オンライン位置決めGCメモリリーク問題

1419 ワード

理由:Javaにメモリの漏洩があるのは、オブジェクトが役に立たないのに達成できるからです.
例を挙げます. この例では、Objectオブジェクトをループして申請し、申請したオブジェクトを1つのVectorに入れます.参照自体を解放するだけでは、Vectorはオブジェクトを参照しているので、このオブジェクトはGCにとって回収できません.したがって、オブジェクトがVectorに追加された後、Vectorから削除する必要がある場合は、最も簡単な方法は、Vectorオブジェクトをnullに設定することです.
Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
    Object o=new Object();
    v.add(o);
    o=null; 
}

//変数vがこれらのオブジェクトを参照しているため、すべてのObjectオブジェクトは解放されません. この場合、これらのObjectは使用できないオブジェクトであり、GCはクリーンアップを手伝ってくれないため、メモリの漏洩が発生します.
1.ps-ef|grep xxx|grep-v grep:プロセスが存在するかどうかを確認します.
2.1がtrueの場合、tomcatのcatlalina.outログとシステムgcログを表示し、メモリオーバーフローがあるかどうかを確認します.
3.2がtrueであれば、jmap-heap 1000でjavaスタックの場合を見ます.
4.2がtrueであれば、jstat-gcutil pid 1000とps-mp 1000-o THREAD,tid,time>a.logでスタック内の各世代の占有状況とGC状況を確認する.
5.3がtrueであれば、コマンド:jstack pid>a.logでスレッドDump情報を取得する.
6.4がtrueであれば、コマンド:jmap-histo:liveとjstat-printcompiliation-h 3 1000(jmapコマンドがFull GCをトリガーし、同時アクセスの多いオンライン環境では注意)で、アクティブなオブジェクトを確認します.
7.5がtrueであればGC理由:/java/bin/jinfo-flag+PrintGCReason
8.jps-l-mデッドロック状態で適用されたプロセスidを見つける