2013-06-11 17 views
5

Bu benim ilk Stackoverflow gönderim, büyük değilse üzgünüm. Geribildirim kesinlikle yardımcı olacaktır!Twitter4j TwitterStream veya BufferReading neden java.lang.OutOfMemoryError: Java Heap Space

Şu anda bir kullanıcıyla birlikte bir java.lang.OutOfMemoryError: Java Heap space sorunuyla karşılaşıyorum Twitter Akış API'sini kullanıyorum.

Hata, yaklaşık 500 - 1000 tweet akışında yayınladıktan sonra geliyor ve bunun nedenine neden olduğunu belirleyemiyorum.

public void onStatus(Status status) { 

     tweetCount++; 
     System.out.println("Tweet #" + tweetCount); 

     String statusInfo = status.getText().replaceAll("\n", "").replaceAll("\r", ""); 

     String usersCountry = getTweetUserLocation(status); 
     status = null; 

     if(!usersCountry.equals("INVALID_LOCATION")){ 
      countryList.updateWhoTalkedAboutWho(usersCountry, statusInfo); 
     } 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      System.out.println("Exception in onStatus() catch block"); 
      e.printStackTrace(); 
     } 
    } 

hata durumu geliyor hızından kaynaklanabilir Could: Aşağıdaki kod var StatusListener için onStatus yöntemde

? Durumun işlenmekte olduğundan daha hızlı gelmesi durumunda neden daha fazla bellek alacağını anlayabiliyorum.

diğer şüpheli burada, BufferReader olan koddur:

URL url = new URL(urlStr); 
URLConnection conn = url.openConnection(); 

BufferedReader rd = new BufferedReader(new InputStreamReader(
     conn.getInputStream())); 
StringBuffer sb = new StringBuffer(); 
String line; 

while ((line = rd.readLine()) != null) { 
    sb.append(line); 
} 

rd.close(); 
rd=null; 
result = sb.toString(); 

Eğer OutOfMemoryError oluştuğu niçin bir fikir varsa bana bildirin. Eğer tüm kodu görmek istiyorsanız, kontrol edin benim İşte GitHub repository

olan Hatası çarptıktan sonra yığın izleme:

Exception in thread "Twitter Stream consumer-1[Receiving stream]" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Arrays.java:2882) 
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100) 
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:515) 
at java.lang.StringBuffer.append(StringBuffer.java:306) 
at java.io.BufferedReader.readLine(BufferedReader.java:333) 
at java.io.BufferedReader.readLine(BufferedReader.java:362) 
at twitter4j.StatusStreamBase.handleNextElement(StatusStreamBase.java:85) 
at twitter4j.StatusStreamImpl.next(StatusStreamImpl.java:57) 
at twitter4j.TwitterStreamImpl$TwitterStreamConsumer.run(TwitterStreamImpl.java:478) 
Exception in thread "Twitter4J Async Dispatcher[0]" java.lang.OutOfMemoryError: Java heap space 
at java.io.BufferedReader.<init>(BufferedReader.java:80) 
at java.io.BufferedReader.<init>(BufferedReader.java:91) 
at TweetCountry.sendGetRequest(TweetCountry.java:75) 
at TweetCountry.findCountryName(TweetCountry.java:28) 
at StreamTweets.getTweetUserLocation(StreamTweets.java:135) 
at StreamTweets.access$4(StreamTweets.java:115) 
at StreamTweets$1.onStatus(StreamTweets.java:45) 
at twitter4j.StatusStreamImpl.onStatus(StatusStreamImpl.java:75) 
at twitter4j.StatusStreamBase$1.run(StatusStreamBase.java:114) 
at twitter4j.internal.async.ExecuteThread.run(DispatcherImpl.java:116) 
+0

IDE'nizin yığın belleğini artırma hakkında .ini dosyasını düzenleme hakkında –

+1

Program oldukça uzun bir süredir açık kalacak, böylece binlerce durum gelecektir. Yığın belleğinin artırılması bu konuda yardımcı olmayacaktır. – xDranik

+2

Kim oy kullandıysa ... bir dahaki sefere bazı geri bildirimler bırakmaya ne dersin? – Jonathan

cevap

2

Şimdi ben yanlış ne yaptığını biliyorum! Durum dinleyicisindeki onStatus() yöntemi, işlem yapmak yerine gelen durum bilgisini (en fazla) saklamalıdır. Bu defa iki program kullanacağım, biri bir DB'yi veya dosyayı durum bilgileriyle doldurmak için, diğeri ise bu verileri işlemek için.

İlgili konular