6

これは私の最初の Stackoverflow 投稿です。うまくいかなかったらごめんなさい。フィードバックは間違いなく役に立ちます。

現在java.lang.OutOfMemoryError: Java Heap space、Twitter Streaming API を使用して取り組んでいるプロジェクトで問題が発生しています。

約 500 ~ 1000 件のツイートをストリーミングした後にエラーが発生し、何が原因で発生したのか特定できません。

onStatusメソッドStatusListenerには、次のコードがあります。

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

ステータスが入る速度が原因でエラーが発生する可能性はありますか? ステータスが処理されるよりもはるかに速く入ってくると、なぜより多くのメモリが必要になるのかがわかります。

もう 1 つの容疑者はBufferReaderです。コードは次のとおりです。

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

なぜ発生しているのかわかる方いましたら教えてくださいOutOfMemoryError。コード全体を見たい場合は、私のGitHub リポジトリをチェックしてください。

エラーが発生した後のスタック トレースは次のとおりです。

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)
4

1 に答える 1

2

私は今、私が間違っていたことを知っています!ステータス リスナーの onStatus() メソッドは、(せいぜい) 受信ステータス情報を処理する代わりに格納する必要があります。今回は 2 つのプログラムを使用します。1 つは DB またはファイルにステータス情報を入力するためのもので、もう 1 つはそのデータを処理するためのものです。

于 2013-06-13T21:10:33.080 に答える