Android面试被问到内存泄漏了咋整?

Android最新实习面试经验总结,androidframework面试 (一)调整好心态心态是一个人能否成功的关键,如果不调整好自己的心态,是很难静下心来学习的,尤其是现在这么浮躁的社会,大部分的程序员的现状就是三点一线,感觉很累,一些大龄的程序员更多的会感到焦虑,而且随着年龄的增长,这种焦虑感会越来越强烈,那么唯一的解决办法就是调整好自己的心态,要做到自信、年轻、勤奋。这样的调整,一方面对自己学习有帮助,另一方面让自己应对面试更从容,更顺利。(二)时间挤一挤,制定好计划一旦下定决心要提升自己,那么再忙的情况下也要每天挤一挤时间,切记不可“两天打渔三天晒网”。 阅读详情

前言

内存泄漏即该被释放的内存没有被及时的释放,一直被某个或某些实例所持有却不再使用导致GC不能回收。

Java内存分配策略
Java程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配。对应的三种策略使用的内存空间是要分别是静态存储区(也称方法区),栈区,和堆区。

  • 静态存储区(方法区):主要存放静态数据,全局static数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。
  • 栈区:当方法执行时,方法内部的局部变量都建立在栈内存中,并在方法结束后自动释放分配的内存。因为栈内存分配是在处理器的指令集当中所以效率很高,但是分配的内存容量有限。
  • 堆区:又称动态内存分配,通常就是指在程序运行时直接new出来的内存。这部分内存在不适用时将会由Java垃圾回收器来负责回收。

栈与堆的区别:
在方法体内定义的(局部变量)一些基本类型的变量和对象的引用变量都在方法的栈内存中分配。当在一段方法块中定义一个变量时,Java就会在栈中为其分配内存,当超出变量作用域时,该变量也就无效了,此时占用的内存就会释放,然后会被重新利用。

堆内存用来存放所有new出来的对象(包括该对象内的所有成员变量)和数组。在堆中分配的内存,由Java垃圾回收管理器来自动管理。在堆中创建一个对象或者数组,可以在栈中定义一个特殊的变量,这个变量的取值等于数组或对象在堆内存中的首地址,这个特殊的变量就是我们上面提到的引用变量。我们可以通过引用变量来访问堆内存中的对象或者数组。
举个例子:

public class Sample {
    int s1 = 0;
    Sample mSample1 = new Sample();

    public void method() {
        int s2 = 0;
        Sample mSample2 = new Sample();
    }
}
    Sample mSample3 = new Sample();

如上局部变量s2和mSample2存放在栈内存中,mSample3所指向的对象存放在堆内存中,包括该对象的成员变量s1和mSample1也存放在堆中,而它自己则存放在栈中。

结论:
局部变量的基本类型和引用存储在栈内存中,引用的实体存储在堆中。——因它们存在于方法中,随方法的生命周期而结束。

成员变量全部存储于堆中(包括基本数据类型,引用和引用的对象实体)。——因为它们属于类,类对象终究要被new出来使用。

了解了Java的内存分配之后,我们再来看看Java是怎么管理内存。

Java是如何管理内存

由程序分配内存,GC来释放内存。内存释放的原理为该对象或者数组不再被引用,则JVM会在适当的时候回收内存。

内存管理算法:
1.引用计数法:对象内部定义引用变量,当该对象被某个引用变量引用时则计数加1,当对象的某个引用变量超出生命周期或者引用了新的变量时,计数减1。任何引用计数为0的对象实例都可以被GC。这种算法的优点是:引用计数收集器可以很快的执行,交织在程序运行中。对程序需要不被长时间打断的实时环境比较有利。缺点:无法检测出循环引用。

引用计数无法解决的循环引用问题如下:

    public void method() {
        //Sample count=1
        Sample ob1 = new Sample();
        //Sample count=2
        Sample ob2 = new Sample();
        //Sample count=3
        ob1.mSample = ob2;
        //Sample count=4
        ob2.mSample = ob1;
        //Sample count=3
        ob1=null;
        //Sample count=2
        ob2=null;
        //计数为2,不能被GC
    }

