摘要:我們學習程序語言一定不要被束縛到語言細節(jié)和規(guī)范上面,而要從計算機邏輯執(zhí)行層面思考。多核的出現(xiàn)人們自然想到使多個線程同時執(zhí)行垃圾回收的工作,減少垃圾回收時間如,為了將啊垃圾回收對程序的影響降到最低,人們又發(fā)明了并發(fā)回收器,仍需要。
我們學習程序語言一定不要被束縛到語言細節(jié)和規(guī)范上面,而要從計算機邏輯執(zhí)行層面思考。細節(jié)和規(guī)范都是人為設定的,是大牛抽象計算機邏輯后的加工品。對于技術(shù)問題我們要尋根溯源,要高屋建瓴。
這段時間在準備面試,為了自認為更好的表現(xiàn)而去背大量的面試題。今日在知乎看到了這一段話,讓自己醍醐灌頂。
我們就從java虛擬機這個方面開始說說看,很多小白一上來就被各種分代,處理器類型搞暈了包括我,往往就是死記硬背了那么一些規(guī)則,根本談不上理解的深入。但是事情的出現(xiàn)都是有原因的,都是為了解決實際的問題。
java程序運行在虛擬機之上,虛擬機又和操作系統(tǒng)打交道,完成數(shù)據(jù)的存儲,運算,輸出。虛擬機在加載.class文件的時候會在內(nèi)存開辟一個“方法區(qū)”來存儲類的基本信息同時在“堆”生成一個Class對象為反射提供了支持。。內(nèi)存是有限的,而程序運行時又不斷的創(chuàng)建對象,因此我們要定期處理一些不用的對象。生成對象的方法有new,反射,清理對象就有我們常用的GC算法如標記,標記整理,復制算法等等。
為什么會有三種方法?因為每種方法都有自己的局限性,標記-清除算法的缺點在于會產(chǎn)生大量的內(nèi)存碎片標記-整理算法則是對它的一種改進,將碎片往一邊移動,缺點是。復制算法則解決了內(nèi)存碎片的問題,但浪費了50%的額外空間。我們要依據(jù)不同類型對象的特點采取最合適的算法進行處理。對于新生代,由于數(shù)量少我們采用復制算法提高效率,對于老生代對象因為數(shù)量眾多我們采取標記-整理算法進行處理。
好了具體垃圾回收算法我們清除了,我們再想想按什么策略去執(zhí)行垃圾回收?大多數(shù)人都能想到的是后臺運行一個進程,每隔段時間進行垃圾回收,完成之后再繼續(xù)執(zhí)行原來的程序,這就是最原始的串行回收器Serial。多核的出現(xiàn)人們自然想到使多個線程同時執(zhí)行垃圾回收的工作,減少垃圾回收時間如ParNew,為了將啊垃圾回收對程序的影響(STW)降到最低,人們又發(fā)明了并發(fā)回收器(CMS),仍需要STW。最新的G1收集器與CMS一大優(yōu)勢就是建立可預測的回收時間,指明在長度為M毫秒的時間段內(nèi),垃圾回收的時間不超過N秒。
再看看多線程,我們都知道線程切換會消耗資源,那么具體消耗什么資源呢?從計算機底層來講,操作分三步,從內(nèi)存取值,計算,將值放入內(nèi)存。大概過程就是PC(程序計數(shù)器)從指存(cache)取下一條指令,IR(指令寄存器)保存當前執(zhí)行的指令,再從數(shù)存取數(shù)據(jù)結(jié)合ALU(算術(shù)邏輯單元)通用寄存器完成計算后將結(jié)果放入DR(數(shù)據(jù)緩存寄存器),最后將DR的值放入內(nèi)存。我們想一下為什么要這么設計(不要死記硬背),cache是緩存層可以加快取指令的速度,執(zhí)行程序時我們當然需要保存現(xiàn)在的指令(IR)和下一條指令(PC),指令有了我們需要數(shù)據(jù)吧,那就從數(shù)存(AR數(shù)據(jù)地址寄存器)里面取,指令數(shù)據(jù)都有了我們要執(zhí)行具體的運算那么就用到了ALU,但是不是還差了什么?比如1+1,這兩個1放到那里,運算結(jié)果2又該放那里,這就需要一個工作區(qū)(通用寄存器)存放運算間的數(shù)據(jù)。運算完成了我們需要輸出結(jié)果,輸出到那里?對,就是DR,最后進入內(nèi)存。為什么不直接輸入到內(nèi)存,這和取值需要cache一個道理,補償CPU和內(nèi)存在速度上面的差別。剛開始學組成原理各種寄存器給我留下了莫大的陰影,但是一切的設計背后的思路都是很簡單了,各種細節(jié)與規(guī)定是為了保證實際操作的安全性和可靠性,所以我們首先要去理解設計后面的思想而不要將自己局限于細節(jié)。扯的有點遠了,再看看多線程切換為什么消耗資源。java虛擬機中的程序計數(shù)器保存著當前線程執(zhí)行的指令,切換線程時就要把線程的執(zhí)行指令放到操作系統(tǒng)的指令寄存器,除此之外線程的其它資源也需要切換比如I/O設備。除了切換,線程的創(chuàng)建也是需要消耗資源的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/68972.html
摘要:第一點,先清楚你的目的你學編程想要做什么你對哪方面感興趣然后去百度查一下哪些編程語言適合做那個方向,帶著目的去學習,如果一開始沒選好,中途掉頭就很可惜了。 你是不是...
摘要:我開始去關(guān)注一個問題的最終目的是什么,得益于喬治波利亞的書如何解決這個問題。在此基礎(chǔ)上,我也會制定了計劃,這也是喬治波利亞的另一個建議。明白為什么讓我對前后關(guān)系理解更深刻,幫助我成為一個見多識廣的程序員。 showImg(https://segmentfault.com/img/bVbvMKu); 原文鏈接: https://medium.com/free-code-camp... ...
摘要:上次翻過一篇我是如何在自學編程個月后找到工作的,是一個編程自學者的經(jīng)驗之談。如果你想通過學習編程來改善你的生活,你不該總想著這些快速成功的案例。 有人問我, Reddit 是什么網(wǎng)站,我想了下說: 美國貼吧 。 但話說回來,關(guān)注了一陣子我發(fā)現(xiàn),Reddit 上的討論真要比貼吧不知道高到哪里去了,甚至比不少知乎回答要有價值。而且感覺下面的討論氛圍也更好些。 我在上面關(guān)注了 learnpr...
摘要:我的決定是學人工智能,當時對這個比較感興趣。從機器學習學到深度學習再學回機器學習。面試,成功地去公司從事機器學習深度學習方面的基礎(chǔ)工作。這個系列不僅僅以學習為目的,目的是為了達到機器學習的工作入門標準。 每個字都是經(jīng)驗所得,都是站在一個零基礎(chǔ)的人的角度寫的,純手打+網(wǎng)上優(yōu)秀資源整合,希望大家能每個字都認真看。 接下來文章會側(cè)重在以下幾方面 1、零基礎(chǔ)如何進行人工智能的自學(以找工作為目...
閱讀 3774·2021-11-25 09:43
閱讀 2904·2021-11-25 09:43
閱讀 4022·2021-11-24 09:38
閱讀 777·2021-11-18 10:02
閱讀 2339·2021-09-22 15:53
閱讀 3085·2019-08-30 15:44
閱讀 2841·2019-08-30 14:01
閱讀 2974·2019-08-29 15:15