javase高級

靜態代理:須要代理對象和目標對象實現同樣的接口。
同一個接口,一個目標類實現,一個代理類實現,代理類除了目標類的方法還有別的加強方法
優勢:能夠在不修改目標對象的前提下擴展目標對象的功能。
缺點:1冗餘。因爲代理對象要實現與目標對象一致的接口,會產生過多的代理類。
2不易維護。一旦接口增長方法,目標對象與代理對象都要進行修改。java

JDK動態代理:使用JDK的API動態地在內存中構建代理對象,從而實現對目標對象的代理功能.
一個代理類能代理多個類型(實現多個類)
靜態代理編譯時就已實現,是實際的class文件,而動態代理編譯完沒有實際的class文件,而是在運行時動態生產類字節碼,並加載到JVM中
動態代理對象不須要實現接口,可是要求目標對象必須實現接口,不然不能使用動態代理。
JDK動態代理必須實現InvocationHandler接口,加強內容寫invoke就好了算法

cglib動態代理:使用第三方代碼生成類庫,運行時在內存中動態生成一個子類對象從而實現對目標對象功能的擴展
代理沒有接口的類的時候使用,使用cglib代理的對象則無需實現接口,達到代理類無侵入
應用的是底層的字節碼加強的技術 生成當前類的子類對象設計模式

性能:
1靜態代理在編譯時產生class字節碼文件,能夠直接使用,效率高。
2動態代理必須實現InvocationHandler接口,經過反射代理方法,比較消耗系統性能,但能夠減小代理類的數量,使用更靈活。
3cglib代理無需實現接口,經過生成類字節碼實現代理,比反射稍快,不存在性能問題,但cglib會繼承目標對象,須要重寫方法,因此目標對象不能爲final類。安全

動態代理和靜態代理的比較
動態代理與靜態代理相比較,最大的好處是接口中聲明的全部方法都被轉移到調用處理器一個集中的方法中處理(InvocationHandler.invoke)。這樣,在接口方法數量比較多的時候,咱們能夠進行靈活處理,而不須要像靜態代理那樣每個方法進行中轉。並且動態代理的應用使咱們的類職責更加單一,複用性更強數據結構

設計模式:
1單例設計模式:懶漢式,餓漢式
懶單例模式時注意線程安全問題
餓單例模式和懶單例模式構造方法都是私有的,於是是不能被繼承的
2工廠模式:
普通工廠:輸入類型,得到類型的實例
多個工廠方法模式:提供多個工廠方法,建立對象調用不一樣的方法
靜態工廠方法:將上面工廠方法模式裏面的方法置爲靜態,不用建立實例,直接調用便可
抽象工廠方法:以前幾種依賴工廠類,若是修改要改源碼,違反閉包的原則,解決方法:建立多個工廠類,這樣一旦須要增長新的功能,直接增長新的工廠類就能夠了,不須要修改以前的代碼。
3建造者模式:
工廠類模式提供的是建立單個類的模式,而建造者模式則是將各類產品集中起來進行管理,用來建立複合對象,所謂複合對象就是指某個類具備不一樣的屬性
4適配器設計模式
適配器模式將某個類的接口轉換成客戶端指望的另外一個接口表示,目的是消除因爲接口不匹配所形成的類的兼容性問題。主要分爲三類:類的適配器模式、對象的適配器模式、接口的適配器模式
經過引入一個適配器類來重用現有的適配者類,無需修改原有結構
5裝飾模式
裝飾模式就是給一個對象增長一些新的功能,並且是動態的,要求裝飾對象和被裝飾對象實現同一個接口,裝飾對象持有被裝飾對象的實例
(代理有對象控制權,裝飾只能增強功能)
6策略模式
策略模式的決定權在用戶,系統自己提供不一樣算法的實現,新增或者刪除算法,對各類算法作封裝。所以,策略模式多用在算法決策系統中,外部用戶只須要決定用哪一個算法便可
7觀察者模式
當一個對象變化時,其它依賴該對象的對象都會收到通知,而且隨着變化!對象之間是一種一對多的關係閉包