Java可以作为GC ROOT的对象有:虚拟机栈中引用的对象(本地变量表),方法区中静态属性引用的对象,方法区中常量引用的对象,本地方法栈中引用的对象(Native对象)

1.标记清除法:从根节点集合进行扫描,标记存活的对象,然后再扫描整个空间,对未标记的对象进行回收。在存活对象较多的情况下,效率很高,但是会造成内存碎片。

2.标记整理算法:同标记清除法,只不过在回收对象时,对存活的对象进行移动。虽然解决了内存碎片的问题但是增加了内存的开销。

3.复制算法:此方法为克服句柄的开销和解决堆碎片。把堆分为一个对象面和多个空闲面。把存活的对象copy到空闲面,主要空闲面就变成了对象面,原来的对象面就变成了空闲面。这样增加了内存的开销,且在交换过程中程序会暂停执行。

4.分代算法:
分代垃圾回收策略,是基于:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。

年轻代:

1.所有新生成的对象首先都是存放在年轻代。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。

2.新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。

3.当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收

4.新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)

年老代:

1.在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

2.内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

持久代:

用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。

Android常见的内存泄漏汇总
集合类泄漏

   List<Object> objectList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Object o = new Object();
            objectList.add(o);
            o = null;
        }

上面的实例,虽然在循环中把引用o释放了,但是它被添加到了objectList中,所以objectList也持有对象的引用,此时该对象是无法被GC的。因此对象如果添加到集合中,还必须从中删除,最简单的方法

  //释放objectList
        objectList.clear();
        objectList=null;

单例造成的内存泄漏
由于单例的静态特性使得其生命周期跟应用的生命周期一样长,所以如果使用不恰当的话,很容易造成内存泄漏。比如下面一个典型的例子。

public class SingleInstanceClass {

    private static SingleInstanceClass instance;

    private Context mContext;

    private SingleInstanceClass(Context context) {
        this.mContext = context;
    }

    public SingleInstanceClass getInstance(Context context) {
        if (instance == null) {
            instance = new SingleInstanceClass(context);
        }
        return instance;
    }
}

正如前面所说,静态变量的生命周期等同于应用的生命周期,此处传入的Context参数便是祸端。如果传递进去的是Activity或者Fragment,由于单例一直持有它们的引用,即便Activity或者Fragment销毁了,也不会回收其内存。特别是一些庞大的Activity非常容易导致OOM。

正确的写法应该是传递Application的Context,因为Application的生命周期就是整个应用的生命周期,所以没有任何的问题。

public class SingleInstanceClass {

    private static SingleInstanceClass instance;

    private Context mContext;

    private SingleInstanceClass(Context context) {
        this.mContext = context.getApplicationContext();// 使用Application 的context
    }

    public SingleInstanceClass getInstance(Context context) {
        if (instance == null) {
            instance = new SingleInstanceClass(context);
        }
        return instance;
    }
}

or

//在Application中定义获取全局的context的方法
 /**
     * 获取全局的context
     * @return 返回全局context对象
     */
    public static Context getContext(){
        return context;
    }

public class SingleInstanceClass {

    private static SingleInstanceClass instance;

    private Context mContext;

    private SingleInstanceClass() {
       mContext=MyApplication.getContext;
    }

    public SingleInstanceClass getInstance() {
        if (instance == null) {
            instance = new SingleInstanceClass();
        }
        return instance;
    }
}

匿名内部类/非静态内部类和异步线程

  • 非静态内部类创建静态实例造成的内存泄漏
    我们都知道非静态内部类是默认持有外部类的引用的,如果在内部类中定义单例实例,会导致外部类无法释放。如下面代码:
public class TestActivity extends AppCompatActivity {
    public static InnerClass innerClass = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (innerClass == null)
            innerClass = new InnerClass();
    }
    private class InnerClass {
        //...
    }
}

当TestActivity销毁时,因为innerClass生命周期等同于应用生命周期,但是它又持有TestActivity的引用,因此导致内存泄漏。

