JJ's blog

[Android] WebView와 메모리에 관하여 본문

Technology/Android

[Android] WebView와 메모리에 관하여

Jayden_Ji 2016. 12. 23. 14:20

※ 이 글은 Webveiw NDK Crash 에러를 분석하고 해결법들을 찾으며 수집한 일반적인 해결법과 유용한 정보들을 저장&공유 하기위한 글입니다. 바쁘신 분들은 하단의 링크부터 확인하시면 될 듯 합니다. 




얼마전 WebView 이슈로 골치가 아픈일이 있었습니다.



* 이슈는 WebView 반복 생성/호출 시 WebView lib가 죽는 이슈입니다.

로그에는 하단의 참고1) 같은 문구가 주로 보입니다.



참고1)


---------------------------------------------------
:     #00 pc 000e4ee0  /system/lib/libskia.so 
:     #01 pc 00112fa5  /system/lib/libskia.so (_ZN7SkPaintD2Ev+8) 
:     #02 pc 0002cf11  /system/lib/libhwui.so 
:     #03 pc 0002cf8b  /system/lib/libhwui.so 
:     #04 pc 0005714f  /system/lib/libhwui.so 
:     #05 pc 00056fa3  /system/lib/libhwui.so 
:     #06 pc 0001e349  /system/lib/libhwui.so 
:     #07 pc 0002065b  /system/lib/libhwui.so 
:     #08 pc 0002047f  /system/lib/libhwui.so 
:     #09 pc 0002236d  /system/lib/libhwui.so (_ZN7android10uirenderer12renderthread12RenderThread10threadLoopEv+80) 
:     #10 pc 00010205  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+112) 
:     #11 pc 00062723  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+70) 
:     #12 pc 0003fc63  /system/lib/libc.so (_ZL15__pthread_startPv+30) 
:     #13 pc 0001a39b  /system/lib/libc.so (__start_thread+6) 
----------------------------------------------------

M 9BA0B000 00163000 0011E000 000000000000000000000000000000000 WebViewGoogle.odex 
M A0C28000 008DC000 01ED0000 EDCB403D8C54B64A8A4907BC5195E0B40 libwebviewchromium.so 
M B6CB4000 00000000 00073000 2FB72470EA2447C9FBA4D7D7AC2108C40 libc.so

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xb3 
:     #00 pc 005c459e  /system/app/WebViewGoogle/WebViewGoogle.apk (offset 0x8dc000) 
: AM write failed: Broken pipe 
----------------------------------------------------

M 98FB9000 00163000 0011E000 000000000000000000000000000000000 WebViewGoogle.odex 
M 99142000 00000000 00004000 A462FE1789263D0E8497C8BBFB34DD180 libwebviewchromium_plat_support.so 
M 9D2A0000 01711000 02831000 000000000000000000000000000000000 base.odex 
M A0C28000 008DC000 01ED0000 EDCB403D8C54B64A8A4907BC5195E0B40 libwebviewchromium.so


------------------------------




일단 해결은 웹뷰 동작과는 상관없는 변수를 Thread내에서 동적할당 하는 것에서 멤버에서 하는 것으로 바꾸었습니다. 

( ex. byte[] tempbuff = new byte[buffSize]; 로 할당하며 여러번 Thread를 반복 호출합니다. )

다수의 사람들은 하단 링크 1,2번째에서 해결법을 찾아가는 듯 합니다. 

Thread 내 동적할당 시 메모리 영역이 NDK에 어떤 영향을 주는가..까지만 '추측'하고 있습니다.


할당 사이즈와 상관없이 특정 상황이 되면 GC가 돌면서 죽습니다.

멤버space에 할당하게되면 아무리 많이 생성해도 죽지않는 것이 보입니다. 


IDE의 Heap Analyzer를 사용해 Heap을 추적해보면 

1byte array를 96바이트 크기로 할당한 인스턴스 갯수를 확인할 수 있는데 

멤버에 할당할 경우 3천개가 넘는 인스턴스를 할당해도 죽지 않는 것을 확인할 수 있습니다. 


반대로 Thread 내에서 할당하면 100개도 못넘기고 GC가 발생하면 뻗습니다. 



        

▲ 클릭하면 커집니다 



* 가장 많은 답변은 하드웨어 가속을 꺼보라..지만 해결은 되지 않았습니다. 이 방법은 웹뷰 하나만 구동할 때 이슈가 생기면 해결가능 할 것 같습니다.  보통의 질문자들은 아래 두 링크에서 해결법을 찾는 것 같았습니다.

http://fsteam.tistory.com/100        


 또, 캐쉬 정리도 해보았지만..

http://stackoverflow.com/questions/17187338/android-fatal-signal-11-sigsegv-in-webviewcorethre



* 구글 이슈 트래킹에도 리포트 되었지만 1년넘게 아무도 명확한 해결법을 모릅니다. 4.4버전 이후에 Webview가 Native에서 분리되면서 생기는 이슈 같습니다. 

https://code.google.com/p/android/issues/detail?id=175143



 * 조사 중에 Android GDI Component에 대해서도 나왔었고 WebView initial process 도 나왔었네요 (그냥 그렇구나..하고 넘어갑니다 )

http://blog.naver.com/mesa_/120197083820 

http://leliang.elastos.org/2015/05/12/android-5-0-webview-initialize-process/ 



* 예전 리뷰 때 나왔던 왜 getApplicationContext()를 써야하는지와 memory leaks on android도 나옵니다 (영어 공부의 필요성을 느낍니다)

http://stackoverflow.com/questions/3130654/memory-leak-in-webview 

http://www.curious-creature.com/2008/12/18/avoid-memory-leaks-on-android/ 



* 안드로이드 메모리 누수 관리 - 이건 좀 볼만 합니다

Android application에서 memory leak 관리하기
https://bbingju.wordpress.com/2013/08/08/android-memory-leak/

Android 앱 메모리 최적화 - 라인 개발자
http://d2.naver.com/helloworld/539525

변수 선언 위치에 따른 메모리 할당 동작 ( 2번째 답변을 참고하세요. )
http://stackoverflow.com/questions/10554604/memory-allocation-with-thread



* 크롬에서 Webview 디버깅 하는 방법도 있습니다

첨부 이미지 chrome_webview_debug.jpg처럼 현재 사용하는 webview와 백그라운드의 것들이 보이게 됩니다.

http://blog.naver.com/tommybee/220570552769 



여기까지 입니다. 






'Technology > Android' 카테고리의 다른 글

[Android] Activity onUserInteraction()  (0) 2017.09.08
ConcurrentModificationException  (0) 2017.02.17
[Android] EditText 글자 길이 제한  (0) 2016.09.20
Android, Handler, Thread, Looper, Message  (0) 2016.05.30
Refreshing external folders  (0) 2016.05.25
Comments