Làm thế nào để tăng kích thước heap của một ứng dụng Android?


125

Tôi đang viết một ứng dụng Android sử dụng một số mô hình 3D. Một mô hình như vậy với kết cấu có thể chiếm rất nhiều bộ nhớ. Tôi phát hiện ra nhà sản xuất đặt giới hạn về kích thước heap mà ứng dụng có thể sử dụng. Ví dụ: máy tính bảng Samsung Galaxy Tab 8,9 P7310 của tôi có thể chiếm tới 64 MB bộ nhớ.

Có cách nào để tăng kích thước bộ nhớ này mà một ứng dụng có thể sử dụng không?

Câu trả lời:


210

Bạn có thể sử dụng android: LargeHeap = "true" để yêu cầu kích thước heap lớn hơn, nhưng điều này sẽ không hoạt động trên bất kỳ thiết bị Honeycomb trước nào. Trên các thiết bị trước 2.3, bạn có thể sử dụng lớp VMR.78, nhưng điều này sẽ không hoạt động trên Gingerbread trở lên.

Cách duy nhất để có giới hạn càng lớn càng tốt là thực hiện các tác vụ chiếm nhiều bộ nhớ thông qua NDK, vì NDK không áp đặt giới hạn bộ nhớ như SDK.

Ngoài ra, bạn chỉ có thể tải một phần của mô hình hiện đang xem và tải phần còn lại khi bạn cần, trong khi xóa các phần không sử dụng khỏi bộ nhớ. Tuy nhiên, điều này có thể không thể, tùy thuộc vào ứng dụng của bạn.


NDK có vẻ thú vị. Tôi có thể sử dụng nó kết hợp với mã của tôi đã được viết bằng SDK không?
cooxie

3
Điều đó phụ thuộc hoàn toàn vào mã bạn có. Tôi không phải là chuyên gia về NDK và chỉ biết những điều cơ bản. Tôi khuyên bạn nên hỏi câu hỏi này cùng với mô tả mã của bạn trên nhóm Google-ndk của Google hoặc đăng câu hỏi mới về SO cụ thể cho câu hỏi này bằng thẻ android-ndk.
Raghav Sood

Tôi tự hỏi nếu chúng ta không thể "đơn giản" sử dụng Unity3D như một câu trả lời cụ thể hơn cho câu hỏi ("sử dụng một số mô hình 3D") ... Không thể nhanh chóng tìm thấy bất kỳ bằng chứng rõ ràng nào về việc liệu unity có sử dụng NDK hay không.
cregox

3
largeHeap=trueFTW
Luis Artola

2
Các nhà phát triển của api android thực sự hài hước, họ giống như bạn muốn nhiều Heap hơn? Ok yêu cầu nó, nó chỉ dành cho những người cần nó ... trong khi đó mọi nhà phát triển sẽ thêm nó làm điều đầu tiên để thêm vào khi ứng dụng được sản xuất :)
AndroidLover

110

Có cách nào để tăng kích thước bộ nhớ này mà một ứng dụng có thể sử dụng không?

Các ứng dụng chạy trên API Cấp 11+ có thể có android:largeHeap="true"trên <application>phần tử trong tệp kê khai để yêu cầu kích thước heap lớn hơn bình thường và getLargeMemoryClass()trên ActivityManagersẽ cho bạn biết mức độ lớn của heap đó. Tuy nhiên:

  1. Điều này chỉ hoạt động trên API cấp 11+ (nghĩa là, Honeycomb và hơn thế nữa)

  2. Không có gì đảm bảo đống lớn sẽ lớn như thế nào

  3. Người dùng sẽ nhận thấy yêu cầu heap lớn của bạn, bởi vì nó sẽ buộc các ứng dụng khác của họ hết RAM chấm dứt các quá trình của ứng dụng khác để giải phóng RAM hệ thống để sử dụng cho heap lớn của bạn

  4. Vì số 3 và thực tế là tôi hy vọng android:largeHeapsẽ bị lạm dụng, hỗ trợ cho việc này có thể bị hủy trong tương lai hoặc người dùng có thể bị cảnh báo về việc này khi cài đặt (ví dụ: bạn sẽ cần phải xin phép đặc biệt cho nó )

  5. Hiện tại, tính năng này được ghi lại nhẹ nhàng


@CommonsWare nếu không có LargeHeap, làm cách nào tôi có thể xóa các đối tượng được tải trước đó (như hình ảnh)?
Jeongbebs

@MiguelRivera: Đối với hình ảnh, lý tưởng nhất là bạn tái chế bộ nhớ của chúng (xem inBitmaptiếp BitmapOptions). Ngoài ra, xóa tất cả các tham chiếu đến chúng, và cuối cùng chúng sẽ được thu gom rác.
CommonsWare