正确做法应将该内部类设为静态内部类或将该内部类抽取出来封装成一个单例,如果需要使用Context,请按照上面推荐的使用Application 的 Context。当然,Application 的 context 不是万能的,所以也不能随便乱用,对于有些地方则必须使用 Activity 的 Context,对于Application,Service,Activity三者的Context的应用场景如下:
在这里插入图片描述

  • 匿名内部类
    android开发经常会继承实现Activity/Fragment/View,此时如果你使用了匿名类,并被异步线程持有了,那要小心了,如果没有任何措施这样一定会导致泄露。如下代码:
public class TestActivity extends AppCompatActivity {
  //....

    private Runnable runnable=new Runnable() {
        @Override
        public void run() {

        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       //......
    }

}

上面的runnable所引用的匿名内部类持有TestActivity的引用,当将其传入异步线程中,线程与Activity生命周期不一致就会导致内存泄漏。

  • Handler造成的内存泄漏
    Handler造成内存泄漏的根本原因是因为,Handler的生命周期与Activity或者View的生命周期不一致。Handler属于TLS(Thread Local Storage)生命周期同应用周期一样。看下面的代码:
public class TestActivity extends AppCompatActivity {
    private Handler mHandler = new Handler() {
        @Override
        public void dispatchMessage(Message msg) {
            super.dispatchMessage(msg);
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
            //do your things
            }
        }, 60 * 1000 * 10);

        finish();
    }
}

在该TestActivity中声明了一个延迟10分钟执行的消息 Message,mHandler将其 push 进了消息队列 MessageQueue 里。当该 Activity 被finish()掉时,延迟执行任务的Message还会继续存在于主线程中,它持有该 Activity 的Handler引用,所以此时 finish()掉的 Activity 就不会被回收了从而造成内存泄漏(因 Handler 为非静态内部类,它会持有外部类的引用,在这里就是指TestActivity)。

修复方法:采用内部静态类以及弱引用方案。代码如下:

public class TestActivity extends AppCompatActivity {
    private MyHandler mHandler;

    private static class MyHandler extends Handler {
        private final WeakReference<TestActivity> mActivity;

        public MyHandler(TestActivity activity) {
            mActivity = new WeakReference<>(activity);
        }

        @Override
        public void dispatchMessage(Message msg) {
            super.dispatchMessage(msg);
            TestActivity activity = mActivity.get();
            //do your things
        }
    }

    private static final Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            //do your things
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHandler = new MyHandler(this);
        mHandler.postAtTime(mRunnable, 1000 * 60 * 10);

        finish();
    }

}

需要注意的是:使用静态内部类 + WeakReference 这种方式,每次使用前注意判空。
前面提到了 WeakReference,所以这里就简单的说一下 Java 对象的几种引用类型。
Java对引用的分类有 Strong reference, SoftReference, WeakReference, PhatomReference 四种。
在这里插入图片描述
ok,继续回到主题。前面所说的,创建一个静态Handler内部类,然后对 Handler 持有的对象使用弱引用,这样在回收时也可以回收 Handler 持有的对象,但是这样做虽然避免了Activity泄漏,不过Looper 线程的消息队列中还是可能会有待处理的消息,所以我们在Activity的 Destroy 时或者 Stop 时应该移除消息队列 MessageQueue 中的消息。

下面几个方法都可以移除 Message:

public final void removeCallbacks(Runnable r);

public final void removeCallbacks(Runnable r, Object token);

public final void removeCallbacksAndMessages(Object token);

public final void removeMessages(int what);

public final void removeMessages(int what, Object object);

尽量避免使用 staic 成员变量

如果成员变量被声明为 static,那我们都知道其生命周期将与整个app进程生命周期一样。

这会导致一系列问题,如果你的app进程设计上是长驻内存的,那即使app切到后台,这部分内存也不会被释放。按照现在手机app内存管理机制,占内存较大的后台进程将优先回收,意味着如果此app做过进程互保保活,那会造成app在后台频繁重启。就会出现一夜时间手机被消耗空了电量、流量,这样只会被用户弃用。

