2010-06-16 31 views
5

tôi có một ứng dụng trên thị trường Android, trong trường hợp ngoại lệ và lỗi được bắt và gửi cho tôi bởi acra.hết lỗi bộ nhớ, lỗi ứng dụng của tôi?

Nhưng tôi nhận được khá nhiều ra lỗi bộ nhớ .. Trong loại khác nhau của các tầng lớp ... một số ứng dụng của tôi, một số java nói chung ..

Liệu này luôn luôn có nghĩa là có một vấn đề trong ứng dụng của tôi, hoặc nó cũng có thể là điện thoại hết bộ nhớ do một quá trình khác?

Người dùng cũng sẽ nhận được hộp thoại fc không?

Thông tin bổ sung

có gì nhớ intensite trong ứng dụng của tôi ..

không có hình ảnh ... không có khối lớn của dữ liệu .. chỉ một view..and đơn giản sâu nhất một Mobclix quảng cáo ..

Tôi mới sử dụng java ... vì vậy tôi có thể bị rò rỉ ở đâu đó ... nhưng tôi thấy khó khắc phục điều đó. Nhưng tại thời điểm này tôi thậm chí không chắc chắn có đôi khi sai ...

tôi nhận được khoảng 25 -50 lỗi OOM hàng ngày .. nhưng so với 60.000 quảng cáo nó hiển thị một ngày. (tôi chỉ hiển thị 1 hoặc 2 quảng cáo cho mỗi lần quảng cáo bắt đầu) không quá nhiều.

1 nhận lỗi như:

"java.lang.OutOfMemoryError 
at org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:79) 
at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:93) 
at android.net.http.AndroidHttpClientConnection.bind(AndroidHttpClientConnection.java:114) 
at android.net.http.HttpConnection.openConnection(HttpConnection.java:61) 
at android.net.http.Connection.openHttpConnection(Connection.java:378) 
at android.net.http.Connection.processRequests(Connection.java:237) 
at android.net.http.ConnectionThread.run(ConnectionThread.java:125) 

"

"java.lang.OutOfMemoryError 
at java.io.BufferedReader.<init>(BufferedReader.java:102) 
at com.mobclix.android.sdk.Mobclix$FetchResponseThread.run(Mobclix.java:1422) 
at com.mobclix.android.sdk.MobclixAdView$FetchAdResponseThread.run(MobclixAdView.java:390) 
at java.util.Timer$TimerImpl.run(Timer.java:290) 

"

"java.lang.OutOfMemoryError 
at org.apache.http.util.ByteArrayBuffer.<init>(ByteArrayBuffer.java:53) 
at org.apache.http.impl.io.AbstractSessionOutputBuffer.init(AbstractSessionOutputBuffer.java:77) 
at org.apache.http.impl.io.SocketOutputBuffer.<init>(SocketOutputBuffer.java:76) 
at android.net.http.AndroidHttpClientConnection.bind(AndroidHttpClientConnection.java:115) 
at android.net.http.HttpConnection.openConnection(HttpConnection.java:61) 
at android.net.http.Connection.openHttpConnection(Connection.java:378) 
at android.net.http.Connection.processRequests(Connection.java:237) 
at android.net.http.ConnectionThread.run(ConnectionThread.java:125) 

"

Vì vậy, các is..am câu hỏi chính tôi bị rò rỉ ở đâu đó .. hoặc có thể điều này được coi là bình thường bởi vì trong một số ít trường hợp điện thoại có thể hết bộ nhớ do các ứng dụng khác đang chạy trên đó.

+0

Cơ hội đó là ứng dụng của bạn có yêu cầu bộ nhớ không? Hoặc như http://developer.android.com/resources/articles/avoiding-memory-leaks.html nói rằng ngữ cảnh bị rò rỉ một cách nào đó? – xandy

+0

Đây có thể là vấn đề tương tự như đã thảo luận (và cố định!) Trong liên kết http://stackoverflow.com/questions/5358014/android-httpclient-oom-on-4g-lte-htc-thunderbolt –

+0

