Nhận OutOfMemoryException trong Xamarin


76

java.lang.OutOfMemoryError. Cân nhắc việc tăng giá trị của $ (JavaMaximumHeapSize). Java hết bộ nhớ khi thực thi 'java.exe'

Tôi đang thoát khỏi ngoại lệ bộ nhớ trong Dự án visualstudio Xamarin của mình. Vui lòng giúp tôi cách giải quyết vấn đề này.


2
Tôi không chỉ khuyên bạn nên đặt LargeHeap thành true. Thay vào đó, bạn nên cố gắng tìm ra nguyên nhân gây ra OOM đó và khắc phục điều đó. Nếu không, bạn có thể đã mua cho bạn một khoảng thời gian cho đến khi nó sẽ ập đến bạn một lần nữa.
rượu tequila slammer

Câu trả lời:


124

Tôi sẽ tăng kích thước đống xây dựng của bạn.

Nhấp chuột phải vào Dự án Android của bạn> Thuộc tính > Tùy chọn Android > Nâng cao > Kích thước đống tối đa Java .

nhập mô tả hình ảnh ở đây


Vâng, bạn đúng. Nhưng tôi có thể tăng kích thước ứng dụng của mình ở đâu trong xamarin studio trực quan.
Srinivas Ch

3
@SrinivasCh Trong biểu hiện của bạn thêm android:largeHeap="true"thẻ và sau đó xem của bạn logcatcho Grow heap (frag case)thấy khi ART đang cố gắng phân bổ nhiều bộ nhớ
SushiHangover

Hoạt động tốt Cảm ơn bạn đã trả lời @lain Smith
Srinivas Ch

@SushiHangover Ah ok, tôi đã có lỗi mà trước và chỉ tăng mức đống ở đây, nhưng bạn là đúng nếu bạn muốn bạn phải sử dụng một đống lớn sau đó chỉnh sửa manifes
Iain Smith

@ Srinivas-Ch không phải lo lắng
Iain Smith

20

Câu trả lời đã chọn sẽ dẫn tôi đi đúng hướng, nhưng đối với Visual Studio 2017, màn hình trông giống như:

Màn hình cập nhật VS 2017

Màn hình cập nhật VS 2017


18

Nếu bạn muốn tăng kích thước Heap của ứng dụng của mình (không phải quá trình xây dựng), bạn có thể đặt điều này trong AndroidManifest.xml:

<application android:largeHeap="true"></application>

12

Đối với visual studio 2015, nhấp chuột phải vào Dự án -> Thuộc tính -> Tùy chọn Android -> Nâng cao và kích thước đống ở đó.


Thực hiện điều đó: nhấp chuột trái vào <project> .Droid -> Nhấp đúp vào 'Thuộc tính' -> Nhấp vào 'Tùy chọn Android' ở bên trái -> Nhấp vào tab 'Nâng cao' -> "Kích thước đống tối đa của Java"
LionelGoulet

7

Kể từ phiên bản Xamarin studio 6.3 và visual studio 7.0.1, bạn có thể tìm thấy tùy chọn tăng kích thước heap tại đây

Nhấp chuột phải vào dự án android, sau đó chọn các tùy chọn và chọn, Build / Android Build , sau đó là tab Advanced và đặt 1G (hoặc thứ gì đó) ở kích thước đống Java

nhập mô tả hình ảnh ở đây


4

Khi bạn sử dụng hết kích thước heap 1G, hãy bắt đầu tối ưu hóa tài nguyên.

Trước tiên, hãy kiểm tra xem bạn có đang sao chép các trường hợp hình ảnh hay không, giữ một hình ảnh giống nhau trong bộ nhớ nhiều lần. Để sử dụng thư viện ffimageloading ( https://github.com/luberda-molinet/FFImageLoading ) tải nó trên nuget nhanh chóng và dễ dàng.

Sau đó tối ưu hóa hình ảnh bạn đang sử dụng. Đối với các hình ảnh lớn, ngoài các biểu tượng, hãy thử chuyển đổi mọi thứ sang jpeg, tránh png với độ trong suốt, điều này đã từng giúp tôi thoát khỏi những lần oom liên tục.

Sau đó, hãy thử sử dụng hình thu nhỏ thay vì hình ảnh khi bạn có thể có hình ảnh tải lên lớn trên điều khiển từ xa. Trên máy chủ của bạn, hãy tạo trước các hình thu nhỏ cho các kích thước khác nhau, nhỏ, nhỏ, vừa, bình thường, lớn, xlarge, v.v. và chỉ tải những hình ảnh có kích thước bạn thực sự cần. Điều đó tiết kiệm rất nhiều bộ nhớ và tốc độ.

Một vấn đề khác là rò rỉ bộ nhớ. Bạn có thể có các ô hoặc các phần tử khác vẫn nằm trong bộ nhớ im nếu chúng không hủy đăng ký nhận thư, bộ xử lý sự kiện và một số phần tử khác. Hãy tưởng tượng bạn có thể có một số bản sao của một danh sách đầy hình ảnh vẫn còn trong bộ nhớ khi bạn chắc chắn rằng điều đó không thể xảy ra. Thông tin thêm tại đây:

https://forums.xamarin.com/discussion/123876/should-we-unsubscribe-all-events-for-memory-management

https://forums.xamarin.com/discussion/87206/messaging-center-unsubscribe-from-all-messages-when-broadcast-stops


2

Theo kinh nghiệm của tôi, các vấn đề về bộ nhớ CHỈ xảy ra trên phiên bản Android của ứng dụng Xamarin.Forms. Và nó luôn phải xử lý những hình ảnh có kích thước lớn. Tôi đã giải quyết vấn đề này bằng cách sử dụng FFImageLoading ( https://github.com/luberda-molinet/FFImageLoading )

Thay thế của bạn

<Image Source="waterfront.jpg" />

Với

<ffimageloading:CachedImage Source="waterfront.jpg"
DownsampleToViewSize = true,
BitmapOptimizations = true/>

Bạn sẽ thấy sự cải thiện đáng kể về hiệu suất và nó cũng sẽ giải quyết các vấn đề về bộ nhớ của bạn.


1

Tăng kích thước heap tối đa của java phù hợp với tôi

nhập mô tả hình ảnh ở đây


-1

Tôi đã sửa lỗi thêm bên dưới trong thẻ ứng dụng của AndroidManifiest.xml

<application  android:largeHeap="true" android:label="sample"></application>
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.