概述 當前的商業虛擬機器的垃圾收集都採用“分代收集”(Generational Collection)演算法,這種演算法並沒有什麼新的思想,只是根據對象存活周期的不同將記憶體劃分為幾塊。一般是把Java堆分為新生代和老年代,這樣就可以根據各個年代的特點採用最適當的收集演算法。在新生代中,每次垃圾收集時都發現有大批的對象死去,只有少量存活,那就選用複製演算法,只需要付出少量存活對象的複製成本就可以完成收集。而老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記-清理”或者“
前言 對於Java程式員來說,在虛擬機器自動記憶體管理機制的協助下,不再需要為每一個new操作去寫對應的delete/free代碼,不容易出現記憶體流失和記憶體溢出問題,由虛擬機器管理記憶體。不過,也正是Java程式員把記憶體控制的權力交給了Java虛擬機器,一旦出現記憶體流失和溢出方面的問題,如果不瞭解Java虛擬機器是如何使用記憶體的,那麼排查錯誤將會成為一項異常艱難的工作。 本文將從概念上介紹Java虛擬機器記憶體的各個地區,以及各個地區的作用,服務物件以及可能出現的問題。
某些應用情境下,我們設計服務的時候要考慮到應用停止/被停止 時做一些善後操作,比如:關閉線程、釋放串連資源等。 Java語言中,我們可以通過Runtime.getRuntime().addShutdownHook()方法來註冊鉤子,以保證程式平滑退出,如下: Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() {
概述 Javassist是一款位元組碼編輯工具,可以直接編輯和產生Java產生的位元組碼,以達到對.class檔案進行動態修改的效果。熟練使用這套工具,可以讓Java編程更接近與動態語言編程。 教程 maven依賴 pom.xml <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId>
SPI 簡介 SPI 全稱為 (Service Provider Interface) ,是JDK內建的一種服務提供發現機制。 一個服務(Service)通常指的是已知的介面或者抽象類別,服務提供者就是對這個介面或者抽象類別的實現,然後按照SPI 標準存放到資源路徑META-INF/services目錄下,檔案的命名為該服務介面的全限定名。如有一個服務介面: package com.ricky.codelab.spi;public interface DemoService {
概述 void是Java中的關鍵字,日常開發中經常遇到,Java main方法的定義中就有void的身影,如下: public static void main(String[] args) {} 學過Java的人都知道void的意思是空,如果你去問老手,老手會告訴你說:“void什麼都不是,你只要記住void就是空,在方法申明的時候表示該方法沒有傳回值”。 void是什麼。 Java語言是強型別(Strong typed)的,從方法申明的文法可以看出方法的定義必須有傳回值,
在上一篇文章:Java SPI(Service Provider Interface)簡介 中對Java SPI機製做了簡單說明,並附上了一個具體的demo。對Java SPI不熟悉的同學可以去參閱一下那篇文章,本文不再贅述。 本文將在上一篇文章的基礎之上,結合JDK 1.7 源碼來剖析Java SPI的內部實現原理。 在上一篇文章中,我們通過如下代碼擷取Service的具體實現,代碼如下: import java.util.Iterator;import
結構型模式描述如何組織類和對象以組成更大的結構。結構型類模式採用繼承機制來組合介面和實現,結構型對象模式則採用組合彙總來組合對象以實現新功能,可以在運行時刻改變對象組合關係,具有更大靈活性,故這裡只關注結構型對象模式。常見的結構型模式有7種:ABCDFFP(Adapter,Bridge,Composite,Decorator,Façade,Flyweight,Proxy) 1.適配器模式(Adapter):使由於介面不相容而不能一起工作的類可以一起工作。有類或對象適配器模式,
定義:為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 類型:對象結構型模式 類圖: Facade模式的結構 外觀角色(Facade):是模式的核心,他被客戶client角色調用。它知道那些子系統類負責處理請求,並將客戶的請求轉寄給適當的子系統對象。 子系統角色(Subsystem
Java IO 為了減少傳輸時的資料量 在Java中提供了專門的壓縮流將檔案或者檔案夾壓縮成zip,gzip,jar等檔案形式。 壓縮流實現 Java支援的三種壓縮格式:zip、jar、gzip。 1.zip是一種較為常見的壓縮格式,Java提供了java.util.zip包,常用類: ZipInputStream ZipOutputStream ZipEntry ZipFile 依靠上述4個類完成zip類型檔案操作。
建立型模式包括: Factory 方法模式:提供一個簡單的決策類,根據條件產生產品。 抽象原廠模式:提供一個建立並返回一系列產品的介面。 單例模式:某個類只能有一個執行個體。提供一個全域訪問點。(可拓展到有限個執行個體) 建造者模式:將一個複雜物件的構建於呈現分開,以便根據不同需要建立不同的形式。 原型模式:先執行個體化一個類,然後複製或者拷貝該類來構建新的執行個體。可以用共有方法進一步修改這些執行個體。 比較&總結:
定義:允許一個對象在其內部狀態發生改變時改變它的行為。對象看起來似乎修改了它的類。 類型:對象行為型模式 類圖: State模式主要解決的是在開發中時常遇到的根據不同的狀態需要進行不同的處理操作的問題,而這樣的問題,大部分人是採用switch-case語句 進行處理的,這樣會造成一個問題:分支過多,而且如果加入一個新的狀態就需要對原來的代碼進行編譯。State模式採用了對這些不同的狀態進行封裝的方式 處理這類問題,當狀態改變的時候進行處理然後再切換到另一種狀態,
定義:將抽象部分與它的實現部分分離,使它們可以獨立的變化。 類型:對象結構型模式 類圖: 橋接模式的結構 Abstraction :抽象類別的介面,維護一個指向Implementor類型對象的指標,在本例中為 IPluginPlatform。 RefinedAbstraction :擴充Abstraction定義的介面,在本例中為 PluginVersionA、PluginVersionB。 Implementor :定義實作類別的介面,
定義:將對象組合成樹形結構以表示 “部分 — 整體” 的階層。Composite模式使得使用者對單個對象和組合對象的使用具有一致性。 類型:對象結構型模式 類圖: 組合模式的結構 抽象構件角色(component):是組合中的對象聲明介面,在適當的情況下,實現所有類共有介面的預設行為。聲明一個介面用於訪問和管理Component子組件。 這個介面可
定義:將一個類的介面轉換成客戶希望的另一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。 類型:類對象結構型模式 類圖: 在GoF的設計模式中,對適配器模式講了兩種類型,類適配器模式和對象適配器模式。由於類適配器模式通過多重繼承對一個介面與另一個介面進行匹配,而C#、java等語言都不支援多重繼承,因而這裡只是介紹對象適配器。 類適配器模式使用多重繼承對一個介面和另一個介面進行匹配,如下圖所示:
定義:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外儲存這個狀態。這樣以後就可以將該對象恢複到原先儲存的狀態 類型:對象行為型模式 類圖:
定義:動態給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比產生子類更為靈活。 類型:對象結構型模式 別名:封裝模式(Wrapper) 類圖:
定義:定義對象間一種一對多的依賴關係,使得當每一個對象改變狀態,則所有依賴於它的對象都會得到通知並自動更新。 類型:對象行為型模式 別名:發布—訂閱(Publish - Subscribe) 類圖:
定義:運用共用技術有效地支援大量細粒度的的對象。 類型:對象結構型模式 類圖: FlyWeight模式的結構 抽象享元角色(Flyweight):描述一個介面,通過這個介面可以Flyweight可以接受並作用於外部狀態。
定義:定義一系列演算法,將它們一個個封裝起來,並且使他們之間可以相互替換。本模式使得演算法可以獨立於使用它的客戶而變化。 類型:對象行為型模式 類圖: