안드로이드 응용 프로그램의 힙 크기를 늘리는 방법은 무엇입니까?


125

여러 3D 모델을 사용하는 Android 응용 프로그램을 작성 중입니다. 텍스처가있는 이러한 모델은 많은 메모리를 차지할 수 있습니다. 제조업체가 응용 프로그램에서 사용할 수있는 힙 크기에 제한을 설정한다는 것을 알았습니다. 예를 들어 내 태블릿 Samsung Galaxy Tab 8.9 P7310은 64MB의 메모리를 차지할 수 있습니다.

응용 프로그램에서 사용할 수있는이 메모리 크기를 늘리는 방법이 있습니까?

답변:


210

당신은 사용할 수 있습니다 largeHeap이 = "사실은"안드로이드 더 큰 힙 크기를 요청할 수 있지만, 이것은 어떤 사전 벌집 장치에서 작동하지 않습니다. 2.3 이전 장치에서는 VMRuntime 클래스를 사용할 수 있지만 Gingerbread 이상에서는 작동하지 않습니다.

NDK는 SDK와 같은 메모리 제한을 부과하지 않기 때문에 가능한 한 큰 제한을 갖는 유일한 방법은 NDK를 통해 메모리를 많이 사용하는 작업을 수행하는 것입니다.

또는 현재보고있는 모델 부분 만로드하고 나머지는 필요에 따라로드하고 메모리에서 사용하지 않는 부분은 제거 할 수 있습니다. 그러나 앱에 따라 불가능할 수도 있습니다.


NDK는 재미있어 보인다. SDK로 이미 작성한 코드와 함께 사용할 수 있습니까?
cooxie

3
그것은 당신이 가진 코드에 전적으로 달려 있습니다. 저는 NDK의 전문가가 아니며 기본 사항 만 알고 있습니다. android-ndk Google 그룹의 코드에 대한 설명과 함께이 질문을하거나 android-ndk 태그를 사용하여 SO에 대한 새로운 질문을 게시하는 것이 좋습니다.
Raghav

Unity3D를 질문에 대한보다 구체적인 답변으로 "단순하게"사용할 수 없는지 궁금합니다.
cregox

3
largeHeap=trueFTW
Luis Artola

2
안드로이드 API의 개발자들은 정말 재밌습니다. 더 많은 힙을 원하는 것 같습니다. 좋아, 그것은 그것을 필요로하는 사람들을위한 것입니다 ... 한편, 모든 개발자는 앱이 프로덕션에 올 때 추가 할 첫 번째 항목으로 추가하고 있습니다 :)
AndroidLover

110

응용 프로그램에서 사용할 수있는이 메모리 크기를 늘리는 방법이 있습니까?

API 레벨 11 +에서 실행중인 응용 프로그램을 할 수 있습니다 android:largeHeap="true"<application>큰 정상보다 힙 크기를 요청하는 매니페스트의 요소, 그리고 getLargeMemoryClass()에는 ActivityManager힙이라고 얼마나 큰 당신을 말할 것이다. 하나:

  1. 이것은 API 레벨 11 이상에서만 작동합니다 (즉, Honeycomb 이상).

  2. 큰 힙이 얼마나 큰지 보장 할 수 없습니다

  3. 사용자는 대용량 힙 요청을 인식하게되는데, 이는 다른 앱이 RAM에서 강제로 다른 앱의 프로세스를 종료하여 큰 힙에서 사용하기 위해 시스템 RAM을 비우기 때문입니다.

  4. # 3으로 인해 android:largeHeap악용 될 것으로 예상 되므로 나중에이 기능에 대한 지원이 중단되거나 설치시 사용자에게 경고 할 수 있습니다 (예 : 특별 권한을 요청해야 함) )

  5. 현재이 기능은 간략하게 문서화되어 있습니다.


largeHeap을 사용할 수없는 경우 @CommonsWare를 사용하면 이전에로드 한 객체 (예 : 이미지)를 어떻게 제거합니까?
Jeongbebs

@MiguelRivera는 : 이미지의 경우, 이상적으로는 메모리 (참조 재활용 inBitmap에를 BitmapOptions). 그 외에도 모든 참조를 제거하면 결국 가비지 수집됩니다.
CommonsWare

그리고 어떤 결정을 제안합니까?
Gennadiy Ryabkin

