2

StringBuilder.append()을 사용하여 4MB보다 큰 String을 만들려고 할 때 OutOfMemoryError가 발생합니다.Android 2.3 (진저 브레드)에서 힙 크기를 늘리는 방법은 무엇입니까?

내가 아는 한 StringBuilder에는 크기에 대한 제한이 없으므로 String이 아닙니다.

그래서 내가 "어떻게 안드로이드 힙 크기를 증가시키는"와 지금까지의 내가 this answerthis answer에서 결론을 내릴 수 있기 때문에, 진저 브레드는 힙 크기를 다루는 방법이 없습니다있는 유일한 버전은 이전 버전부터입니다 검색 VMRuntime 클래스를 사용하고 매니페스트의 최신 버전 android:largeHeap="true"을 사용합니다.

해당 가정은 맞습니까? VMRuntime과 android:largeHeap="true" 사이에있을 때 무엇을합니까?

Runtime.getRuntime().totalMemory()/1048576 - Runtime.getRuntime().maxMemory()/1048576을 사용하여 테스트 (Android 2.3.6)에 사용하는 기기에서 "사용 가능한 42.00MB의 5.00MB를 할당합니다"를 얻었습니다.

+0

나는 이것을 X라고 부른다. Y 문제점 : 메모리를 늘릴 방법을 찾지 않아야한다. 메모리에 4MB 문자열을 작성하는 방법을 찾아야합니다. – zapl

+0

@zapl 레거시 시스템을 다룰 때 선택의 여지가없는 경우가 있습니다. – Michael

답변

2

해당 가정은 맞습니까?

나는 VMRuntime이 이제까지 작동했는지 여부를 말할 수 없습니다. android:largeHeap은 확실히 API 레벨 11 이상입니다.

VMRuntime과 android : largeHeap = "true"사이에있을 때 무엇을합니까?

은 당신의 StringBuilder 생성자에 큰 용량을 제공하여 귀하의 4메가바이트 String을 구축 더 메모리 효율적인 방법을 찾아보십시오.

또는 인접한 4MB String을 만들지 않고 수행중인 작업을 구현하는 방법을 찾아보십시오.

+0

흥미 롭군요, @ CommonSWare Mark! 따라서 진저 브레드에있을 때 힙을 사용하지 않아도되지만 특정 시나리오에서는 커집니다. 'StringBuilder'의'ensureCapacity (8388608)'을 사용하여 8MB를 할당했는지 확인했습니다. 그리고 확실하게, 나는 "_dalvikvm-heap | 8388624-byte allocation_"메시지에 대해 33.268MB까지 힙 (힙 케이스)을 증가시킵니다. 오류가 사라졌습니다. 인접한 큰 임의의'char''String'이 사용되고 있기 때문에 최대 파일 크기를 가진 파일을 만드는 데 필요한 쓰기 작업이 적습니다. 다른 현명한 접근법을 제안합니까? –

+0

@NickFanelli : Dalvik에 압축 가비지 콜렉터가 없기 때문에 "최대 연속 파일 크기를 가진 파일을 작성하기 위해 쓰기 작업이 덜 필요하므로 인접한 대형 임의 char 문자열이 사용 중입니다. 힙을 조각화하지 않습니다 아주 많이. "다른 현명한 접근법을 제안합니까?" - 처음부터 정말 큰'문자열 '을 피하는 것 이외에는 (아무튼), 아니 .. – CommonsWare