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)
Wie wäre es, den Heapspeicher Ihrer IDE zu erhöhen, indem Sie die INI-Datei bearbeiten? –
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
Wer auch immer abgestimmt hat ... wie wäre es mit dem nächsten Feedback? – Jonathan