JVM垃圾回收機制:主要進行回收的內存是 JVM 中的方法區和堆
搜索算法:根搜索算法「GC Roots」對象做爲起點,從這些節點開始往下搜索,搜索經過的路徑成爲引用鏈
(Reference Chain),當一個對象沒有被 GC Roots 的引用鏈鏈接的時候,說明這個對象是不可用的
而在實際開發中,可能會存在無用但可達的對象,這些對象不能被 GC 回收,所以也會致使內存泄
露的發生。
回收算法:
1標記—清除算法。標記—清除算法是基礎的收集算法,標記和清除階段的效率不高,
並且清除後回產生大量的不連續空間,這樣當程序須要分配大內存對象時,可能沒法找到足夠的連續空間。
2複製算法.是把內存分紅大小相等的兩塊,每次使用其中一塊,當垃圾回收的時候,把存活的對象複製到另外一塊上,而後把這塊內存整個清理掉。複製算法實現簡單,運行效率高,可是因爲每次只能使用其中的一半,形成內存的利用率不高。如今的 JVM 用複製方法收集新生代,因爲新生代中大部分對象(98%)都是朝生夕死的,因此兩塊內存的比例不是 1:1(大概是 8:1)
3標記整理算法.標記—整理算法和標記—清除算法同樣,可是標記—整理算法不是把存活對象複製到另外一塊內存,而是把存活對象往內存的一端移動,而後直接回收邊界之外的內存。標記—整理算法提升了內存的利用率,而且它適合在收集對象存活時間較長的老年代
4分代收集.是根據對象的存活時間把內存分爲新生代和老年代,根據各個代對象的存活特色,每一個代採用不一樣的垃圾回收算法。新生代採用複製算法,老年代採用標記—整理算法。垃圾算法的實現涉及大量的程序細節,並且不一樣的虛擬機平臺實現的方法也各不相同jvm

引用類型:
1強引用
引用存在就不會回收
2軟引用
若是內存空間足夠,垃圾回收器就不會回收它,若是內存空間不足了,就會回收這些對象的內存。
3弱引用
弱引用主要用於監控對象是否已經被垃圾回收器標記爲即將回收的垃圾
那該類就是無關緊要的對象,由於只要該對象被 gc 掃描到了隨時都會把它幹掉
4虛引用
虛引用主要用於檢測對象是否已經從內存中刪除。在任什麼時候候均可能被垃圾回收。虛引用主要用來跟蹤對象被垃圾回收的活動。性能

堆,棧
stack:棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS 下,棧的大小是 2M(也有的說是 1M,總之是一個編譯時就肯定的常數),若是申請的空間超過棧的剩餘空間時,將提示 overflow。所以,能從棧得到的空間較小。
heap:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,
天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,
堆得到的空間比較靈活,也比較大spa

java虛擬機的內存結構
堆區:
1.存儲的所有是對象,每一個對象都包含一個與之對應的class的信息。(class的目的是獲得操做指令)
2.jvm只有一個堆區(heap)被全部線程共享,堆中不存放基本類型和對象引用,只存放對象自己
棧區:
1.每一個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每一個棧中的數據(原始類型和對象引用)都是私有的,其餘棧不能訪問。
3.棧分爲3個部分:基本類型變量區、執行環境上下文、操做指令區(存放操做指令)。
方法區:
1.又叫靜態區,跟堆同樣,被全部的線程共享。方法區包含全部的class和static變量。
2.方法區中包含的都是在整個程序中永遠惟一的元素,如class,static變量。線程

類加載器:一、根類加載器(Bootstrap) --C++寫的 ,看不到源碼二、擴展類加載器(Extension) 加載位置 :jre\lib\ext三、系統(應用)類加載器(AppClassLoader:System\App) --加載位置 :classpath 中四、自定義加載器(CustomClassLoader:必須繼承 ClassLoader)雙親委託機制:4委託到3委託到2委託到1,1沒辦法加載,再2加載,2沒辦法加載再3加載...在該機制中,JVM 自帶的 Bootstrap 是根加載器,其餘的加載器都有且僅有一個父類加載器。當一個類收到了類加載請求,他首先不會嘗試本身去加載這個類,而是把這個請求委派給父類去完成,每個層次類加載都是如此,所以全部的加載請求都應該傳送到啓動類加載器中,只有當父類加載器反饋本身沒法完成這個請求的時候(在它的加載路徑裏找不到這個所須要加載的類),子類加載器纔會嘗試本身去加載

相關文章
相關標籤/搜索