2017-07-28 19 views
13

के अंदर उपलब्ध स्मृति का पता लगाएं मैं एक ऐप बना रहा हूं जिसमें WebView है जो कुछ जावास्क्रिप्ट कोड चलाता है। वह जावास्क्रिप्ट कोड काफी आवंटन भारी है और बहुत सारी मेमोरी की आवश्यकता हो सकती है।वेबव्यू

कभी-कभी, आवश्यक स्मृति की मात्रा जावास्क्रिप्ट की आवश्यकता से अधिक हो जाती है और वेब ऐप की क्रोमियम प्रक्रिया को क्रैश करता है जो मेरे ऐप को क्रैश करता है।

मैं अपने आवेदन में onMemoryTrim सुनता हूं - लेकिन इस परिदृश्य में इसे 1 जीबी से अधिक स्मृति वाले उपकरणों पर कभी नहीं कहा जाता है। (TRIM_MEMORY_RUNNING_LOW के साथ भी नहीं)।

क्या कोई तरीका है कि मैं अपने वेबव्यू को स्मृति पर कम चल रहा हूं और इसे मार सकता हूं या इसे बता सकता हूं (इसलिए यह स्मृति मुक्त कर सकता है)?

मैंने performance.memory मतदान करने का प्रयास किया है लेकिन यह काम नहीं किया।

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()); 
    } 
}); 

वहाँ स्मृति पता लगाने के लिए किसी भी तरह से के बारे में रन आउट हो तो मैं यह शान से ऐप्स क्रैश बिना संभाल कर सकते हैं करने के लिए है है: निम्न स्क्रिप्ट WebView अगर यह में मार डाला दुर्घटनाओं?

+0

'onTrimMemory()' को समग्र जीवन चक्र घटनाओं और मुफ्त * सिस्टम रैम * की मात्रा के आधार पर बुलाया जाता है। आपकी समस्या किसी प्रकार की प्रक्रिया सीमा (उदाहरण के लिए, मानक ऐप ढेर सीमा) से बंधी प्रतीत होती है, और मैं इस तरह के परिदृश्यों के लिए 'onTrimMemory() 'को लागू करने की अपेक्षा नहीं करता। – CommonsWare

+0

@ कॉमन्सवेयर धन्यवाद, मुझे एहसास नहीं हुआ था कि ये सिस्टम-व्यापी ट्रिगर हुक थे। ऐसा प्रतीत होता है कि क्रोम की जावास्क्रिप्ट की सीमा यहां एक गलती है। पूरी तरह से स्पष्ट होने के लिए - ऐसा इसलिए है क्योंकि [क्रोम लीक] (https://bugs.chromium.org/p/chromium/issues/detail?id=749482) और जब यह कुछ सीमा तक पहुंच जाता है - यह क्रैश (मेरे ऐप के साथ) होता है। इस एक्सवाई समस्या में मेरा एक्स क्रोम क्रैश नहीं कर रहा है या मेरे ऐप में इसे पकड़ने का तरीका नहीं है और इसे क्रैश नहीं किया गया है - हालांकि मुझे पूरी तरह उत्सुक पीओसी से मेमोरी उपयोग को मापने के तरीके में दिलचस्पी है। –

+0

@ कॉमन्सवेयर और स्पष्ट रूप से 8.0 एक्स - https://developer.android.com/preview/features/managing-webview.html#termination-handle –

उत्तर

6

मैंने क्रोमियम टीम और एंड्रॉइड टीम के साथ इस पर चर्चा की है और फिलहाल (वे सोचते हैं और मैं उन्हें विश्वास करता हूं) कि यह असंभव है।

कभी-कभी, आवश्यक स्मृति की मात्रा जावास्क्रिप्ट की आवश्यकता से अधिक हो जाती है और वेब ऐप की क्रोमियम प्रक्रिया को क्रैश करता है जो मेरे ऐप को क्रैश करता है।

हालांकि आप the new termination handle API का उपयोग कर एंड्रॉइड 8.0+ में मेमोरी क्रैश से बाहर हो सकते हैं। तो यह पहली जगह में आवश्यक उपलब्ध स्मृति की जांच न करके मेरी समस्या के आसपास काम करता है।

onRenderProcessGone ओवरराइड करके - हमें बग पकड़ने और वेबव्यू को फिर से बनाने के लिए मिलता है।