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.
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.
Câu trả lời:
android:largeHeap="true"
thẻ và sau đó xem của bạn logcat
cho Grow heap (frag case)
thấy khi ART đang cố gắng phân bổ nhiều bộ nhớ
Đố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 ở đó.
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
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.