这里修复的方法是:不要在类初始时初始化静态成员。可以考虑lazy初始化。架构设计上要思考是否真的有必要这样做,尽量避免。如果架构需要这么设计,那么此对象的生命周期你有责任管理起来。

避免 override finalize():

  • finalize 方法被执行的时间不确定,不能依赖与它来释放紧缺的资源。时间不确定的原因是: 虚拟机调用GC的时间不确定以及Finalize daemon线程被调度到的时间不确定。
  • finalize 方法只会被执行一次,即使对象被复活,如果已经执行过了 finalize 方法,再次被 GC 时也不会再执行了,原因是:含有 finalize 方法的 object 是在 new 的时候由虚拟机生成了一个 finalize reference 在来引用到该Object的,而在 finalize 方法执行的时候,该 object 所对应的 finalize Reference 会被释放掉,即使在这个时候把该 object 复活(即用强引用引用住该 object ),再第二次被 GC 的时候由于没有了 finalize reference 与之对应,所以 finalize 方法不会再执行。
  • 含有Finalize方法的object需要至少经过两轮GC才有可能被释放。
面试题之内存泄漏相关 前天刚经历了一场面试,还好这次备足了功课,一面完了直接二面,接着又复试,顺利拿到了offer哈哈,还是很开心的。(好了,装逼到此结束)。虽然自己在一面时候会的东西都发挥的很好,但是有好几个知识点还是被面试官问的一脸懵逼,只能舔的脸说:“不好意思,这个不太了解。。”。这几天针对这次的面试遗留的问题,要开始逐个击破了,其中有一个点就是内存泄漏。相信学过c的大家都知道内存泄漏的大概概念,但是如果真的说个... 阅读详情

相关推荐

安卓Android面试-综合题汇总九万字

文章摘要 本文详细解析了Android Activity的核心机制:1)启动流程涉及客户端与服务端的跨进程通信,包括根Activity的创建过程;2)状态保存与恢复(onSaveInstanceState/onRestoreInstanceState)的触发条件及版本差异;3)四种启动模式(standard/singleTop/singleTask/singleInstance)的特点与适用场景;4)Activity跳转与返回时的生命周期执行顺序;5)系统交互事件(横竖屏切换、Home键、锁屏等)对生命周期

编程小鹏的博客 1294

关于内存泄漏的经典面试题

对于C/C++程序员来说,或多或少都会被面试官问到关于内存泄漏的问题,内存泄漏是程序的bug,他会一点一点的侵蚀你的内存,导致程序运行一段时间后会莫名崩溃,本文就主要讲解如何不使用工具来查找内存泄漏的问题;

Nice_W的博客 671

Android常见面试题——内存泄漏原因及解决办法

前言 面试中最常问的就是:“你了解Android内存泄漏和Android内存溢出的原因吗,请简述一下” ,然后大多数的人都能说出原因及其例子和解决办法,但是实际项目中稍微不注意还是会导致内存泄漏,今天就来梳理一下那些是常见的内存泄漏写法和解决方法。 原因 内存泄漏的原理很多人都明白,但是为了加强大家的防止内存泄漏的意识,我再来说一遍。说到内存泄漏的原理就必须要讲一下Java的GC的。Java...

weixin_43901866的博客 2058

Android 面试题 内存泄露的原因 二

在Android开发过程中,当一个对象已经不需要再使用了,本该被回收时,而另个正在使用的对象持有它引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。它是造成应用程序OOM的主要原因之一;由于Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时,就难免会导致应用所需要的内存超过系统分配的内存限额,这就造成了内存泄漏而导致应用Crash;

我很好 686

22届(华为od)-安卓面经-哈哈哈,第一份安卓的面经

本文分享了应聘华为OD岗位的全流程经验,包括机考、综测、三轮技术面和主管面。机考涉及数组处理、算法等题目,技术面重点考察Java线程、安卓开发、设计模式等知识点,面试官会根据简历深度提问。作者通过栗栗姐获得笔试资料和面试指导,最终谈薪16k成功。建议:1)系统学习《代码随想录》打基础;2)针对简历预判问题;3)多面试积累经验;4)遇到困难及时与HR沟通。文末附栗栗姐招聘信息,涵盖多个技术岗位和工作地点。

