2017-10-23 1 views
0

Ich habe, was ich denke, ist ein Speicher-Leck mit Feder-Daten-Mongodb. Im Grunde verwenden wir MongoDB als eine Art Cache für ein RDBMS, also laden wir beim Start der Anwendung einen großen Teil der Datenbank. Also im Grunde sind wir Kartierungs-/Entnormierung verschiedenen JPA Entities zu Mongo Dokumente unterschiedliche „Mapping“ Methoden wie diese:Möglicher Speicherverlust mit Feder-Daten-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); 
    } 

jedoch der Speicher nicht wachsen aufhört, so habe ich einen Dump Heap und ich merke, dass der Frühling hält eine große Menge von BasicDBObject Referenzen im Speicher und ich weiß nicht warum? java heap dump

Wenn der kürzeste Weg Punkt der Ansammlung Überprüfung es zeigt, dass offenbar die earlyApplicationEvents Eigenschaft der Klasse

shortest path to accumulation point

Ich verwende ist: - Java 8 - Frühling Daten MongoDB 1.10 .8.RELEASE - Federdaten commons 1.13.8.RELEASE - Feder 4.3.6.RELEASE

Irgendwelche Ideen als warum?

+1

Das klingt ähnlich wie https://stackoverflow.com/questions/38109957/find-spring-data-mongo-mappingcontext-memory-leak Aber mit den Versionen, die Sie geben, sollte es behoben werden. –

Antwort

1

Wenn Sie die Verwendung des Felds earlyApplicationEvents aufspüren, ist es im Grunde für das Festhalten von Ereignissen während des Starts, bis die Listener registriert werden können, an diesem Punkt wird es auf null festgelegt. Siehe hier: https://github.com/spring-projects/spring-framework/blob/e7b77cb2b6c699b759a55cd81b345cca00ec5b64/spring-context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java#L828

Sie erwähnen, dass Sie die Verarbeitung beim Start tun, also denke ich, dies verhindert die Registrierung der Zuhörer, bis Ihr Prozess abgeschlossen ist.

Wenn Sie diesen Initialisierungscode weiter zurück verschieben, bis der Anwendungskontext vollständig initialisiert ist, sollte das Problem behoben sein. Zum Beispiel sollte das Registrieren eines Ereignis-Listeners und das Reagieren auf die ContextRefreshedEvent den Trick machen. Der wichtige Teil ist, nach dem Aufruf von registerListeners des Aktualisierungsprozesses zu erhalten.

+0

Sie hatten Recht, die Initialisierung geschah zu früh; Danke! – ufasoli

Verwandte Themen