美文网首页
面试题-第一期

面试题-第一期

作者: 努力生活的西鱼 | 来源:发表于2019-05-13 13:33 被阅读0次
    内存泄漏&&内存溢出

    参考博客
    参考博客

    先来看看内存泄漏,内存溢出,OOM,GC回收这几个概念。
    App的堆内存空间想象成一个杯子,内存就是里面的水。当你的App启动后,系统会分配给App一个堆空间,起始不会很大比如是32M(根据你的App启动时的内存申请为准)

    640.png

    随着程序的运行对象的创建越来越多,系统不断增加内存分配: 32M ~> 64M ~> ...
    GC回收则会定时扫描内存,发现不被引用的对象即可回收。正常来说你的App堆内存会有升有降。此时如果有某个Activity持有某个引用,在onDestroy时还不把引用设为null,那么返回进入退出这个界面,Activity就会创建很多次从而存在多个实例,导致堆内存直升不降! 这就叫做内存泄漏

    当用户重复这个操作或者有多个不同Activity内存泄漏时,App运行一段时间堆内存超过系统规定的最大值heapSize,杯子满了就会发现出现溢出(OOM)App崩溃。

    内存泄漏: 指对象不再使用,本该被回收,却因为有其他正在使用的对象持有该对象的引用,而无法被JVM回收。

    内存泄漏的影响:

    a: 应用可用内存减少,增加堆内存压力
    b: 频繁触发GC,会降低应用的性能
    c: 到一定程度会导致内存溢出错误

    Android开发中常见内存泄漏及解决办法

    a: 静态变量生命周期与应用的生命周期一样,如果静态变量持有某个Activity的上下文,则对应Activity无法释放,导致内存泄漏(单例模式)。解决办法:使用Application的上下文。
    b: Handler消息队列存在延时消息导致内存泄漏。解决办法:在onDestroy方法中取消注册。
    c: 各种注册的监听器忘记移除导致内存泄漏。解决办法:在onDestroy方法中取消注册

    内存泄漏排查工具

    AS Monitor
    MAT
    LeakCanary

    2. HashMap和Hashtable的区别

    HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而HashTable不允许。

    HashMap是HashTable的轻量级实现(非线程安全的实现),它们都完成了Map接口,由于非线程安全,效率上可能高于HashTable。

    HashMap把HashTable的contains方法去掉了,改成containsvalue和containsKey。

    HashMap是Java1.2引进的Map interface的一个实现,HashTable继承自Dictionary类。

    HashTable的方法是Synchronize的,而HashMap不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供同步。但是如果使用Java 5或以上的话,可以用ConcurrentHashMap代替HashTable。

    HashTable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差别。

    3. ScrollView嵌套ListView的解决方案及其原理

    自定义ListView解决: 重写其中的onMeasure()方法

    原因: ScrollView默认把Childview设置为UNSPEFEIED模式,而该模式下的ListView给自己的测量的高度就是第一个item的高度。
    原理:

    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
    

    这个方法的作用是根据大小和模式来生成一个int值,这个int值封装了模式和大小信息。
    (未完...)

    4.

    相关文章

      网友评论

          本文标题:面试题-第一期

          本文链接:https://www.haomeiwen.com/subject/cgulaqtx.html