2012-09-04 55 views
1

有時,需要繞過應用程序的堆內存限制,並使用超出允許的限制。通過java使用本機內存

我想過一個解決方案,它將包括一個緩存機制,它將字節存儲在本機內存中(而不是在堆內存中,但是非託管內存)。

當然,我會考慮系統的最大可用尺寸。

所以,瞭解一些關於direct buffers,我用它來存儲在本機內存中的字節數組:

final ByteBuffer nativeBytes=ByteBuffer.allocateDirect(bytes.length); 
    nativeBytes.put(bytes); 

然而,這似乎是在Android上,用於該內存堆中使用而不是在本機內存中。

這是怎麼回事?從本機內存中加載數據有沒有簡單的選擇?

+0

沒有「本土記憶」之類的東西;內存沒有理解本地字節碼和字節碼。這使你的問題非常不清楚。 – mah

+0

有託管內存和非託管內存。託管內存的限制大約爲48MB,當你通過它時,你會得到OOM異常。非託管內存大小與設備的RAM大小有關,但您必須注意釋放它。使用NDK或OpenGL時可以使用這樣的東西。 –

+0

我不會稱這種簡單的(因此值得作爲一個評論可能但不是答案),但從你的描述,它聽起來像你可以用本地方法創建一個類,其中這些本地方法執行malloc()和free()。如果你對DalvikVM如何管理內存的描述是正確的,那麼這應該允許你繞過DVM檢查(假設Android沒有采取主動措施來禁止這種檢查)。那麼要解決的問題就是如何從Java訪問該內存。 – mah

回答

0

你可以使用NDK實現一些東西,它會在本地堆中爲你分配內存,並使用JNI與它進行通信。本機部分在C中實現,並使用malloc()調用來分配本地堆中的內存。儘管如此,您仍然會受到每個進程堆的限制。

這是另一種選擇。不要試圖在你自己的進程中使用本地堆,只需在另一個進程中使用dalvik-heap。

創建服務並在另一個進程中運行該服務。您可以在您的服務和其他應用程序之間來回發送數據。堆的限制是每個進程所以這有效地使應用程序可以使用的內存量增加一倍。

當然,這可能無助於您的具體情況,但很高興知道此選項可用。

+0

mallocs也受堆限制嗎?!不僅我聽說它是​​相反的,但爲什麼你會建議它,如果它沒有幫助?另外,還有沒有更簡單的方法來做到這一點?使用多個進程可能沒有幫助,因爲我需要相對較快的數據訪問,並且不推薦使用這種意圖,特別是在使用大字節數組時。很酷的提示。 –

+0

mallocs受到本機堆的限制,而不是達爾維克堆的限制(據我所知,但我沒有實際驗證 - 如果它不正確)。您可以使用同步調用從另一個進程獲取數據,以便快速綁定服務。我已經構建了像這樣工作的應用程序,它工作得很好。 –

+0

我可能不瞭解你:本地堆的限制是什麼?關於服務,與從同一過程獲取數據一樣快嗎? –