@ xandy đã chết. Đây là [một live] (http://android-developers.blogspot.ru/2009/01/avoiding-memory-leaks.html) –

Trả lời

0

Có những điều có thể nằm ngoài tầm kiểm soát của bạn (bộ nhớ trên điện thoại là một ví dụ) nhưng dù sao bạn cũng chịu trách nhiệm về hành vi của ứng dụng của mình.

Cách bạn xử lý các vấn đề về bộ nhớ sẽ ảnh hưởng đến cách người dùng xem ứng dụng của bạn. Nếu nó hoạt động tốt với các ứng dụng khác, người dùng sẽ có nhiều khả năng sử dụng nó hơn. Nếu không, họ sẽ không.

0

Bạn có ý nghĩa gì bởi ngoại lệ "chung java" và nếu những điều này không liên quan đến phần mềm của bạn, thì tại sao bạn nhận được chúng?

Như bạn có thể đã biết, máy ảo Dalvik chỉ có một lượng nhỏ bộ nhớ được phân bổ cho chính nó (và cho ứng dụng của bạn). Điều này được thực hiện theo cách này để tránh khả năng của một quá trình phát triển ngoài tầm kiểm soát và thoát tất cả các tài nguyên sẵn có, làm cho điện thoại không sử dụng được. Vì vậy, nếu ứng dụng của bạn đang thực hiện nhiều thao tác bộ nhớ (như tải ảnh) và bạn không cẩn thận với phân bổ của bạn (và xóa chúng ngay khi chúng không cần thiết), thì kết quả kỳ lạ có thể được quan sát.

Giới thiệu về lực lượng đóng, vì bạn đang nắm bắt các ngoại lệ này, chúng không được gây ra sự cố cho ứng dụng của bạn, trừ khi bạn đã quên khởi tạo lại một số thứ sau khi bạn đã bắt được ngoại lệ.

Có thể kiểm tra mã của bạn và loại bỏ phân bổ bộ nhớ không cần thiết sẽ hữu ích. Ngoài ra, bạn có thể kiểm tra như ông chủ của tôi không - ông chỉ freaks ra đẩy nút một cách ngẫu nhiên cho đến khi một cái gì đó treo: D

EDIT

Vì bạn nói rằng có nhớ gì đắt tiền trong mã của bạn (sans quảng cáo có lẽ), sau đó bạn có thể có một kiểm tra đơn giản để xem nếu toàn bộ hệ thống là thấp trên bộ nhớ khi lỗi xảy ra, hoặc nó là ứng dụng của bạn gây ra nó. Hãy xem cuộc gọi lại onLowMemory. Nó được gọi khi toàn bộ điện thoại còn thiếu bộ nhớ.

1

Như Thomas đã đề xuất, bạn thực sự muốn sử dụng DDMS để xem mức sử dụng bộ nhớ của mình.

Ngoài ra, một vấn đề rất phổ biến đối với rò rỉ là sử dụng các biến tĩnh - chỉ sử dụng chúng nếu bạn biết bạn đang làm gì.

Xử lý bitmap cũng có thể rất tốn kém trên Android. Ứng dụng của bạn làm gì? Ngoài ra, bạn có rất nhiều tham chiếu đến bất kỳ phần tử giao diện người dùng nào không? Bất kỳ cái nào được định nghĩa là tĩnh?

0

Khi bạn nhận được OutOfMemoryError, bạn có thể chắc chắn đó là ứng dụng của bạn và không phải là một ứng dụng khác gây ra nó. Mỗi ứng dụng Android được chạy trong máy ảo Dalvik của riêng nó với 16Mb cấp phát bộ nhớ tối đa.

Nếu bạn không sử dụng bitmap (đây là nguồn rò rỉ bộ nhớ thường xuyên), bạn cũng phải kiểm tra xem bạn có xử lý đúng các thay đổi định hướng không, không lưu giữ bất kỳ tham chiếu nào đến đối tượng liên quan đến giao diện người dùng.

3

Một vấn đề JVM phổ biến là chỉ các đối tượng không được xử lý có thể được xóa bởi Bộ thu gom rác. Nếu bạn có các đối tượng liên tục lớn thì điều quan trọng là phải đặt các biến không sử dụng trong các đối tượng đó thành null để chúng bị bỏ qua. Một vấn đề cổ điển là giữ một cái gì đó giống như một đối tượng HashMap xung quanh với rất nhiều giá trị trong nó khi bạn không cần nó vì mọi mục nhập trong HashMap đều nhai bộ nhớ.

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