Android面试题——高级开发面试题2
一 面试题概述
- 回答自己理解的java虚拟机、gc机制
- Java多线程、线程池
- 集合原理(hashmap,list)
- java虚引用
- 封装、继承、多态的理解
- activity生命周期
- 安卓activity和fragment数据传递
- Handler
- 内存泄漏、内存溢出、内存抖动 原因及解决办法
- ANR原因以及解决办法
- 性能优化、卡顿优化
- 事件分发机制
二 面试题解答
2.1 回答自己理解的java虚拟机、gc机制
2.1.1 java虚拟机
1-概念
1 | Java 虚拟机(JVM,Java Virtual Machine)是Java程序的运行环境,负责执行编译后的字节码文件(.class 文件)。 |
2-JVM基本构成
JVM主要包括四个部分:
1-类加载器(ClassLoader):
在 JVM 启动时或者在类运行将需要的 class 加载到 JVM 中(下图表示了从 java 源文件到 JVM 的整个过程,可配合理解)
2-执行引擎:负责执行 class 文件中包含的字节码指令
1 | 解释器:逐行解释执行字节码。 |
3-内存区(也叫运行时数据区):
是在 JVM 运行的时候操作所分配的内存区。 运行时内存区主要可以划分为 5个区域,如下图:
方法区(MethodArea)、java 堆(Heap)、java 栈(Stack)、程序计数器(PCRegister)、本地方法栈(Native MethodStack)、
1 | 堆:存储 Java 中的对象,是垃圾回收的主要区域。 |
4-垃圾回收器(Garbage Collector):负责自动回收不再使用的对象,避免内存泄漏。
2.1.2 gc机制
1-概念
1 | 垃圾回收(GC)是JVM中自动管理内存的一种机制,旨在清理不再使用的对象并释放内存空间,避免内存泄漏。 |
2-Java 中有四种引用类型
1 | 强引用、软引用、弱引用、虚引用 |
3-如何判断强引用是 否存在呢?
1 | 引用计数法,有对这个对象的引用就+1,不再引用就-1, 但是这种方式看起来简单美好,但它却不能解决循环引用计数的问题 |
4-GC Roots 对象通常包括
1 | * 虚拟机栈中引用的对象(栈帧中的本地变量表) |
5-可达性分析算法整个流程
1 | * 第一次标记:对象在经过可达性分析后发现没有与GC Roots有引用链,则进行第一次标记并进行一次筛选, |
6-GC 的工作流程:
1 | 1.标记阶段:标记所有仍然被引用的对象。 |
7-GC 的不同算法:
1 | * 标记-清除(Mark-sweep):首先标记活跃对象,然后清除未被标记的对象。缺点是会产生内存碎片。 |
8-垃圾回收的关键概念
1 | 年轻代(Young Generation):新创建的对象一般会分配到年轻代,垃圾回收会频繁地在此进行。 |
9-GC 优化:
1 | 对象池:通过对象池复用对象,减少 GC 的次数。 |
2.2 Java多线程、线程池-见参考
2.2.1 Java多线程
1-java线程创建的方式
1 | * 继承Thread类 |
2-请详细描述一下线程从创建到死亡的几种状态都有哪些?
1 | * 新建(new):新创建了一个线程对象。 |
3-sleep()和wait()区别
1 | * sleep()来自thread,wait()来自object(); |
4-在 Java 程序中怎么保证多线程的运行安全?
1 | * 方法一:使用安全类,比如 Java. util. concurrent 下的类。 |
5-JAVA如何在两个线程之间共享数据
1 | Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性原子性。 |
2.2.2 线程池
1-为什么用线程池
1 | 线程池本质上是一种池化技术,而池化技术是一种资源复用的思想,为了减少线程频繁创建和销毁带来的性能开销, |
2-解释下线程池参数(线程池参数七大参数)
1 | * corePoolsize 核心线程数:正常情况下创建的工作的线程数,这些线程创建后并不会立马消除,一种常驻住线程 |
3-Java线程池的工作流程
1 | * 线程池判断核心线程池里的核心线程是否都在执行任务。 如果不是,让空闲的核心线程来执行任务。 |
4-线程池都有哪些状态?
1 | * RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。 |
5-Java线程池如何合理配置核心线程数?如何去设置呢?
1 | * CPU 密集型任务: |
2.3 集合原理(hashmap,list)-见参考
集合框架
1-Java List总结
1)ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
2)Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
3)LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
2-Java Set总结
1)HashSet
底层其实是包装了一个HashMap实现的
底层数据结构是数组+链表 + 红黑树
具有比较好的读取和查找性能, 可以有null 值
通过equals和HashCode来判断两个元素是否相等
非线程安全
2)LinkedHashSet
继承HashSet,本质是LinkedHashMap实现
底层数据结构由哈希表(是一个元素为链表的数组)和双向链表组成。
有序的,根据HashCode的值来决定元素的存储位置,同时使用一个链表来维护元素的插入顺序
非线程安全,可以有null 值
3)TreeSet
是一种排序的Set集合,实现了SortedSet接口,底层是用TreeMap实现的,本质上是一个红黑树原理
排序分两种:自然排序(存储元素实现Comparable接口)和定制排序(创建TreeSet时,传递一个自己实现的Comparator对象)
正常情况下不能有null值,可以重写Comparable接口 局可以有null值了。
3-Map总结
2.4 java虚引用-见参考
1 | 虚引用需要java.lang.ref.PhantomReference类来实现,虚引用顾名思义,就是形同虚设, |
2.5 封装、继承、多态的理解-见参考
1-封装
- 实例讲解什么是封装
- 封装的意义
- 封装原则
- 封装的访问级别
2-继承
- 继承作用:提高了软件复用的效率,缩短了软件开发的周期
- 继承方式:公有继承、私有继承、保护继承
3-多态
- 多态的三个条件
- 编译时多态
- 多态的实现方式:接口多态性、继承多态性、通过抽象类实现的多态性
- 多态的好处:可替换性、可扩充性、灵活性简化性
2.6 activity生命周期
1-activity的生命周期
2-ActivityA 跳转 ActivityB 然后 B 按 back 返回 A,各自的生命周期顺序,A 与 B 均不透明
ActivityA 跳转到 ActivityB
1 | Activity A:onPause |
ActivityB 返回 ActivityA
1 | Activity B:onPause |
2.7 安卓activity和fragment数据传递-见参考
1-Activity向Fragment传递数据—使用Bundle
1 | * Bundle用来存放数据集 |
2-Fragment向Activity传送数据
1 | * 方法一:使用java接口(观察者模式) |
3-实现Fragment之间互传数据
1 | Fragment之间无法互传数据,所以需要一个Activity作为中间桥梁辅助两个Fragment之间的数据传输 |
2.8 Handler-见参考
相关概念
2.9 内存泄漏、内存溢出、内存抖动 原因及解决办法-见参考
2.9.1 内存溢出
1-原因:
1 | 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; |
2-解决方案:
1 | 第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。) |
2.9.2 内存泄漏
1-引起内存泄漏的场景:
1 | - 资源对象没关闭造成的内存泄漏,如查询数据库后没有关闭游标cursor |
2-如何区分:
1 | * 内存泄露, 观察 memory monitor 出现,内存不断增加 然后降低. |
3-内存抖动
1 | 原因:内存抖动出现原因主要是频繁(很重要)在循环里创建对象,导致大量对象在短时间内被创建 |
2.10 ANR原因以及解决办法
1-什么是ANR
1 | ANR(Application Not Responding)即应用程序无响应 |
2-ANR一共有四种类型
1 | * 输入事件类型ANR |
3-如何避免ANR
1 | * 耗时的工作(比如数据库操作,I/O,网络操作),采用单独的工作线程处理 |
2.11 性能优化、卡顿优化-见参考
1-为什么会卡顿
1 | - 读写文件 |
2-如何检测卡顿
1 | * Systrace: |
3-如何优化卡顿
1 | * 文件读写 |
2.12 事件分发机制
三 参考
- java中多线程常见面试题_李大寶的博客-CSDN博客_多线程面试题
- 继承Thread类、实现Runnable接口、实现Callable接口
- Java集合框架最全详解(看这篇就够了)
- JAVA虚引用介绍
- 封装、继承、多态 详解
- Activity与Fragment的通信
- Android——Handler详解
- 内存溢出,内存泄漏,内存抖动
- Android 内存泄漏、内存抖动和内存溢出
- Android ANR分析实践(一):ANR是什么、产生的原因及如何避免ANR
- ANR系列之ContentProvider类型原理讲解
- Android性能优化--卡顿优化与布局优化