2013-06-11 24 views
5

Đây là bài đăng Stackoverflow đầu tiên của tôi, xin lỗi nếu nó không tuyệt vời. Phản hồi chắc chắn sẽ giúp bạn!Twitter4j TwitterStream hoặc BufferReading gây ra java.lang.OutOfMemoryError: Java Heap Space

Tôi hiện đang gặp sự cố java.lang.OutOfMemoryError: Java Heap space với dự án tôi đang làm việc bằng cách sử dụng API phát trực tuyến Twitter.

Lỗi xuất hiện sau khi phát trực tuyến trong khoảng 500 - 1000 tweet và tôi không thể xác định nguyên nhân khiến nó xảy ra.

Trong phương pháp onStatus cho StatusListener Tôi có đoạn mã sau:

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

lỗi có thể được gây ra bởi tốc độ mà tình trạng đang đến? Tôi có thể thấy lý do tại sao nó sẽ mất nhiều bộ nhớ hơn nếu trạng thái đang đến nhanh hơn nhiều so với việc chúng đang được xử lý.

Các nghi can khác là BufferReader, đây là mã:

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

Xin vui lòng cho tôi biết nếu bạn có một ý tưởng tại sao OutOfMemoryError đang xảy ra. Nếu bạn muốn xem toàn bộ mã, xin vui lòng kiểm tra của tôi GitHub repository

Đây là stack trace sau khi chạm Lỗi:

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

cách tăng bộ nhớ heap của IDE chỉnh sửa tệp .ini –

+1

Chương trình sẽ được để lại trong một thời gian, vì vậy hàng nghìn trạng thái sẽ đến. Tăng bộ nhớ heap sẽ không giúp ích gì – xDranik

+2

Ai xuống bình chọn ... làm thế nào để lại một số phản hồi lần sau? – Jonathan

Trả lời

2

bây giờ tôi biết những gì tôi đã làm sai! Phương thức onStatus() trong trình nghe trạng thái phải tối đa là lưu trữ thông tin trạng thái đến thay vì xử lý. Tôi sẽ sử dụng hai chương trình lần này, một để điền một DB hoặc tệp với thông tin trạng thái và một chương trình khác để xử lý dữ liệu đó.

Các vấn đề liên quan