2017-03-28 4 views
0

ウェブサイトをクロールして、ハッシュセットで見つかったhrefを挿入しようとしました。リンクが650個挿入された後、java.lang.OutOfMemoryError:GCオーバーヘッド限度超過。 どうすれば動作させることができますか?java.lang.OutOfMemoryError:クロール中にGCのオーバーヘッドの上限を超過しました

私は以下のコードを入れている:

public void getPageLinks(String URL, String otherlinksSelector) { 
    if (!links.contains(URL)) { 
     try { 
      Document document = Jsoup.connect(URL).userAgent("Mozilla").get(); 
      Elements otherLinks = document.select(otherlinksSelector); 
      for (Element page : otherLinks) { 
       if (links.add(URL)) { 
        System.out.println(URL); 
       } 
       getPageLinks(page.attr("abs:href"),otherlinksSelector); 
      } 
     } catch (Exception e) { 
      System.err.println(e.getMessage()); 
     } 
    } 
} 

答えて

-1

あなたが代わりにメモリに保持するファイルへの書き込みのリンクを維持することができます。 そのようにすれば、メモリ内のデータ量は少なくなります。過去に見つかった他のリンクを解析したい場合は、同じファイルから読み込むことができます。

0

まず、メモリ内のすべてのURLを管理するクローラは、この情報を外部化したり、むしろ無限大のクラスタを持つ場合を除き、保存するURLとメモリとして破棄するクローラの制限要因利用可能なメモリの量OOMingの前の650のURLは非常に小さい量のTBHです。例外として、garbateコレクタがメモリを解放しようとするには時間がかかりすぎて、使用可能な最大メモリが十分でないことが示されていることが少なくとも例外です。

プロファイラーを使用して特定の時間間隔でヒープダンプを取ってから、使用可能なオブジェクトがどれだけ占有されているか、どのオブジェクトがそのオブジェクトを参照しているかを確認します。また、メモリに何が残っているかを知るためにヒープを取る前にGCを強制してください。この方法で、コレクタがメモリを解放するのを防ぐことができます。

次は、パフォーマンスの方法でユニークチェックを含むvistited URLを永続化のトピックを研究論文(DRUMVEUNIQ、...)がいくつかあります。作品にはいくつかのオープンソースの実装がありますが、それらのほとんどはまだ完成していません(私のアプローチを含む)。 DRUMSはおそらく最も大きなアプローチです。

関連する問題