2012-09-04 2 views
1

때때로 앱의 힙 메모리 제한을 우회하여 허용되는 것보다 많은 것을 사용해야합니다.자바를 통한 기본 메모리 사용

나는 네이티브 메모리 (힙 메모리가 아닌 비 관리 메모리)에 바이트를 저장할 캐싱 메커니즘을 포함하는 솔루션을 생각해 보았습니다.

물론 시스템의 최대 사용 가능한 크기를 고려할 것입니다.

그래서, direct buffers에 대해 조금 알고, 내가 기본 메모리에 바이트 배열을 저장하기 위해 사용 :

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

그러나, 안드로이드에 대한 것 같아를,이에 사용되는 메모리는 힙에 사용된다 네이티브 메모리가 아닙니다.

무슨 일입니까? 네이티브 메모리에서 데이터를로드하는 &을 저장하기위한 쉬운 대안이 있습니까?

+0

"원시 메모리"와 같은 것은 없습니다. 메모리는 네이티브 대 바이트 코드에 대한 이해가 없다. 이것은 당신의 질문을 아주 불분명하게 만듭니다. – mah

+0

관리되는 메모리 및 관리되지 않는 메모리가 있습니다. 관리되는 메모리에는 약 48MB의 제한이 있으며 전달할 때 OOM 예외가 발생합니다. 관리되지 않는 메모리는 장치의 RAM 크기에 관한 것이지만 아직 릴리스해야합니다. NDK 또는 OpenGL을 사용할 때 이러한 기능을 사용할 수 있습니다. –

+0

필자는이 방법을 쉽게 (주석이 아닌 대답 일 수도 있지만) 쉽게 호출하지 않을 것이지만, 네이티브 메소드가 malloc()과 free()를 수행하는 클래스를 생성 할 수있는 것처럼 사용자의 설명에서 들립니다. DalvikVM이 메모리를 관리하는 방법에 대한 설명이 정확하다면, DVM 체크를 우회 할 수 있습니다 (안드로이드가이를 막기위한 적극적인 조치를 취하지 않는다고 가정 할 때). 해결해야 할 문제는 Java에서 해당 메모리에 액세스하는 방법입니다. – mah

답변

0

네이티브 힙에 메모리를 할당하고 JNI를 사용하여 메모리와 통신하는 NDK를 사용하여 구현할 수 있습니다. 네이티브 부분은 C로 구현되고 malloc() 호출을 사용하여 원시 힙에 메모리를 할당합니다. 그래도 프로세스 별 힙 최대 값은 여전히 ​​유지됩니다.

다른 대안이 있습니다. 자신의 프로세스에서 기본 힙을 사용하는 대신 다른 프로세스에서 dalvik-heap을 사용하면됩니다.

서비스를 만들고 다른 프로세스에서 서비스를 실행하십시오. 서비스와 나머지 응용 프로그램간에 데이터를주고받을 수 있습니다. 힙 제한은 프로세스 당이므로 응용 프로그램에서 사용할 수있는 메모리 양이 실제로 두 배가됩니다.

물론 이것은 사용자의 특별한 경우에는 도움이되지 않지만이 옵션을 사용할 수 있다는 것을 알고있는 것이 좋습니다.

+0

mallocs도 힙 한도가 적용됩니까?! 내가 반대 의견이라고 들었을뿐만 아니라 도움이되지 않는다면 왜 제안하겠습니까? 또한 더 쉬운 방법은 없습니까? 여러 프로세스를 사용하는 것은 도움이되지 않을 수 있습니다. 데이터에 상대적으로 빠르게 액세스해야하기 때문이며,이를 위해 인 텐트를 사용하는 것은 권장되지 않습니다. 특히 큰 바이트 배열을 사용할 때 특히 그렇습니다. 시원한 팁. –

+0

mallocs는 dalvik 힙 제한이 아닌 원시 힙 제한을 따릅니다. (필자가 아는 한 실제로는 확인하지 않았습니다. 올바르지 않으면 유감스럽게 생각합니다.)바운드 서비스에 대한 동기 호출을 사용하여 다른 프로세스에서 데이터를 얻을 수 있습니다. 나는 이런 식으로 작동하는 응용 프로그램을 만들었으며 잘 작동합니다. –

+0

아마 당신을 이해하지 못했습니다. 네이티브 힙 한계는 무엇입니까? 서비스에 관해서는 동일한 프로세스에서 데이터를받는 것만큼이나 빠릅니까? –