知識大陸:由加載DLL文件串起來的知識點

一、由問題引發的思考

  問題的源泉:https://bbs.csdn.net/topics/390765099
  最近有關於『如何單獨加載帶有依賴項DLL』的問題,在尋找過程中被一個問題吸引住了,即上方連接中提到的“內存泄漏”的問題。文中提到是加載DLL引發的問題,我一琢磨,反射技術的應用也應該會引發相同的問題吧?
  於是,我百度一搜,眼睛一眯,心中暗道:“果然會有此類問題。”
  附一個有關『反射造成內存泄露的解決方法』的博客鏈接。
  反射的特別好用,工作中經常會用到。突然腦瓜一拍,我得明白內存泄漏到底是咋回事啊,查着查着,就把之前學習的知識串聯起來的,有了此篇文章。

二、內存泄漏

  啥玩意兒是內存泄漏呢?網上有很多的精彩解釋,此篇博文很是精彩

  百度百科:內存泄漏(Memory Leak)是指程序中己動態分配的堆內存由於某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重後果。
  以產生的方式來分類,內存泄漏可以分爲四類:
  1. 常發性內存泄漏:發生內存泄漏的代碼會被多次執行到,每次被執行時都會導致一塊內存泄漏。
  2. 偶發性內存泄漏:發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。
  3. 一次性內存泄漏:發生內存泄漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊且僅有一塊內存發生泄漏。
  4. 隱式內存泄漏:程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這裏並沒有發生內存泄漏,因爲最終程序釋放了所有申請的內存。但是對於一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏爲隱式內存泄漏。從用戶使用程序的角度來看,內存泄漏本身不會產生什麼危害,作爲一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終耗盡系統所有的內存。從這個角度來說,一次性內存泄漏並沒有什麼危害,因爲它不會堆積,而隱式內存泄漏危害性則非常大,因爲較之於常發性和偶發性內存泄漏它更難被檢測到。

  OK,當我看完這些資料的時候,我就大概明白了是怎麼回事了,瞬間和我軟考與自考學習過程中學習到的知識聯繫了起來。人有衣服話有頭,我們先從內存串起來吧!

三、內存

  學習嘛,總要站在巨人的肩膀上。如今的學習資料可謂浩如煙海,有諸多可以讓我們瞭解的地方,單靠自己悟,最起碼未到技術前沿之前是不適合的,所以繼續看前輩們留下來的心血吧。

1. 內存是啥啊?

  家中有電腦的話,可能會發生這樣一件事:內存條壞了,需要更換內存條。購買的時候內存條還不能瞎買,得看看DDR版本、頻率容量是否合適。
  誒,突然發現內存有4G的,8G的,這會不會是我們存放我們下載的東西的地方呢?如果是,那容量是不是太小了,而且這麼貴。
  後來你瞭解到硬盤纔是存放我們下載文件的地方,那麼內存是幹啥使得呢?
  首先,內存與硬盤同屬於『存儲器』,沒錯,都是用來存放數據的容器,除此之外,還有寄存器高速緩存,四者共同構成計算機的存儲體系。存儲器的速度和容量基本是成反比的,我們按照速度由快到慢排序爲:
  寄存器高速緩存內存(或者稱**“主存”)—硬盤(還有其他同類產品,比如硬盤、軟盤)
  那麼這些存儲器的作用是啥呀?我們接着串起我們的知識。

2. 各類存儲器的作用

  公審大會開始啦,我們按照速度確定選手的次序,我們有請第一位選手。

2.1 寄存器

  說到寄存器,不如我們看一下CPU的構造吧。
CPU組成結構結構示意圖
  通過這幅圖片,我們發現了CPU中有好多寄存器:地址寄存器,指令寄存器等等有好多個。吶,我們的寄存器的工作環境,一般也就是這樣了。如果把CPU比作人的心臟的話,那麼寄存器就是心臟中的一些東西。
  寄存器分爲基本寄存器移位寄存器兩大類。基本寄存器只能並行送入數據,也只能並行輸出。移位寄存器中的數據可以在移位脈衝作用下依次逐位右移或左移,數據既可以並行輸入、並行輸出,也可以串行輸入、串行輸出,還可以並行輸入、串行輸出,或串行輸入、並行輸出,十分靈活,用途也很廣。
  寄存器的作用不一,但主要用於存放數據和指令的。比如說指令寄存器是用來存儲當前指令的。但他們都有一個特點:容量特小,但是速度奇快。指令和數據來源於內存(但是指令和數據儲存在硬盤中,如有不解,往下看)。

2.2 高速緩存

  高速緩衝存儲器是介於CPU與內存之間的存儲器,容量比寄存器大但速度較之較慢, 接近於CPU的速度;容量比內存小,速度比內存大。高速緩存是加速CPU讀取內存速度的一個通道。CPU向內存讀取數據時,首先查詢緩存區是否有對應數據,如果有則直接讀取,沒有再從內存中讀取。高速緩存中存儲的都是內存中的數據,這部分數據是cpu訪問比較頻繁的部分。
  系統也會動態管理緩存中的數據,如果有數據訪問頻率降低到一定值,就從緩存中移除,而將內存中訪問更加頻發的數據替換進去。(高速緩存可以不只一級,可以有多級緩存區)。

2.3 內存

  這是我們此篇博文的主角。我們所運行的程序都是運行在內存當中的,雖然我們的程序安裝在硬盤當中。
  打個比方講:我處理食材喜歡在一個大桌子上進行,將所有的食材放到桌子上。桌子上放置一個案板,當我想要處理某項食材時,我就把它放到案板上。我們可以把桌子看成硬盤,案板當做內存,某項食材看成數據或着程序、文件等等。那我們可以總結一下特點:
  1.內存和硬盤空間不是一個東西(物理上兩者一個是內存條,一個是硬盤)。
  2.我們跑的程序,程序用到的數據,都是從內存中調取的,但他們存放在硬盤當中。
  那問題來了:我們的數據都存在硬盤當中,但是內存那麼小,如果內存中沒有我們需要的數據,那該咋辦?
  這就是頁面置換的問知識點了,知識點太多了,有機會另開一篇吧。
  我們知道我們的內存爲CPU輸送數據,那麼具體存放什麼呢?(詳見此篇博客
內存中的六類空間
  我們在編寫代碼時候,與我們息息相關的就是全局區、棧區、堆區。全局區與我們程序中的靜態變量有關係,而堆區、棧區則與值類型與引用類型數據有關係,可見此篇博文

2.4 硬盤

  相比其他的儲存器而言,硬盤可大得多,現在的硬盤基本上是TB級別的。此類存儲器可以稱爲外存。除此之外,還有早期的軟盤,光盤等等。


  考慮到篇幅,此篇博文至此結束,文中有好多的博客鏈接,可供查閱,如此下來,知識量也還可以。
  日後再會!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章