1.說說你對 Java 中反射的理解html
反射(Reflection)機制:其實就是程序在運行的時候能夠獲取任意一個類的內部信息,也能夠說是動態獲取吧。程序員
Java 中 的 反 射 首 先 是 能 夠 獲 取 到 Java 中 要 反 射 類 的 字 節 碼 , 獲 取 字 節 碼 有 三 種 方 法 ,
1.Class.forName(className) 2.類名.class 3.this.getClass()。數據庫
而後將字節碼中的方法,變量,構造函數等映射成相應的 Method、Filed、Constructor 等類,這些類提供了豐富的方法能夠被咱們所使用。
編程
2.動靜態代理的區別,什麼場景使用?設計模式
靜態代理一般只代理一個類,動態代理是代理一個接口下的多個實現類。
靜態代理事先知道要代理的是什麼,而動態代理不知道要代理什麼東西,只有在運行時才知道。
動態代理是實現 JDK 裏的 InvocationHandler 接口的 invoke 方法,但注意的是代理的是接口,也就是你的業務類必需要實現接口,經過 Proxy 裏的 newProxyInstance 獲得代理對象。
還有一種動態代理 CGLIB,代理的是類,不須要業務類繼承接口,經過派生的子類來實現代理。經過在運行時,動態修改字節碼達到修改類的目的。
AOP 編程就是基於動態代理實現的,好比著名的 Spring 框架、Hibernate 框架等等都是動態代理的使用例子。數組
3.你所知道的設計模式有哪些(只寫經常使用的)安全
建立型模式:工廠方法模式、抽象工廠模式、單例模式、建造者模式框架
結構型模式:適配器模式, 代理模式, 享元模式jvm
行爲型模式:策略模式, 觀察者模式.函數
4.談談 JVM 的內存結構和內存分配
Java 虛擬機將其管轄的內存大體分三個邏輯部分:方法區(Method Area)、Java 棧和 Java 堆
堆區:
1.存儲的所有是對象,每一個對象都包含一個與之對應的class的信息。(class的目的是獲得操做指令)
2.jvm只有一個堆區(heap)被全部線程共享,堆中不存放基本類型和對象引用,只存放對象自己.
3.通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。
棧區:
1.每一個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每一個棧中的數據(原始類型和對象引用)都是私有的,其餘棧不能訪問。
3.棧分爲3個部分:基本類型變量區、執行環境上下文、操做指令區(存放操做指令)。
4.由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等.
靜態區/方法區:
1.方法區又叫靜態區,跟堆同樣,被全部的線程共享。方法區包含全部的class和static變量。
2.方法區中包含的都是在整個程序中永遠惟一的元素,如class,static變量。
3.全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。
5. Java 中引用類型都有哪些?(重要)
Java 中對象的引用分爲四種級別,這四種級別由高到低依次爲:強引用、軟引用、弱引用和虛引用。
強引用(StrongReference)
這個就很少說,咱們寫代碼每天在用的就是強引用。若是一個對象被被人擁有強引用,那麼垃圾回收器毫不會回收它。
當內存空間不足,Java 虛擬機寧願拋出 OutOfMemoryError 錯誤,使程序異常終止,也不會靠隨意
回收具備強引用的對象來解決內存不足問題。
軟引用(SoftReference)
若是一個對象只具備軟引用,那麼若是內存空間足夠,垃圾回收器就不會回收它,若是內存空間不足了,就會
回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就能夠被程序使用。
弱引用(WeakReference)
若是一個對象只具備弱引用,那該類就是無關緊要的對象,由於只要該對象被 gc 掃描到了隨時都會把它幹
掉。弱引用與軟引用的區別在於:只具備弱引用的對象擁有更短暫的生命週期。
虛引用(PhantomReference)
"虛引用"顧名思義,就是形同虛設,與其餘幾種引用都不一樣,虛引用並不會決定對象的生命週期。若是一個對
象僅持有虛引用,那麼它就和沒有任何引用同樣,在任什麼時候候均可能被垃圾回收。虛引用主要用來跟蹤對象被垃
圾回收的活動。
6. 解釋內存中的棧 (stack) 、堆 (heap) 和方法區 (method area) 的用法
一般咱們定義一個基本數據類型的變量,一個對象的引用,還有就是函數調用的現場保存都使用 JVM 中的棧空間;
而經過 new 關鍵字和構造器建立的對象則放在堆空間,堆是垃圾收集器管理的主要區域
方法區和堆都是各個線程共享的內存區域,用於存儲已經被 JVM 加載的類信息、常量、靜態變量、JIT 編譯器編譯後的代碼等數據;
程序中的字面量(literal)如直接書寫的 100、"hello"和常量都是放在常量池中,常量池是方法區的一部分。
棧空間操做起來最快可是棧很小,一般大量的對象都是放在堆空間,
棧和堆的大小均可以經過 JVM 的啓動參數來進行調整,棧空間用光了會引起 StackOverflowError,
而堆和常量池空間不足則會引起 OutOfMemoryError。
String str = new String("hello");
上面的語句中變量 str 放在棧上,用 new 建立出來的字符串對象放在堆上,而"hello"這個字面量是放在方法區的。
7.描述一下 JVM 加載 class
虛擬機把描述類的數據從 Class 文件加載到內存,並對數據進行校驗、轉換解析和初始化,最終造成能夠被虛擬機直接使用的 Java 類型,這就是虛擬機的類加載機制
類的加載是指把類的.class文件中的數據讀入到內存中,一般是建立一個字節數組讀入.class 文件,而後產生與所加載類對應的 Class 對象。
加載完成後,Class 對象還不完整,因此此時的類還不可用。當類被加載後就進入鏈接階段,這一階段包括驗證、準備
(爲靜態變量分配內存並設置默認的初始值)和解析(將符號引用替換爲直接引用)三個步驟。最後 JVM 對類進行
初始化,包括:若是類存在直接的父類而且這個類尚未被初始化,那麼就先初始化父類;若是類中存在初始化語句,就依次執行這些初始化語句。
8.Java 中爲何會有 GC 機制呢?
Java 中爲何會有 GC 機制呢?
• 安全性考慮;-- for security.
• 減小內存泄露;-- erase memory leak in some degree.
• 減小程序員工做量。-- Programmers don't worry about memory releasing.
9.對於 Java 的 GC 哪些內存須要回收
內存運行時 JVM 會有一個運行時數據區來管理內存。
它主要包括 5 大部分:程序計數器(Program CounterRegister)、虛擬機棧(VM Stack)、本地方法棧(Native Method Stack)、方法區(Method Area)、堆(Heap).
而其中程序計數器、虛擬機棧、本地方法棧是每一個線程私有的內存空間,隨線程而生,隨線程而亡。
但方法區和堆就不一樣了,一個接口的多個實現類須要的內存可能不同,咱們只有在程序運行期間纔會知道會創
建哪些對象,這部份內存的分配和回收都是動態的,GC 主要關注的是這部份內存。
10.Java 的 GC 何時回收垃圾
垃圾回收器的運行時間是不肯定的,由JVM決定,在運行時是間歇執行的。
雖然能夠經過System.gc()來強制回收垃圾,可是這個命令下達後沒法保證JVM會當即響應執行,
但經驗代表,下達命令後,會在短時間內執行的請求。JVM一般會感到內存緊缺時候去執行垃圾回收操做。
11.在開發中遇到過內存溢出麼?緣由有哪些?解決方法有哪些?
內存溢出是指應用系統中存在沒法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於虛擬機能提供的最大內存。
引發內存溢出的緣由有不少種,常見的有如下幾種:
1.內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
2.集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
3.代碼中存在死循環或循環產生過多重複的對象實體;
4.使用的第三方軟件中的BUG;
5.啓動參數內存值設定的太小;
內存溢出的解決方案:
第一步,修改JVM啓動參數,直接增長內存。(-Xms,-Xmx參數必定不要忘記加。)
第二步,檢查錯誤日誌,查看「OutOfMemory」錯誤前是否有其它異常或錯誤。
第三步,對代碼進行走查和分析,找出可能發生內存溢出的位置。
重點排查如下幾點:
1.檢查對數據庫查詢中,是否有一次得到所有數據的查詢。通常來講,若是一次取十萬條記錄到內存,就可能引發內存溢出。這個問題比較隱蔽,在上線前,數據庫中數據較少,不容易出問題,上線後,數據庫中數據多了,一次查詢就有可能引發內存溢出。所以對於數據庫查詢儘可能採用分頁的方式查詢。
2.檢查代碼中是否有死循環或遞歸調用。
3.檢查是否有大循環重複產生新對象實體。
4.檢查對數據庫查詢中,是否有一次得到所有數據的查詢。通常來講,若是一次取十萬條記錄到內存,就可能引發內存溢出。這個問題比較隱蔽,在上線前,數據庫中 數據較少,不容易出問題,上線後,數據庫中數據多了,一次查詢就有可能引發內存溢出。所以對於數據庫查詢儘可能採用分頁的方式查詢。
5.檢查List、MAP等集合對象是否有使用完後,未清除的問題。List、MAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。
第四步,使用內存查看工具動態查看內存使用狀況
拓展:http://www.cnblogs.com/yangyi1024/p/6417874.html