@zest : 나는 당신이 무엇을 말하는지 모르겠습니다. 죄송합니다.
CommonsWare

2
@Eftekhari : 앱이 아닙니다. 더 많은 물건을 가질수록 그 물건을 통과하는 데 더 많은 CPU 시간을 소비 할 수 있지만, 자세한 내용은 메모리로 수행하는 작업에 따라 다르며 요청한 것과 직접 관련이 없습니다 android:largeHeap. 그러나 큰 힙을 요청하면 다른 응용 프로그램 프로세스가 다른 방법으로 필요했던 것보다 빨리 종료되도록하여 사용자 환경이 전반적으로 손상 될 수 있습니다.
CommonsWare

22

힙 크기를 동적으로 늘릴 수 없습니다.

android:largeHeap="true"매니페스트에서 를 사용하여 더 많이 사용하도록 요청할 수 있습니다 .

또한을 사용할 수 native memory (NDK & JNI)있으므로 실제로 힙 크기 제한을 무시합니다.

여기 내가 작성한 몇 가지 게시물이 있습니다.

그리고 여기 내가 만든 라이브러리가 있습니다 :


응용 프로그램 당 @은 Java 수준에서 힙 제한이 다르고 기본은 다릅니다 예를 들어 s5 devcie 128mb Java 힙 제한 및 native의 예는 또 다른 128mb를 취할 수 있습니까?
NitZRobotKoder

힙 크기는 각 앱마다 일정하며 (하드웨어 및 롬에 따라 크기가 다름) 모두 동일해야합니다. 기본 메모리는 장치의 실제 메모리이지만 일부는 OS에서 사용하기 때문에 물론 제한적입니다.
안드로이드 개발자

내 응용 프로그램에서 네이티브 .so + Java android Platform + java POJO logic + JavaScript를 사용하고 있음을 의미했습니다. 안드로이드는 각 레벨마다 다른 힙 크기를 가지고 있습니까?
NitZRobotKoder


@NitZRobotKoder 아니요. 힙 크기는 Java / Kotlin 세계 용이며 너무 많이 사용하면 OOM 예외가 발생할 수 있습니다. 나머지는 기본 메모리입니다.
안드로이드 개발자

6

두 번째 프로세스를 사용하십시오. 와 AndroidManifest새로운 선언Service

android:process=":second"

첫 번째 프로세스와 두 번째 프로세스 간 교환 BroadcastReceiver


5

Android OS에 따라 두 가지 방법으로 수행 할 수 있습니다.

  1. 당신이 사용할 수있는 android:largeHeap="true"더 큰 힙 크기를 요청하는 안드로이드 매니페스트의 응용 프로그램 태그에, 그러나 이것은 어떤 사전 벌집 장치에서 작동하지 않습니다.
  2. 2.3 이전 장치에서는 VMRuntime 클래스를 사용할 수 있지만 Gingerbread 이상에서는 작동하지 않습니다. 아래 방법을 참조하십시오.
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

HeapSize를 설정하기 전에 다른 응용 프로그램이나 OS 기능에 영향을 미치지 않는 적절한 크기를 입력했는지 확인하십시오. 설정하기 전에 앱의 크기를 확인한 다음 작업을 수행하기 위해 크기를 설정하십시오. 그렇지 않으면 다른 앱이 영향을 줄 수있는 메모리를 너무 많이 사용하지 마십시오.

참조 : http://dwij.co.in/increase-heap-size-of-android-application


4
따라서 분명히 <2.3에는 길이 있고> 2.3에는 길이 있지만 2.3은 조여져 있습니다!
Michael

3

내가 기억하는 것에서 당신은 VMRuntime초기 안드로이드 버전에서 클래스를 사용할 수 있었지만 이제는 더 이상 할 수 없습니다.

나는 개발자가 모바일 환경에서 힙 크기를 선택하게하는 것이 그렇게 안전하다고 생각할 수 있다고 생각하지 않습니다. 응용 프로그램 자체에서 힙을 수정하여 프로그래밍 측이 아닌 특정 장치에서 힙 크기를 수정하는 방법을 쉽게 찾을 수 있다고 생각합니다.


0

Java 힙을 늘리면 부적당 한 모바일 부활이 발생합니다. 때로는 가비지 수집기를 기다렸다가 힙 공간이 줄어들면 작업을 다시 시작 하는 것으로 충분합니다 . 그런 다음 이 정적 방법 을 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.