2017-10-23 19 views
0

spring-data-mongodbでメモリリークが発生していると思います。 基本的に、私たちはMongoDBをRDBMSのための一種のキャッシュとして使用しています。そのため、アプリケーションが起動すると、データベースの大きな部分がロードされます。メモリは成長を停止しませんがspring-data-mongodbでメモリリークが発生する可能性があります

@Override 
    public void insertFromContacts(Set<Contact> contacts, Long seed){ 
     MutableLong sfId = new MutableLong(seed); 

     List<SocialInfo> socialInfos = contacts.stream().map(c -> { 
      SocialInfo socialInfo = new SocialInfo();    
      socialInfo.setId(sfId.longValue()); 
      socialInfo.setSearchOnly(true); 
      socialInfo.setStatus(null); 
      socialInfo.setContactId(c.getId()); 
      sfId.increment(); 
      return socialInfo; 
     }).collect(Collectors.toList()); 

     mongoTemplate.insertAll(socialInfos); 
    } 

ので、私は、ヒープ・ダンプを行なったし、私はその春を実現: だから基本的に私たちは、このような異なる「マッピング」メソッドを使用してMongoの文書に別のJPAエンティティをdenormalising /マッピングされていますメモリ内に大量のBasicDBObject参照を保持していますが、その理由はわかりません。 java heap dump

集積点への最短経路をチェックするとき、それはそれは私が使用しているどうやらクラス

shortest path to accumulation point

のearlyApplicationEventsプロパティで示しています を - Javaの8 - 春データMongoDBの1.10を.8.RELEASE - Springデータコモンズ1.13.8.RELEASE - Spring 4.3.6.RELEASE

なぜですか?

+1

これはhttps://stackoverflow.com/questions/38109957/find-spring-data-mongo-mappingcontext-memory-leakと似ていますが、あなたが提供しているバージョンでは修正する必要があります。 –

答えて

1

フィールドearlyApplicationEventsの使用状況を追跡すると、起動時にイベントを保持してリスナーを登録できるようになり、その時点でnullに設定されます。ここを参照してください:https://github.com/spring-projects/spring-framework/blob/e7b77cb2b6c699b759a55cd81b345cca00ec5b64/spring-context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java#L828

あなたはので、私はこれがあなたのプロセスが終了するまで、リスナーの登録を防止思いますが、起動時に処理を行うことを言及します。あなたは、さらにバックアプリケーションコンテキストが完全に初期化された後まで、その初期化コードを移動した場合

、この問題を修正する必要があります。たとえば、イベントリスナーを登録してContextRefreshedEventに反応させるには、このトリックを行う必要があります。重要な部分は、リフレッシュプロセスのregisterListenersへの呼び出し後に取得することです。

+0

あなたは正しいです、初期化が早すぎます。ありがとうございました! – ufasoli

関連する問題