2013-06-11 10 views
5

Dies ist meine erste Stackoverflow-Post, tut mir leid, wenn es nicht großartig ist. Feedback wird definitiv helfen!Twitter4j TwitterStream oder BufferReading verursacht java.lang.OutOfMemoryError: Java Heap Space

Ich renne gerade in ein java.lang.OutOfMemoryError: Java Heap space Problem mit einem Projekt Ich arbeite mit der Twitter Streaming API.

Der Fehler tritt nach dem Streaming in etwa 500 - 1000 Tweets und ich kann nicht feststellen, was verursacht es verursacht.

Im onStatus Verfahren zum StatusListener ich den folgenden Code habe:

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(); 
     } 
    } 

Kann der Fehler durch die Geschwindigkeit verursacht werden, bei denen der Status in kommen? Ich kann sehen, warum es mehr Speicher aufnehmen würde, wenn der Status viel schneller kommt als sie verarbeitet werden.

Der andere Verdächtige ist der BufferReader, hier ist der Code:

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(); 

Bitte lassen Sie mich wissen, wenn Sie eine Idee haben, warum die OutOfMemoryError auftritt. Wenn Sie den gesamten Code sehen möchten, lesen Sie bitte mein GitHub repository

Hier ist der Stack-Trace nach dem Fehler schlagen:

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

Wie wäre es, den Heapspeicher Ihrer IDE zu erhöhen, indem Sie die INI-Datei bearbeiten? –

+1

Das Programm wird für eine ganze Weile eingeschaltet bleiben, so dass tausende von Statusmeldungen kommen. Die Erhöhung des Heapspeichers hilft dabei nicht – xDranik

+2

Wer auch immer abgestimmt hat ... wie wäre es mit dem nächsten Feedback? – Jonathan

Antwort

2

Ich weiß jetzt, was ich falsch mache! Die onStatus() - Methode im Status-Listener sollte (höchstens) die eingehenden Statusinformationen speichern und nicht verarbeiten. Ich werde dieses Mal zwei Programme verwenden, eines zum Füllen einer Datenbank oder Datei mit den Statusinformationen und ein weiteres zum Verarbeiten dieser Daten.