zoukankan      html  css  js  c++  java
  • android studio 调试时内存溢出,闪退。

    最近遇到一个奇怪的问题,调试的时候出现闪退问题,抛出下面的异常。

    java.lang.OutOfMemoryError
    Could not allocate JNI Env

    百度了下有以下解释:

    OutOfMemoryError异常的常见原因有以下解释:

    1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
    2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
    3.代码中存在死循环或循环产生过多重复的对象实体;
    ————————————————
    版权声明:本文为CSDN博主「fish520water」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/fishandbean/article/details/92768745

    然后我检查了一遍又一遍的代码,问题还是没有得到解决。最后又通过百度搜索,了解到个解决办法,就是在AndroidMainifest.xml文件设置application的属性

    android:hardwareAccelerated="true"
    android:largeHeap="true"

    虽然问题解决了,但不知道这个什么意思,之后了解到,第一个属性是开启硬件加速(问题感觉不大),第二个是请求系统为Dalvik虚拟机分配更大的内存空间(总感觉不靠谱,所以又把这个去掉了。)

    后来我发现如果不通过Android studio进行调试,正常安装启动app是不会闪退的。然后无意间瞅到有个layout Intspector窗口,上面显示的就是app的画面。百度去了解了下这个是什么东西,并且先关了后再试了下调试。发现居然不会闪退了

    关闭相关设置

    最终问题解决了,原来是布局嵌套太多层,上传布局结构到pc,导致手机app出现大量内存的使用(占用了128m)

    解决这个问题的方法: 尽量不要出现太多层的布局嵌套(比如我:一个activity承载了四五个页面的能力,类似于单页应用,各个布局通过控制布局的visibility属性来显示/隐藏;后果就是一个xml:1500行臃肿代码。)

    或者调试的时候关闭ide的layout Intspector这个功能

  • 相关阅读:
    spring 环绕通知 ProceedingJoinPoint 执行proceed方法的作用是什么
    SpringMVC之RequestContextHolder分析
    MySQL中索引不会被用到的情况
    使用Stream快速对List进行一些操作
    Vue中this.$refs[name].resetFields();的使用
    好看的字体
    转,javascript中call()、apply()、bind()的用法终于理解
    vue中的$props
    手机端页面自适应解决方案-rem布局
    查看项目里特定npm包的版本号
  • 原文地址:https://www.cnblogs.com/Dmail/p/14976493.html
Copyright © 2011-2022 走看看