Android常见面试题
TCP的三次握手/四次揮手
Android虛擬機和java虛擬機的原理和區別
1、虛擬機簡述
虛擬機即虛構模擬出來的計算機,它是通過軟件模擬仿真的方式來實現各種實際計算機上的功能,它具有完善的架構,如處理器、堆棧、寄存器等,同樣它也有自己的一套指令系統,即字節碼中所使用的各個指令。
2、Java虛擬機簡述
Java虛擬機是實現上述所有邏輯功能、支持運行Java字節碼的一種虛擬機,可以把它理解為架在特定系統上的一層軟件,一般由特定硬件架構的匯編語言、C/C++語言來實現。因此每一種系統平臺的虛擬機底層實現都依賴于具體的操作系統和硬件架構,都需要專門的移植,以保證不同平臺但相同的接口暴露、外部特性和執行結果一致性,從而實現Java程序的字節碼的跨平臺執行。
JVM,Java虛擬機,是運行java程序(字節碼文件)的環境,具有跨平臺性,要運行java程序,必須安裝java程序所運行平臺對應的虛擬機,.java文件是人編寫的,給人看的。.class文件是通過工具處理.java文件后的產物,它是給JVM看的,給JVM操作的
3、Dalvik虛擬機簡述
Dalvik虛擬機和Java虛擬機一樣都是運行Java程序的虛擬機,它專門為嵌入式環境設計的,所以在系統資源有限的情況下也能夠很好的工作,Google官方對Dalvik虛擬機的特點說明:
- 在一個設備上支持多個虛擬機進程
- 針對CPU高度優化的字節碼解釋器
- 非常高效的運行時內存使用
位于Android系統框架的倒數第二層的Android Runtime中,Dalvik虛擬機主要完成對象生命周期管理、堆棧管理、線程管理、安全和異常管理以及垃圾回收等重要功能;每一個Android應用在底層都會對應至少一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。
Android應用雖然也是使用Java語言進行編程,但是在編譯成CLASS文件后,還會通過一個工具(dx)將應用所有的 CLASS文件轉換成一個DEX文件,而后Dalvik虛擬機會從其中讀取指令和數據
Dalvik:應用每次運行的時候,字節碼都需要通過即使編譯器轉化為機器碼,這會拖慢應用運行的效率
ART:應用在第一次安裝的時候,字節碼就會預先編譯成機器碼,使其成為真正的本地應用,應用的啟動和執行都會顯著的提升
4、JVM和DVM的區別
雖然Dalvik也是一種Java虛擬機,但是它與普通的Java虛擬機不同,主要區別在以下幾個方方面
垃圾回收
- Garbage Collection,垃圾收集,垃圾回收
- 強引用,軟引用,弱引用,虛引用
- GC回收會阻塞主線程,可能會引發ANR,Android5.0之前GC回收線程是單線程,Android5.0之后GC回收線程是多線程并發回收
- 非靜態的內部類與匿名類對它們外部的Class有強引用
- GC是按照有向圖是否可達來判斷對象實例是否有用
- 如果不再需要某個實例,卻仍然被引用,這個情況叫做內存泄露
GC為了能夠正確釋放對象,會監控每個對象的運行狀況,對他們的申請、引用、被引用、賦值等狀況進行監控,Java會使用有向圖的方法進行管理內存,實時監控對象是否可以達到,如果不可到達,則就將其回收,這樣也可以消除引用循環的問題。
GC的工作原理
為了更好理解 GC 的工作原理,我們可以將對象考慮為有向圖的頂點,將引用關系考慮為圖的有向邊,有向邊從引用者指向被引對象。另外,每個線程對象可以作為一個圖的起始頂點,例如大多程序從 main 進程開始執行,那么該圖就是以 main 進程頂點開始的一棵根樹。在這個有向圖中,根頂點可達的對象都是有效對象,GC將不回收這些對象。如果某個對象 (連通子圖)與這個根頂點不可達(注意,該圖為有向圖),那么我們認為這個(這些)對象不再被引用,可以被 GC 回收。 以下,我們舉一個例子說明如何用有向圖表示內存管理。對于程序的每一個時刻,我們都有一個有向圖表示JVM的內存分配情況。以下右圖,就是左邊程序運行到第6行的示意圖。
Java使用有向圖的方式進行內存管理,可以消除引用循環的問題,例如有三個對象,相互引用,只要它們和根進程不可達的,那么GC也是可以回收它們的。這種方式的優點是管理內存的精度很高,但是效率較低。另外一種常用的內存管理技術是使用計數器,例如COM模型采用計數器方式管理構件,它與有向圖相比,精度行低(很難處理循環引用的問題),但執行效率很高。
JVM GC垃圾回收機制
內存分配策略
Java 程序運行時的內存分配策略有三種,分別是靜態分配,棧式分配,和堆式分配,對應的三種存儲策略使用的內存空間主要分別是靜態存儲區,也稱方法區,棧區和堆區
靜態存儲區
也叫方法區,主要存放靜態數據、全局 static 數據和常量。這塊內存在程序編譯時就已經分配好,并且在程序整個運行期間都存在。棧區
當方法被執行時,方法體內的局部變量(其中包括基礎數據類型、對象的引用)都在棧上創建,并在方法執行結束時這些局部變量所持有的內存將會自動被釋放。因為棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
分配堆中對象或數組的引用變量堆區
又稱動態內存分配,通常就是指在程序運行時直接 new 出來的內存,也就是對象的實例,數組。這部分內存在不使用時將會由 Java 垃圾回收器來負責回收。
內存管理
- 棧:對象的引用
- 堆:new出來的對象,數組
- 方法區:類信息、常量(常量池)、靜態變量
Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池(Class文件常量池),用于存放編譯器生成的各種字面量和符號引用,這部分內容將在類加載后存放到方法區的運行時常量池中。
- 程序計數器
一塊較小的內存空間,它是當前線程所執行的字節碼的行號指示器,字節碼解釋器工作時通過改變該計數器的值來選擇下一條需要執行的字節碼指令,分支、跳轉、循環等基礎功能都要依賴它來實現。每條線程都有一個獨立的的程序計數器,各線程間的計數器互不影響,因此該區域是線程私有的。
- 用有向圖表示引用關系,可達,存在連接通路,不可達
- GC 為了能夠正確釋放對象,GC 必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC 都需要進行監控。
Java的內存管理就是對象的分配和釋放問題。在 Java 中,程序員需要通過關鍵字 new 為每個對象申請內存空間 (基本類型除外),所有的對象都在堆 (Heap)中分配空間。另外,對象的釋放是由 GC 決定和執行的。在 Java 中,內存的分配是由程序完成的,而內存的釋放是由 GC 完成的,這種收支兩條線的方法確實簡化了程序員的工作。但同時,它也加重了JVM的工作。這也是 Java 程序運行速度較慢的原因之一。因為,GC 為了能夠正確釋放對象,GC 必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC 都需要進行監控。
監視對象狀態是為了更加準確地、及時地釋放對象,而釋放對象的根本原則就是該對象不再被引用。
什么是ANR,如何避免它?
在Android 上,如果你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱作應用程序無響應(ANR:Application Not Responding)對話框。用戶可以選擇讓程序繼續運行,但是,他們在使用你的應用程序時,并不希望每次都要處理這個對話框。因此,在程序里對響應性能的設計很重要,這樣,系統不會顯示ANR 給用戶
不同的組件發生ANR 的時間不一樣,主線程(Activity、Service)是5 秒,BroadCastReceiver 是10 秒
解決方案
將所有耗時操作,比如訪問網絡,Socket 通信,查詢大量SQL 語句,復雜邏輯計算等都放在子線程中去,然后通過handler.sendMessage、runonUITread、AsyncTask 等方式更新UI。無論如何都要確保用戶界面操作的流暢度,如果耗時操作需要讓用戶等待,那么可以在界面上顯示進度條
dvm 的進程和Linux 的進程, 應用程序的進程是否為同一個概念?
dvm 指dalvik 的虛擬機。每一個Android 應用程序都擁有一個獨立的Dalvik 虛擬機實例,應用程序都在它自己的進程中運行。而每一個dvm 都是在Linux 中的一個進程,所以說可以近似認為是同一個概念。
什么是android DVM:Dalvik 是Google 公司自己設計用于Android 平臺的Java 虛擬機,每一個Dalvik 應用作為一個獨立的Linux 進程執行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。
Dalvik 和Java 虛擬機的區別
Dalvik 主要是完成對象生命周期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。
Dalvik 負責進程隔離和線程管理,每一個Android 應用在底層都會對應一個獨立的Dalvik 虛擬機實例,其代碼在虛擬機的解釋下得以執行。
不同于Java 虛擬機運行java 字節碼,Dalvik 虛擬機運行的是其專有的文件格式Dex
dex 文件格式可以減少整體文件尺寸,提高I/O 操作的類查找速度。
odex 是為了在運行過程中進一步提高性能,對dex 文件的進一步優化。
所有的Android 應用的線程都對應一個Linux 線程,虛擬機因而可以更多的依賴操作系統的線程調度和管理機制
有一個特殊的虛擬機進程Zygote,他是虛擬機實例的孵化器。它在系統啟動的時候就會產生,它會完成虛擬機的初始化,庫的加載,預制類庫和初始化的操作。如果系統需要一個新的虛擬機實例,它會迅速復制自身,以最快的數據提供給系統。對于一些只讀的系統庫,所有虛擬機實例都和Zygote 共享一塊內存區域。
sp 頻繁操作有什么后果?sp 能存多少數據?
Sp 的底層是由xml 來實現的,操作sp 的過程就是xml 的序列化和解析的過程。Xml 是存儲在磁盤上的,因此考慮到需要I/O 速度問題,sp 不適宜頻繁操作。同時序列化xml 是就是將內存中的數據寫到xml 文件中,由于dvm 的內存是很有限的,因此單個sp 文件不建議太大,具體多大是沒有一個具體的要求的,但是我們知道DVM 堆內存也就是16M,因此數據大小肯定不能超過這個數字的。其實sp 設置的目的就是為了保存用戶的偏好和配置信息的,因此不要保存太多的數據
Android四大組件
View的繪制流程
事件分發機制
Handler原理
AsyncTask原理
源碼分析
Animation
Android5.0/6.0/7.0新特性
MaterialDesign
高并發編程
安全加密
移動支付
性能優化
設計模式
屏幕適配
注解反射動態代理
動態加載技術
總結
以上是生活随笔為你收集整理的Android常见面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android5.0新特性:全新的动画
- 下一篇: Android安全加密:非对称加密