Windows
Native的c++應用大量使用了DLL技術。"動態鏈接"這幾字指明了DLLs是如何工作的。對于常規的函數庫,鏈接器從中拷貝它需要的所有庫函數,并把確切的函數地址傳送給調用這些函數的程序。而對于DLLs,函數儲存在一個獨立的動態鏈接庫文件中。在創建Windows程序時,鏈接過程并不把DLLs文件鏈接到程序上。直到程
序運行并調用一個DLLs中的函數時,該程序才要求這個函數的地址。此時Windows才在DLLs中尋找被調用函數,并把它的地址傳送給調用程序。采用這種方法,DLLs達到了復用代碼的極限。
對于DLL,
關鍵一點是,所有run on windows
system 的程序可以共用同一個DLL庫,從而達到最大限度的代碼復用。并且,由于DLL并不拷貝它需要的所有庫函數
, 這樣的話Native的C++程序
executable image size 會比較小。
從modularity的角度,如果要在Java的應用里尋找相對應的DLL的概念,我們會自然地想到jar包。JAR包可以被
Class Loader動態裝載進JVM,
不過要幾點區別需要說明的是:
第一、從本質上來講,JAR包是存在于磁盤上的一些data而已(由JVM解釋執行),而DLL是executable
的image。
第二、Class
Data Sharing (CDS)作為一個新的feature,在Java5才被引入,其做法就是:把
system jar 文件打包成為"shared
archive",這些"shared
archive"會作為memory-mapped
in文件存在,共享于不同的JVM
進程間,以減少JVM的footprint,加快Java應用的啟動時間。
值得一提的是:兩者都有所謂的HELL問題(JAR HELL vs DLL HELL),新老版本的兼容問題始終讓人頭疼。
詳見解釋:
http://en.wikipedia.org/wiki/DLL_hell
http://en.wikipedia.org/wiki/JAR_hell#JAR_hell