2401_86909848的博客 1345

倍福ADS通讯协议深度解析——从握手到数据包的完整旅程

本文以工程师视角,通过Wireshark抓包实战,深度解析了倍福ADS通讯协议的完整工作流程。从TCP三次握手建立连接,到拆解AMS/TCP信封、AMS Header地址与命令解析,再到ADS Data读写请求的载荷构成,完整呈现了一次数据通讯的“旅程”。文章重点剖析了协议包格式,并结合实际案例,提供了基于协议分析的故障排查思路,帮助开发者深入理解并精准调试工业自动化系统通讯。

weixin_29231725的博客 151

Android面试标准答案:内存泄漏是什么?内存泄漏的原因?解决方案?

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套。

2401_84103844的博客 998

零成本实现飞牛 OS 内网穿透:CloudFlare 隧道搭建全攻略

一、引言:突破内网限制的最优解当你的内网环境中部署了飞牛 OS 系统(无论是老旧电脑还是 NAS 设备),想要实现公网访问时,传统方案往往面临两大痛点:公网 IP 申请困难且成本高DDNS 动态解析配置复杂专业内网穿透工具存在付费门槛今天为大家带来零成本解决方案:通过免费域名搭配 CloudFlare 隧道技术,无需公网 IP 即可轻松实现飞牛 OS 服务的公网访问。全程操作可视化,新手也能快速上手!二、前期准备:必备工具清单(1)域名准备。

Honmaple的博客 7488

C++ 内存管理 —— 如何定位内存泄漏(valgrind)

定位内存泄漏(valgrind)定位内存泄漏(valgrind)1.1、基本概念1.2、使用方法参考 定位内存泄漏(valgrind) 1.1、基本概念 应用环境:Linux 编程语言:C/C++ 使用方法: 编译时加上-g选项,如 gcc -g filename.c -o filename,使用如下命令检测内存使用情况: #valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./filename 就会看到内存使

JMW1407的博客 7359

PyMOL下载安装教程(附安装包)2025最新版(PyMOL 3.0.3)

本文详细介绍了Windows系统下PyMOL分子建模软件的安装教程。主要内容包括:提供安装包下载链接,强调需关闭杀毒软件;分步骤讲解管理员身份运行安装程序、接受协议、选择安装路径等安装流程;重点说明如何配置隐藏文件夹ProgramData中的许可证文件;最后提供基础使用技巧和常见问题解决方案。该教程适用于需要制作高质量分子结构图的科研人员和新手用户,帮助完成软件部署并顺利开展工作。

progalchemist的博客 3787

实战解析:如何利用MDFEND与Weibo21数据集构建多领域假新闻检测系统

本文实战解析了如何利用MDFEND模型与Weibo21数据集构建多领域假新闻检测系统。文章深入剖析了MDFEND的领域门控与专家混合机制,并提供了从数据预处理、模型理解到训练部署的完整指南,旨在解决通用模型在不同领域新闻检测中的性能衰减问题,提升检测的准确性与适应性。

vulkan6gpu的博客 580

基础面试3:内存溢出 vs 内存泄漏,2024年最新社招面试题目

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

2401_84024576的博客 830

VSCode+Typst零配置写作指南:5分钟搞定论文排版环境(含实时预览技巧)

本文介绍如何利用VSCode和Typst快速搭建零配置的论文排版环境,5分钟内实现高效写作与实时预览。Typst作为轻量级排版工具,结合LaTeX的精度与现代化语法,显著提升学术写作效率,特别适合需要频繁调整格式的研究人员。

weixin_30642561的博客 108

Android面试被问到内存泄漏咋整?

内存泄漏即该被释放的内存没有被及时的释放,一直被某个或某些实例所持有却不再使用导致GC不能回收。 Java内存分配策略 Java程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配。对应的三种策略使用的内存空间是要分别是静态存储区(也称方法区),栈区,和堆区。 静态存储区(方法区):主要存放静态数据,全局static数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行...

