2010-06-16 91 views
5

我在android市場上有一個應用程序,除了例外和錯誤被抓住併發送給我的阿拉。內存不足錯誤,我的應用程序的錯誤?

但我收到了很多內存不足的錯誤.. 在不同類型的課程......我的一些應用,一些常規Java ..

這是否一定意味着有我的應用程序有問題,或者它也可能是由於其他進程而導致電話內存不足?

用戶是否也會得到一個fc對話框?

其他信息

有一個在我的應用程序沒有什麼記憶intensite ..

沒有圖片...數據沒有大塊.. 只有一個簡單的view..and最密集的一個Mobclix的廣告..

我是新來的java ...所以我可能有泄漏的地方..但我覺得很難調試。 但在這一點上,我甚至不知道有什麼錯...

我得到約25-50 OOM的錯誤每天..但相比,它顯示了一天的60.000廣告。 (我每次開始時只顯示1或2個廣告),並不是太多。

1收到這樣的錯誤:

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

所以主要問題is..am我一些地方泄漏.. 或可以這被認爲是正常的,因爲在很小的情況下,由於其他應用程序運行,手機可能會因內存不足而被佔用。

+0

您的應用程序對內存要求很高嗎?或者像http://developer.android.com/resources/articles/avoiding-memory-leaks.html表示上下文有些泄露? – xandy 2010-06-16 17:25:38

+0

這可能是與討論(並修復!)相同的問題http://stackoverflow.com/questions/5358014/android-httpclient-oom-on-4g-lte-htc-thunderbolt – 2012-11-05 10:13:02

+0

@ xandy的鏈接已死亡。這是[一個活的](http://android-developers.blogspot.ru/2009/01/avoiding-memory-leaks.html) – 2014-09-02 11:19:28

回答

0

有些東西可能超出了你的控制範圍(手機內存是一個例子),但是你對應用程序的行爲負責。

如何處理內存問題將影響用戶如何查看您的應用程序。如果它與其他應用程序配合良好,用戶將更有可能使用它。如果沒有,他們不會。

0

你是什麼意思的「一般java」的例外,如果這些與你的軟件不相關,那麼你爲什麼收到它們?

正如你可能知道的,Dalvik虛擬機只有少量內存分配給自己(和你的應用程序)。這是通過這種方式來實現的,以避免過程失控和耗盡所有可用資源的可能性,從而使手機無法使用。因此,如果您的應用程序正在執行許多內存密集型操作(如加載圖片),並且您不太注意分配(並在不需要時立即清除它們),則可能會觀察到奇怪的結果。

關於強制關閉,因爲你正在捕獲這些異常,所以它們不應該導致應用程序崩潰,除非你錯過了在發生異常後重新實例化某些內容。

也許檢查你的代碼和消除不需要的內存分配將證明是有幫助的。此外,您還可以測試作爲老闆做 - 他只是怪胎推動隨機按鈕,直到東西崩潰:d

編輯

既然你說,沒有在你的代碼沒有什麼記憶昂貴(沒有廣告大概),那麼你可以進行一次簡單的檢查,看看錯誤發生時整個系統是否內存不足,或者是你的應用程序導致它。看看onLowMemory回調。當整個手機內存不足時調用它。

1

正如托馬斯所說,你真的想用DDMS來查看你的內存使用情況。

此外,泄漏的一個非常常見的問題是使用靜態變量 - 只有在您知道自己在做什麼時才使用它們。

處理位圖在Android上也可能會非常昂貴。你的應用做什麼?另外,你是否有很多引用任何UI元素?任何定義爲靜態?

0

當您收到OutOfMemoryError時,您可以確定它是您的應用程序,而不是導致它出現的另一個應用程序。每個Android應用都運行在它自己的Dalvik虛擬機上,最大內存分配量爲16Mb。

如果您不使用位圖(這是內存泄漏的常見來源),您還必須檢查是否正確處理方向更改,而不是將相對於UI的對象的任何引用保留在內存中。

3

一個常見的JVM問題是隻有未引用的對象可以被垃圾收集器刪除。如果你有很大的持久化對象,那麼將這些對象中未使用的變量設置爲null是非常重要的,以便它們被解除引用。一個經典的問題是,當你不需要它的時候,像HashMap對象一樣保留着許多值,因爲HashMap中的每個條目都在咀嚼內存。