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