framework層、ROM定製、Ubuntu、Linux之類的問題
1,java虛擬機器的特性
答:
特點
java語言的重要特點是與平臺無關性,java虛擬機器是實現這一特點的關鍵。【對比高階語言】
一般高階語言要想在不同平臺執行,至少需要生成不同目的碼。而java虛擬機器遮蔽了與具體系統平臺資訊,只要編譯生成在java虛擬機器執行的位元組碼,就可以在多種平臺執行,不需要重複編譯。【解釋位元組碼】
java虛擬機器在執行位元組碼時,把位元組碼解釋成具體平臺的機器指令執行。
2,談談對jvm的理解
答:
這裡和大家簡單分享一下JAVA和JVM執行的原理,Java語言寫的源程式通過Java編譯器,編譯成與平臺無關的‘位元組碼程式’(.class檔案,也就是0,1二進位制程式),然後在OS之上的Java直譯器中解釋執行,而JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器
JAVA和JVM執行的原理
1.Java語言執行的過程
Java語言寫的源程式通過Java編譯器,編譯成與平臺無關的‘位元組碼程式’(.class檔案,也就是0,1二進位制程式),然後在OS之上的Java直譯器中解釋執行。
也相當與
注:JVM(java虛擬機器)包括直譯器,不同的JDK虛擬機器是相同的,直譯器不同。
2.JVM:
JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種利用軟體方法實現的抽象的計算機基於下層的作業系統和硬體平臺,可以在上面執行java的位元組碼程式。
java編譯器只要面向JVM,生成JVM能理解的程式碼或位元組碼檔案。Java原始檔經編譯成位元組碼程式,通過JVM將每一條指令翻譯成不同平臺機器碼,通過特定平臺執行。
JVM執行程式的過程 :
I.載入。class檔案
II.管理並分配記憶體
III.執行垃圾收集
JRE(java執行時環境)由JVM構造的java程式的執行環境
3,JVM記憶體區域,開執行緒影響哪塊記憶體
4,對Dalvik、ART虛擬機器有什麼瞭解?
5,Art和Dalvik對比
6,虛擬機器原理,如何自己設計一個虛擬機器(記憶體管理,類載入,雙親委派)
7,談談對雙親委派模型理解
8,JVM記憶體模型,記憶體區域
9,類載入機制
10,談談對ClassLoader(類載入器)的理解
答:ClassLoader顧名思義就是用來載入Class檔案到JVM,以供程式使用的,java程式可以動態載入類定義,而這個動態載入的機制就是通過
ClassLoader的型別有很多,但是最重要的是Bootstrap Classloader,這個是啟動類載入器,這個ClassLoader在JVM執行時候載入java核心的API以滿足java程式的基本需求,這就包括了其他的ClassLoader,其中包括使用者自定義的ClassLoader和ExtClassLoader,還有一個是AppClassLoader。
其實,也就是說當執行一個程式的時候,JVM啟動,執行bootstrap classloader,該ClassLoader載入java核心API(ExtClassLoader和AppClassLoader也在此時被載入),然後呼叫ExtClassLoader載入擴充套件API,最後AppClassLoader載入CLASSPATH目錄下定義的Class,這就是一個程式最基本的載入流程。
在定義一個ClassLoader的時候都必須繼承ClassLoader這個抽象類,而每個ClassLoader都會有一個parent ClassLoader,我們可以看一下ClassLoader這個抽象類中有一個getParent()方法,這個方法用來返回當前ClassLoader的parent,注意,這個parent不是指的被繼承的類,而是在例項化該ClassLoader時指定的一個ClassLoader,如果這個parent為null,那麼就預設該ClassLoader的parent是Bootstrap Classloader。
如果自定義了一個UserClassLoader,使用這個自定義的ClassLoader載入java.lang.String,那麼這裡String是否會被這個ClassLoader載入呢?事實上java.lang.String這個類並不是被這個UserClassLoader載入,而是由Bootstrap Classloader進行載入,這就是雙親委託模式機制,也就是在任何一個自定義ClassLoader載入一個類之前,它都會先委託它的父親ClassLoader進行載入,只有當父親ClassLoader無法載入成功後,才會由自己載入。
在ClassLoader中的一段原始碼中有描述:
Java程式碼
[javascript]view plain copy
- protectedsynchronized Class loadClass(String name, boolean resolve)
- throws ClassNotFoundException
- {
- // 首先檢查該name指定的class是否有被載入
- Class c = findLoadedClass(name);
- if (c == null) {
- try {
- if (parent != null) {
- //如果parent不為null,則呼叫parent的loadClass進行載入
- = parent.loadClass(name, false);
- } else {
- //parent為null,則呼叫BootstrapClassLoader進行載入
- c = findBootstrapClass0(name);
- }
- } catch (ClassNotFoundException e) {
- //如果仍然無法載入成功,則呼叫自身的findClass進行載入
- c = findClass(name);
- }
- }
- if (resolve) {
- resolveClass(c);
- }
- return c;
- }
這種雙親委託模式可以避免重複載入,當父親已經載入了該類的時候,就沒有必要子ClassLoader再載入一次。還有一個原因就是如果不使用這種委託模式,那我們就可以隨時使用自定義的String來動態替代java核心api中定義型別,這樣會存在非常大的安全隱患。當ClassLoader載入class的時候會經過三步裝載、連線、初始化。
其中裝載就是找到相應的class檔案,讀入JVM;連線分三步,第一步是驗證class是否符合規格,第二步是準備,就是為類變數分配記憶體同時設定預設初始值,第三步就是解釋。初始化就是將類例項化成物件,以待其他應用程式使用。
其實ClassLoader就這樣簡單,知道了這些原理和理論,如果專案或者產品中遇到使用ClassLoader的情況就應該會非常輕鬆。
11,談談對動態載入(OSGl)的理解
12,記憶體物件的迴圈引用及避免
13,記憶體回收機制、GC回收策略、GC原理時機以及GC物件
14,垃圾回收機制與呼叫System.gc()區別
15,Ubuntu編譯安卓系統
16,系統啟動流程是什麼?(提示:Zygote程序->SystemServer程序->各種系統服務->應用程序)
17,大體說清一個應用程式安裝到手機上時發生了什麼
18,簡述Activity啟動全部過程
答:七大生命週期講解
19,App啟動流程,從點選桌面開始
20,邏輯地址與實體地址,為什麼使用邏輯地址?
21,Android為每個應用程式分配的記憶體大小是多少?
22,Android 中程序記憶體的分配,能不能自己分配定額記憶體?
23,程序保活的方式
24,如何保證一個後臺服務不被殺死?(相同問題:如何保證service在後臺不被kill?)比較省電的方式是什麼?
25,App中喚醒其他程序的實現方式