và quyết định nào bạn đề nghị?
Gennadiy Ryabkin

@zest: Tôi không biết bạn đang đề cập đến điều gì, xin lỗi.
CommonsWare

2
@Eftekhari: Không trực tiếp, cho ứng dụng của bạn. Có nhiều thứ hơn có thể khiến bạn mất nhiều thời gian CPU hơn để trải qua những thứ đó, nhưng các chi tiết ở đó sẽ phụ thuộc vào những gì bạn đang làm với bộ nhớ và không liên quan trực tiếp đến việc yêu cầu android:largeHeap. Tuy nhiên, yêu cầu một đống lớn có thể gây hại cho trải nghiệm người dùng nói chung, bằng cách buộc các quy trình ứng dụng khác chấm dứt sớm hơn so với yêu cầu khác.
CommonsWare

22

bạn không thể tăng kích thước heap một cách linh hoạt.

bạn có thể yêu cầu sử dụng nhiều hơn bằng cách sử dụng android:largeHeap="true"trong bảng kê khai.

Ngoài ra, bạn có thể sử dụng native memory (NDK & JNI), vì vậy bạn thực sự bỏ qua giới hạn kích thước heap.

Đây là một số bài viết tôi đã thực hiện về nó:

và đây là một thư viện tôi đã tạo cho nó:


@ mỗi ứng dụng không giới hạn heap ở cấp java và bản địa có khác nhau không? tức là ví dụ về s5 devcie 128mb giới hạn heap java và bản địa có thể mất thêm 128 mb?
NitZRobotKoder

Kích thước heap là không đổi cho mỗi ứng dụng (kích thước phụ thuộc vào phần cứng và rom) và phải giống nhau cho tất cả. Bộ nhớ riêng là bộ nhớ thực của thiết bị, nhưng tất nhiên nó cũng bị hạn chế, vì một số bộ nhớ được HĐH sử dụng.
nhà phát triển Android

ý tôi là nếu ứng dụng của tôi đang sử dụng say .so + java android Platform + java POJO logic + JavaScript. Android có kích thước heap khác nhau ở mỗi cấp độ?
NitZRobotKoder


@NitZRobotKoder Số Kích thước heap dành cho thế giới Java / Kotlin, nơi bạn có thể có ngoại lệ OOM nếu bạn sử dụng quá nhiều. Đối với phần còn lại, đó là bộ nhớ riêng.
nhà phát triển Android

6

Sử dụng quy trình thứ hai. Khai báo AndroidManifestmới Servicevới

android:process=":second"

Trao đổi giữa quá trình thứ nhất và thứ hai qua BroadcastReceiver


5

Điều này có thể được thực hiện bằng hai cách theo hệ điều hành Android của bạn.

  1. Bạn có thể sử dụng android:largeHeap="true"trong thẻ ứng dụng của bảng kê khai Android để yêu cầu kích thước heap lớn hơn, nhưng điều này sẽ không hoạt động trên bất kỳ thiết bị Honeycomb trước nào.
  2. Trên các thiết bị trước 2.3, bạn có thể sử dụng lớp VMR.78 , nhưng điều này sẽ không hoạt động trên Gingerbread và ở trên Xem bên dưới cách thực hiện.
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

Trước khi đặt HeapSize, đảm bảo rằng bạn đã nhập kích thước phù hợp sẽ không ảnh hưởng đến chức năng ứng dụng hoặc hệ điều hành khác. Trước khi cài đặt, chỉ cần kiểm tra kích thước ứng dụng của bạn và sau đó đặt kích thước chỉ để hoàn thành công việc của bạn. Không sử dụng quá nhiều bộ nhớ nếu không các ứng dụng khác có thể ảnh hưởng.

Tham khảo: http://dwij.co.in/increas-heap-size-of-android-application


4
Vì vậy, rõ ràng, <2.3 có cách và> 2.3 có cách, nhưng 2.3 bị sai lệch!
Michael

3

Từ những gì tôi nhớ bạn có thể sử dụng VMRuntimelớp trong các phiên bản Android đầu tiên nhưng bây giờ bạn không thể làm được nữa.

Tôi không nghĩ việc để nhà phát triển chọn kích thước heap trong môi trường di động có thể được coi là an toàn như vậy. Tôi nghĩ việc bạn có thể tìm cách sửa đổi kích thước heap trong một thiết bị cụ thể (không phải ở phía lập trình) sẽ dễ dàng hơn bằng cách cố gắng sửa đổi nó từ chính ứng dụng.


0

Tăng Java Heap không công bằng ăn thâm hụt di động. Đôi khi chỉ cần đợi người thu gom rác và sau đó tiếp tục hoạt động của bạn sau khi không gian heap bị giảm. Sử dụng phương pháp tĩnh này rồi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.