2017-07-28 17 views
13

Tôi đang tạo ứng dụng có chứa WebView chạy một số mã JavaScript. Mã JavaScript đó khá phân bổ và có thể đòi hỏi nhiều bộ nhớ.Phát hiện bộ nhớ khả dụng bên trong WebView

Đôi khi, số lượng bộ nhớ bắt buộc vượt quá số lượng JavaScript có thể yêu cầu và làm hỏng quy trình Chromium của WebView làm treo ứng dụng của tôi.

Tôi nghe onMemoryTrim trong đơn đăng ký của mình - nhưng không bao giờ được gọi trong trường hợp này trên các thiết bị có nhiều hơn 1GB bộ nhớ. (Không, ngay cả với TRIM_MEMORY_RUNNING_LOW).

Có cách nào tôi có thể phát hiện WebView của mình sắp hết bộ nhớ và có thể giết nó hoặc cho nó biết (để nó có thể giải phóng bộ nhớ) không?

Tôi đã thử bỏ phiếu performance.memory nhưng không hoạt động. Tập lệnh sau gặp sự cố WebView nếu được thực hiện trong đó:

var a = []; 

var kek =() => { 
    var b = []; 
    for(var i = 0; i < 1024 * 1024 * 2; i++) b.push(Math.random()); 
    return b; 
} 

var ival = setInterval(() => { 
    let m = performance.memory; 
    if(m.jsHeapSizeLimit - m.usedJSHeapSize < 1e5) { 
    console.log("Memory limited") 
    } else { 
    a.push(kek()); 
    } 
}); 

Có cách nào để phát hiện bộ nhớ sắp hết để tôi có thể xử lý nó một cách dễ dàng mà không cần ứng dụng gặp sự cố không?

+0

'onTrimMemory()' được gọi dựa trên các sự kiện toàn bộ vòng đời và số lượng RAM * hệ thống miễn phí *. Vấn đề của bạn có vẻ như bị ràng buộc với một số loại giới hạn quy trình (ví dụ: giới hạn heap ứng dụng chuẩn) và tôi sẽ không mong đợi 'onTrimMemory()' được gọi cho các trường hợp như vậy. – CommonsWare

+0

@CommonsWare cảm ơn, tôi đã không nhận ra đây là những móc được kích hoạt trên toàn hệ thống. Có vẻ như giới hạn JavaScript của Chrome là giới hạn có lỗi ở đây. Hoàn toàn thẳng thắn - điều này là do [Chrome leaks] (https://bugs.chromium.org/p/chromium/issues/detail?id=749482) và khi nó đạt đến một số giới hạn - nó bị treo (với ứng dụng của tôi). X của tôi trong vấn đề XY này là Chrome không bị rơi hoặc có cách để bắt nó trong ứng dụng của tôi và không làm hỏng nó - mặc dù tôi quan tâm đến cách đo lường mức sử dụng bộ nhớ từ một PoC hoàn toàn tò mò. –

+0

@CommonsWare và rõ ràng 8,0 giới thiệu một cách để khôi phục từ X - https://developer.android.com/preview/features/managing-webview.html#termination-handle –

Trả lời

6

Tôi đã thảo luận vấn đề này với nhóm Chromium và nhóm Android và tại thời điểm này (họ nghĩ và tôi tin họ) rằng điều này là không thể.

Đôi khi, số lượng bộ nhớ bắt buộc vượt quá số lượng JavaScript có thể yêu cầu và làm hỏng quy trình Chromium của WebView làm treo ứng dụng của tôi.

Tuy nhiên, bạn có thể thoát khỏi sự cố bộ nhớ trong Android 8.0+ bằng cách sử dụng the new termination handle API. Vì vậy, điều này làm việc xung quanh vấn đề của tôi bằng cách không phải kiểm tra bộ nhớ có sẵn cần thiết ở nơi đầu tiên.

Bằng cách ghi đè onRenderProcessGone - chúng tôi bắt lỗi và tạo lại WebView.

Các vấn đề liên quan