如何去學習編程

咱們學習程序語言必定不要被束縛到語言細節和規範上面,而要從計算機邏輯執行層面思考。細節和規範都是人爲設定的,是大牛抽象計算機邏輯後的加工品。對於技術問題咱們要尋根溯源,要高屋建瓴。

這段時間在準備面試,爲了自認爲更好的表現而去背大量的面試題。今日在知乎看到了這一段話,讓本身醍醐灌頂。java

咱們就從java虛擬機這個方面開始說說看,不少小白一上來就被各類分代,處理器類型搞暈了包括我,每每就是死記硬背了那麼一些規則,根本談不上理解的深刻。可是事情的出現都是有緣由的,都是爲了解決實際的問題。面試

java程序運行在虛擬機之上,虛擬機又和操做系統打交道,完成數據的存儲,運算,輸出。虛擬機在加載.class文件的時候會在內存開闢一個「方法區」來存儲類的基本信息同時在「堆」生成一個Class對象爲反射提供了支持。。內存是有限的,而程序運行時又不斷的建立對象,所以咱們要按期處理一些不用的對象。生成對象的方法有new,反射,清理對象就有咱們經常使用的GC算法如標記,標記整理,複製算法等等。算法

爲何會有三種方法?由於每種方法都有本身的侷限性,標記-清除算法的缺點在於會產生大量的內存碎片標記-整理算法則是對它的一種改進,將碎片往一邊移動,缺點是。複製算法則解決了內存碎片的問題,但浪費了50%的額外空間。咱們要依據不一樣類型對象的特色採起最合適的算法進行處理。對於新生代,因爲數量少咱們採用複製算法提升效率,對於老生代對象由於數量衆多咱們採起標記-整理算法進行處理。緩存

好了具體垃圾回收算法咱們清除了,咱們再想一想按什麼策略去執行垃圾回收?大多數人都能想到的是後臺運行一個進程,每隔段時間進行垃圾回收,完成以後再繼續執行原來的程序,這就是最原始的串行回收器Serial。多核的出現人們天然想到使多個線程同時執行垃圾回收的工做,減小垃圾回收時間如ParNew,爲了將啊垃圾回收對程序的影響(STW)降到最低,人們又發明了併發回收器(CMS),仍須要STW。最新的G1收集器與CMS一大優點就是創建可預測的回收時間,指明在長度爲M毫秒的時間段內,垃圾回收的時間不超過N秒。安全

再看看多線程,咱們都知道線程切換會消耗資源,那麼具體消耗什麼資源呢?從計算機底層來說,操做分三步,從內存取值,計算,將值放入內存。大概過程就是PC(程序計數器)從指存(cache)取下一條指令,IR(指令寄存器)保存當前執行的指令,再從數存取數據結合ALU(算術邏輯單元)通用寄存器完成計算後將結果放入DR(數據緩存寄存器),最後將DR的值放入內存。咱們想一下爲何要這麼設計(不要死記硬背),cache是緩存層能夠加快取指令的速度,執行程序時咱們固然須要保存如今的指令(IR)和下一條指令(PC),指令有了咱們須要數據吧,那就從數存(AR數據地址寄存器)裏面取,指令數據都有了咱們要執行具體的運算那麼就用到了ALU,可是不是還差了什麼?好比1+1,這兩個1放到那裏,運算結果2又該放那裏,這就須要一個工做區(通用寄存器)存放運算間的數據。運算完成了咱們須要輸出結果,輸出到那裏?對,就是DR,最後進入內存。爲何不直接輸入到內存,這和取值須要cache一個道理,補償CPU和內存在速度上面的差異。剛開始學組成原理各類寄存器給我留下了莫大的陰影,可是一切的設計背後的思路都是很簡單了,各類細節與規定是爲了保證明際操做的安全性和可靠性,因此咱們首先要去理解設計後面的思想而不要將本身侷限於細節。扯的有點遠了,再看看多線程切換爲何消耗資源。java虛擬機中的程序計數器保存着當前線程執行的指令,切換線程時就要把線程的執行指令放到操做系統的指令寄存器,除此以外線程的其它資源也須要切換好比I/O設備。除了切換,線程的建立也是須要消耗資源的。多線程

相關文章
相關標籤/搜索