营销网站seo推广,网站建设重庆最加科技,大兴网站建设设计公司,wordpress typo3内存优化#xff0c;内存抖动和内存泄漏。#xff08;东方头条#xff09;
这道题想考察什么#xff1f;
内存抖动与内存泄漏是什么#xff0c;会对程序造成什么影响#xff1f;为什么会产生这些影响#xff1f;
考察的知识点
内存优化、JVM GC
考生如何回答
什么…内存优化内存抖动和内存泄漏。东方头条
这道题想考察什么
内存抖动与内存泄漏是什么会对程序造成什么影响为什么会产生这些影响
考察的知识点
内存优化、JVM GC
考生如何回答
什么是内存抖动
在Java中每创建一个对象就会申请一块内存存储对象信息每分配一块内存程序的可用内存也就少一块当程序被占用的内存达到一定临界程度GC 也就是垃圾回收器Garbage Collector就会出动来释放掉一部分不再被使用的内存。 这本身没有问题但是当频繁创建对象就会造成内存不断地攀升在回收了之后又迅速涨起来接着又一次的回收。在短时间内反复地发生内存增长和回收这就是内存抖动Memory Churn。
我们可以通过 Android Studio 的 Memory Profiler 来直观地观察到这种现象 内存抖动的问题
内存抖动可能导致程序卡顿甚至OOM内存溢出。
卡顿
内存的回收在Java当中采用的是GC机制无论是何种方式实现的GC在执行的时候都不可避免的需要 STWStop The World 。STW意味着我们所有的工作线程都将会被暂停虽然这个时间很短但终究是有时间成本的。一两次内存回收不容易被用户察觉但多次内存回收行为集中在短时间内爆发这就造成了比较大的界面卡顿的风险。 例如当用户点击某个按钮或者在界面中进行滑动时此时虚拟机在运行GC线程进行内存回收那响应用户点击事件的线程就被GC暂停了只能在恢复后才能响应因此给到用户最直观的感受就是程序卡了。
OOM
内存抖动除了可能造成卡顿之外也可能会造成内存溢出(OOM)。这是因为如果垃圾回收的实现采用的是标记-清除算法那么此算法可能导致大量的内存碎片。
当我们程序频繁的创建与回收对象内存抖动那么可能就会导致程序中连续内存不足。比如上图中我们需要创建一个占用10个格子大小内存的字节数组对象此时就会出现OOM。因为虽然在内存回收后拥有不止10个格子大小的可用内存但是没有10个连续的白色格子可用内存。这就是内存碎片空闲的连续空间比要申请的空间小导致这些小内存块不能被利用。 Android 在官方文档和 Android Studio 里都建议我们尽量避免在 View的onDraw() 里创建对象就是因为onDraw方法可能会被频繁的调用。因此我们应该避免在可能会频繁被执行的、循环体内创建一个新对象。 什么是内存泄露
内存泄漏Memory Leak是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放造成系统内存的浪费导致程序运行速度减慢甚至系统崩溃等严重后果。 在Java中就是该释放的对象无法被释放那这些对象将一直内存最终导致程序可用内存越来越少直至无内存可用OOM。
为什么会出现这种情况这就需要了解GC机制是如何判断一个对象是否可被回收的。垃圾对象检测主要有两种算法引用计数法和可达性分析法
引用计数法
所谓的引用计数法就是给每个对象一个引用计数器每当有一个地方引用它时计数器就会加1当引用失效时计数器的值就会减1任何时刻计数器的值为0的对象就是不可能再被使用的但是当两个对象互相引用会导致无法回收。
这种方法没有被Java使用Java中采用的是可达性分析法.
可达性分析法
通过一系列称为“GC Roots”的对象作为起始点从这些节点向下搜索搜索所有的引用链当一个对象到GC Roots没有任何引用链即GC Roots到对象不可达时则证明此对象是不可用的。 比如当我们某个Activity在finish退出之后我们希望这个Activity对象能及时被回收掉但是因为此Activity对象被一个单例(GC Root)引用着那就导致Activity无法被回收出现内存泄露。
public class Manager {//GC ROOTprivate static final Manager ourInstance new Manager();private Context mContext; //mContext是Activity则会导致此Activity被GC Root持有引用public static Manager getInstance() {return ourInstance;}private Manager() {}public void init(Context context){mContext context;}
}而要修改上面的代码可以在允许传递Application的情况下尽量传递Application或者直接使用context.getApplicationContext()避免传递Activity。也可以采用非强引用的方式见Java中有几种引用关系它们的区别是什么
最后
我整理了一套Android面试题合集除了以上面试题还包含【Java 基础、集合、多线程、虚拟机、反射、泛型、并发编程、Android四大组件、异步任务和消息机制、UI绘制、性能调优、SDN、第三方框架、设计模式、Kotlin、计算机网络、系统启动流程、Dart、Flutter、算法和数据结构、NDK、H.264、H.265.音频编解码、FFmpeg、OpenMax、OpenCV、OpenGL ES】
有需要的朋友可以扫描下方二维码免费领取全部面试题答案解析