weixin_34378969的博客 181

支付宝域名如何加入白名单(扫码老是弹窗)

支付宝扫码之后,遇到非支付宝官方网页,请确认是否继续访问弹窗,问题解决办法。本章教程提供解决办法,亲测有效。

猿小白的博客 9185

文献解读:结构方程模型SEM基础,小白看这个就基本够了

今天要解读的依然是一篇教学文献:The Basics of Structural Equation Modeling,文献作者是Diana Suhr, Ph.D. University of Northern Colorado。 文献链接: https://www.lexjansen.com/wuss/2006/tutorials/TUT-Suhr.pdf 结构方程模型是: 用来检验显变量与潜变量关系假设的综合性的统计技巧 用来表示,估计或者检验变量间理论关系的技巧 用来探究一系列潜变量和显变量因

Codewar的博客 6万+

android面试内存管理,Android面试被问到内存泄漏了杂整?

内存泄漏即该被释放的内存没有被及时的释放,一直被某个或某些实例所持有却不再使用导致GC不能回收。Java内存分配策略Java程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配。对应的三种策略使用的内存空间是要分别是静态存储区(也称方法区),栈区,和堆区。静态存储区(方法区):主要存放静态数据,全局static数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存...

weixin_39953481的博客 110

自适应控制 (Adaptive Control) 算法详解及案例分析

自适应控制是一种能够在线调整控制器参数以适应系统动态变化的控制方法。其核心思想是通过实时估计系统参数或调整控制器参数,使系统在不确定性或动态变化的环境中仍能保持稳定性和性能。

闲人编程的博客 4081

android内部类碎片,Android面试被问到内存泄漏了杂整?

内存泄漏即该被释放的内存没有被及时的释放,一直被某个或某些实例所持有却不再使用导致GC不能回收。Java内存分配策略Java程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配。对应的三种策略使用的内存空间是要分别是静态存储区(也称方法区),栈区,和堆区。静态存储区(方法区):主要存放静态数据,全局static数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存...

weixin_28993311的博客 100

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

2024年华为Android面试真题解析,最新高频安卓面试题目分享

开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝,但你要进去得先学会面试的时候造飞机不是么?作者13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含。

2301_76278775的博客 1032

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

2024年安卓最新Android内存泄漏问题,腾讯字节等大厂面试真题汇总

说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。还有。

erhtre的博客 1156

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

2024年最新Android 常见内存泄漏及解决方法,2024年最新快手安卓面试

这里我希望可以帮助到大家提升进阶。Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84537540的博客 1013

安卓主板开发!Android之内存泄漏调试学习与总结,社招面试心得

背景 坐标广州,五年iOS开发经验。 最近面试了一位工作12年的程序员, 这位老哥有3年java开发经验,2年H5,7年iOS开发经验,简历上写着精通Java,iOS,熟悉H5开发。没有具体的技术点。 说实话我很期待这位老哥的面试,于是让人事邀约了他。 老哥面试的气场很足,我也很尊敬他,一大波的自我介绍之后,我们进入了正题。 我问了他Runloop,他说几乎没用过Runloop,于是我给他举了个小例子,老哥给我的答案是百度可以解决。 于是我有问了他KVC,老哥还是说不清楚,于是我问了最基础的copy,wea

clhcowboy的博客 404

安卓面试题 5 – 关于内存泄漏

什么是内存泄漏 内存泄露,简单的说,就是该被释放的内存没有被释放,一直被某个或某些实例所引用但不能被使用,导致GC不能回收,造成内存泄漏。总结的说,可以理解为长生命周期的对象一直持有短生命周期对象的引用,导致短生命周期对象一直被引用而无法被GC回收,内存泄漏是造成OOM的主要原因之一,当一个应用中产生的内存泄漏比较多时,就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢

Charles的博客 689
上一篇: 再学Android之WebView
下一篇: 2019中级Android开发面试解答之设计模式篇
初壹十五a
博客等级 码龄8年 146粉丝 257原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值