JVM速記

Java內(nèi)存區(qū)域與內(nèi)存溢出異常

運(yùn)行時數(shù)據(jù)區(qū)域

程序計(jì)數(shù)器:字節(jié)碼的行號指示器;每條線程都需要有一個獨(dú)立的程序計(jì)數(shù)器;“線程私有”;唯一沒有OOMError情況的區(qū)域。
Java虛擬機(jī)棧(Hot Spot本地方法棧):Java方法執(zhí)行的內(nèi)存模型;“線程私有”;局部變量表存放了各種基本類型、對象引用、returnAddress類型;拋出SOFError和OOMError;單線程下只拋出SOFError,不斷建立線程可以產(chǎn)生OOMError。
Java堆:存放對象實(shí)例;拋出OOMError異常。
方法區(qū)(1.7):存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)常量、即時編譯器變異后的代碼等數(shù)據(jù);1.8后類元數(shù)據(jù)放到本地內(nèi)存、常量池和靜態(tài)變量放到 Java 堆;拋出OOMError異常。

HotSpot虛擬機(jī)對象

對象的創(chuàng)建:對象規(guī)整內(nèi)存分配方式“指針碰撞”;對象不規(guī)整內(nèi)存分配方式:“空閑列表”;內(nèi)存分配方式取決于垃圾收集器回收內(nèi)存時是否有整理功能。
保障對象內(nèi)存分配線程安全兩種方法:分配時采用循環(huán)CAS保證原子性;本地線程分配緩沖(TLAB)。
對象的內(nèi)存結(jié)構(gòu):對象頭、實(shí)例數(shù)據(jù)和對齊填充;對象頭一部分用于存儲對象自身的運(yùn)行時數(shù)據(jù)(哈希碼、GC年代、鎖相關(guān)信息)、一部分為類型指針;實(shí)例數(shù)據(jù)存儲字段內(nèi)容;對齊填充保證對象大小是8字節(jié)的整數(shù)倍。
對象的訪問定位:通過句柄訪問對象的棧里存儲句柄地址,句柄池里存儲到對象實(shí)例的指針(指向堆)和到對象類型數(shù)據(jù)的指針(指向方法區(qū)或本地內(nèi)存);通過直接指針訪問對象的棧里存儲的實(shí)例對象的指針,實(shí)例對象對象頭里存儲到對象類型數(shù)據(jù)的指針。

垃圾收集器與內(nèi)存分配策略

回收對象判斷

引用計(jì)數(shù)法:計(jì)算引用數(shù)量,有引用時就不回收;實(shí)現(xiàn)簡單;難以解決循環(huán)引用。
可達(dá)性分析算法:從GC Roots節(jié)點(diǎn)開始搜索,對象不可達(dá)則回收;GC Roots包括虛擬機(jī)棧中應(yīng)用的對象、方法區(qū)中類靜態(tài)屬性引用的對象、方法區(qū)中常量引用的對象、本地方法棧JNI引用的對象。
強(qiáng)引用:GC永不回收。
軟引用:SoftReference;系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前進(jìn)行二次回收。
弱引用:WeakReference;下一次GC回收。
虛引用:PhantomReference;對象被GC時收到一個系統(tǒng)通知。
回收方法區(qū):回收廢棄常量和無用的類;該類無實(shí)例、ClassLoader被回收、對應(yīng)的java.lang.Class對象無引用的類可以被回收。

垃圾收集算法

標(biāo)記清除算法:效率問題;空間問題。
復(fù)制算法(新生代):解決效率問題;Eden和Survivor的大小比例是8:1;分配擔(dān)保。
標(biāo)記整理(老年代):解決空間問題。

HotSpot算法實(shí)現(xiàn)

枚舉根節(jié)點(diǎn):OopMap存放對象引用位置幫助可達(dá)性分析;
安全點(diǎn):安全點(diǎn)才能暫停開始GC;安全點(diǎn)太少會使得GC等待時間太長;太長會生成大量OopMap增大運(yùn)行負(fù)荷。
安全區(qū)域:在一段代碼中引用關(guān)系沒有變化,擴(kuò)展的安全點(diǎn)。
搶先式中斷:GC停止所有線程,不在安全點(diǎn)的線程恢復(fù)并跑到安全點(diǎn)再停止。
主動式中斷:各線程在安全點(diǎn)或創(chuàng)建對象需要分配內(nèi)存的地方輪詢中斷標(biāo)志位,自己主動中斷。

垃圾收集器

Serial\Serial Old收集器:新生代復(fù)制;老年代標(biāo)記-整理;都需要“STW”;對于Client模式下的虛機(jī)是個好選擇。
ParNew\ParNew Old收集器:多線程版Serial;Server模式下的首選新生代GC收集器(唯一可以與CMS配合的)。
Parallel Scavenge收集器:復(fù)制算法;CMS等收集器的關(guān)注點(diǎn)是盡可能地縮短“STW”時間(適合交互程序),Parallel Scavenge收集器的目的是達(dá)到一個可控制的吞吐量(適合后臺程序)。
CMS收集器:初始標(biāo)記、并發(fā)標(biāo)記、重新標(biāo)記、并發(fā)清除四個步驟;初始標(biāo)記和重新標(biāo)記需要“STW”;初始標(biāo)記只標(biāo)記能和GC Roots直接關(guān)聯(lián)的對象;并發(fā)標(biāo)記一邊全局搜索一邊記錄引用變化;重新標(biāo)記將全局搜索與引用變化的對象做并集;并發(fā)清除進(jìn)行GC;CMS占用CPU較高;無法處理浮動垃圾;需要碎片整理。
G1收集器:并行與并發(fā);分代收集;空間整合;可預(yù)測的停頓;將整個Java堆劃分為多個大小相等的獨(dú)立區(qū)域,優(yōu)先回收價(jià)值最大的區(qū)域;初始標(biāo)記、并發(fā)標(biāo)記、最終標(biāo)記、篩選回收四個步驟(與CMS類似);
Remembered Set:用以存放堆的其他部分對本部分的引用以減少對其他部分GC Roots的搜索(新生代存放老年代對其的引用)(G1區(qū)域存放其他區(qū)域的引用);以空間換時間。

內(nèi)存分配與回收策略

對象優(yōu)先在Eden分配;大對象直接進(jìn)入老年代;長期存活的對象進(jìn)入老年代。
動態(tài)對象年齡判定:如果Survivor空間中相同年齡所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象直接進(jìn)入老年代。
空間分配擔(dān)保:Minor GC之前,虛機(jī)先檢查老年代最大可用空間是否大于新生代所有對象總空間,若大于則Minor GC,若不大于檢查參數(shù)是否允許擔(dān)保失敗,如果允許則檢查老年代最大可用空間是否大于新生代晉級老年代的平均大小,若大于則Minor GC,否則Full GC。

類文件與類加載機(jī)制

類文件

類文件:平臺無關(guān)性;語言無關(guān)性;8位字節(jié)為基礎(chǔ)單位的二進(jìn)制流。

類加載的時機(jī)

類的生命周期:加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用、卸載。
觸發(fā)類初始化:遇到new、getstatic、putstatic、invokestatic這4條字節(jié)碼命令時;reflect方法反射調(diào)用時;初始化子類的時候父類還沒初始化(接口在被使用時才會初始化);虛擬機(jī)啟動時初始化主類;動態(tài)語言支持解析出REF_getStatic、REF_putStatic、REF_invokeStatic的句柄并且對應(yīng)的類沒有初始化時。

類加載的過程

加載:加載器通過類的全限定名獲取定義此類的二進(jìn)制字節(jié)流(從ZIP包、網(wǎng)絡(luò)、運(yùn)行時計(jì)算生成、其他文件生成、數(shù)據(jù)庫中讀?。?;將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時數(shù)據(jù)結(jié)構(gòu);在內(nèi)存中生成一個代表這個類的Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口。
數(shù)組加載:不通過類加載器創(chuàng)建、由虛擬機(jī)直接創(chuàng)建;引用類型數(shù)組遞歸加載組件類型、在加載該組件類型的類加載器的類名稱空間上被標(biāo)識;基本類型數(shù)組與引導(dǎo)類加載器關(guān)聯(lián);數(shù)組可見性與組件可見性一致(基本類型為public)。
驗(yàn)證:虛擬機(jī)對自身保護(hù)的一項(xiàng)重要工作;文件格式驗(yàn)證(驗(yàn)證字節(jié)流是否符合Class文件格式的規(guī)范)、元數(shù)據(jù)驗(yàn)證(對類的元數(shù)據(jù)信息進(jìn)行語義校驗(yàn))、字節(jié)碼驗(yàn)證(通過數(shù)據(jù)流和控制流分析確定程序語義是合法符合邏輯的、通過StackMapTable優(yōu)化)、符號引用驗(yàn)證(確保解析動作能正常執(zhí)行);-Xverify:none關(guān)閉大部分類驗(yàn)證措施、縮短虛擬機(jī)類加載時間。
準(zhǔn)備:正式為類變量在方法區(qū)中分配內(nèi)存并設(shè)置類變量初始值(static)。
解析:將常量池內(nèi)的符號引用替換為直接引用;符號引用的字面量形式明確定義在Java虛擬機(jī)規(guī)范的Class文件格式中;直接引用可以是直接指向目標(biāo)的指針、相對偏移量或是一個能間接定位到目標(biāo)的句柄;虛擬機(jī)可以根據(jù)需要判斷在類被加載器加載時就對常量池中的符號引用進(jìn)行解析還是等到一個符號引用將要被使用前才去解析。
初始化:執(zhí)行類構(gòu)造器方法(編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)語句塊中的語句合并產(chǎn)生的)的過程;編譯器收集的順序是由語句在源文件中出現(xiàn)的順序決定的;虛擬機(jī)會保證子類類構(gòu)造器方法執(zhí)行之前父類的方法已經(jīng)執(zhí)行完畢;類構(gòu)造器方法不是必須的;執(zhí)行接口的類構(gòu)造器方法不需要先執(zhí)行父接口的類構(gòu)造器方法,只有當(dāng)靜態(tài)變量被使用時父接口才會初始化;虛擬機(jī)會保證類構(gòu)造器方法在多線程環(huán)境中被正確地加鎖、同步(單例的線程安全實(shí)現(xiàn)方法之一)。

類加載器

類加載器:實(shí)現(xiàn)通過一個類的全限定名來獲取描述此類的二進(jìn)制流這一動作的代碼模塊;由加載類的類加載器和這個類本身一同確立類在Java虛擬機(jī)中的唯一性;啟動類加載器(Bootstrap ClassLoader)由C++實(shí)現(xiàn),虛擬機(jī)的一部分;其他類加載器由Java語言實(shí)現(xiàn),獨(dú)立于虛擬機(jī)外部,全部繼承自抽象類java.lang.ClassLoader;其他類加載器包括擴(kuò)展類加載器(負(fù)責(zé)加載<JAVA_HOME>\lib\ext目錄中的或java.ext.dirs系統(tǒng)變量所指定的路徑中的所有類庫、開發(fā)者可直接使用)、應(yīng)用程序類加載器(負(fù)責(zé)加載用戶類路徑上所指的類庫,開發(fā)者可直接使用)。
雙親委派模型:除了頂層的啟動類加載器外,其余的類加載器都應(yīng)當(dāng)有自己的父類加載器,父子關(guān)系使用組合實(shí)現(xiàn);如果一個類加載器收到了類加載請求,它首先不會自己嘗試加載這個類,而是把這個請求委派給父類加載器去完成;線程上下文加載器、OSGi模塊化熱部署不遵守雙親委派模型。

虛擬機(jī)字節(jié)碼執(zhí)行引擎

運(yùn)行時棧幀結(jié)構(gòu)

棧幀:用于支持虛擬機(jī)進(jìn)行方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu),虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)中的虛擬機(jī)棧中的棧元素;每一個方法從調(diào)用開始至執(zhí)行完成的過程,都對應(yīng)著一個棧幀在虛擬機(jī)棧里面從入棧到出棧的過程;棧幀包括局部變量表、操作數(shù)棧、動態(tài)連接、方法返回地址和一些額外的附加信息;在活動線程中位于棧頂?shù)臈攀怯行У?,成為?dāng)前棧幀;當(dāng)前棧幀相關(guān)聯(lián)的方法稱為當(dāng)前方法。
局部變量表:用于存放方法參數(shù)和方法內(nèi)部定義的局部變量;實(shí)例方法局部變量表的第0位索引Slot默認(rèn)是用于傳遞方法所屬對象實(shí)例的引用(this)。
操作數(shù)棧:先入后出棧;方法的執(zhí)行過程中會有各種字節(jié)碼指令往操作數(shù)棧中寫入和提取內(nèi)容(出棧、入棧)。
動態(tài)連接:每個棧幀都包含一個指向運(yùn)行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支持方法調(diào)用過程中的動態(tài)連接。
方法返回地址:正常完成出口中PC計(jì)數(shù)器的值作為返回地址;異常完成出口(拋異常)返回地址通過異常處理器表來確定;方法退出的過程等同于把當(dāng)前棧幀出棧。
附加信息:一些規(guī)范里沒有描述的信息;動態(tài)連接、方法返回地址與其他附加信息全部歸為棧幀信息。

方法調(diào)用

解析:調(diào)用目標(biāo)在程序代碼寫好、編譯器進(jìn)行編譯時就必須確定下來;靜態(tài)方法、私有方法、實(shí)例構(gòu)造器、父類方法在類加載的時候就會把符號引用解析為該方法的直接引用。
靜態(tài)分派:靜態(tài)類型決定重載版本;所有依賴靜態(tài)類型來定位方法執(zhí)行版本的分派動作稱為靜態(tài)分派;靜態(tài)分派發(fā)生在編譯階段。
動態(tài)分派:在運(yùn)行期根據(jù)實(shí)際類型確定方法執(zhí)行版本的分派過程。
單分派多分派:Java是一門靜態(tài)多分派、多態(tài)單分派的語言。
虛擬機(jī)動態(tài)分派的實(shí)現(xiàn):為類在方法區(qū)建立一個虛方法表,虛方法表中存放著各個方法的實(shí)際入口地址。

基于棧的字節(jié)碼解釋執(zhí)行引擎

基于棧的指令集架構(gòu):指令流中的指令大部分都是零地址指令,依賴操作數(shù)棧進(jìn)行工作;可移植;執(zhí)行速度稍慢。

編譯期優(yōu)化

Javac編譯器

編譯過程:解析與填充符號表過程、插入式注解處理器的注解處理過程、語義分析與字節(jié)碼生成過程。
解析:包括詞法分析和語法分析兩個過程;詞法分析是將源代碼的字符流轉(zhuǎn)變?yōu)闃?biāo)記集合;語法分析是根據(jù)Token序列構(gòu)造抽象語法樹的過程;抽象語法樹是一種用來描述程序代碼語法結(jié)構(gòu)的樹形表示方式,語法樹的每一個節(jié)點(diǎn)都代表這程序代碼中的一個語法結(jié)構(gòu)。
填充符號表:是一組符號地址和符號信息構(gòu)成的表格;符號表中所登記的信息在編譯的不同階段都要用到。
注解處理器:在編譯期間對注解進(jìn)行處理;可以讀取、修改、添加抽象語法樹中的任意元素。
語義分析:語義分析分為標(biāo)注檢查以及數(shù)據(jù)及控制流分析;標(biāo)注檢查步驟檢查的內(nèi)容包括諸如變量使用前是否已被聲明、變量與賦值之間的數(shù)據(jù)類型是否能夠匹配等;常量折疊;數(shù)據(jù)及控制流分析是對程序上下文邏輯更進(jìn)一步的驗(yàn)證;數(shù)據(jù)及控制流分析可以檢查出諸如程序局部變量在使用前是否賦值、方法的每條路徑是否都有返回值、是否所有的受查異常都被正常處理等問題。
解語法糖:語法糖指在計(jì)算機(jī)語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用;在編譯階段將語法糖還原簡單的基礎(chǔ)語法結(jié)構(gòu)稱為解語法糖。
字節(jié)碼生成:不僅是把前面各個步驟所生成的信息轉(zhuǎn)化為字節(jié)碼寫到磁盤中,編譯器還進(jìn)行了少量的代碼添加和轉(zhuǎn)換工作;生成類構(gòu)造器;代碼替換優(yōu)化程序。

語法糖

泛型與類型擦除:參數(shù)化類型;Java實(shí)現(xiàn)為偽泛型。
自動裝箱、拆箱與遍歷循環(huán):使用最多的語法糖。
條件編譯:根據(jù)布爾常量值的真假,編譯器將會把分支中不成立的代碼塊消除。

運(yùn)行期優(yōu)化

HotSpot虛擬機(jī)內(nèi)的即時編譯器

解釋器與編譯器:當(dāng)程序需要迅速啟動和執(zhí)行的時候,解釋器可以首先發(fā)揮作用,省去編譯的時間,立即執(zhí)行;解釋器把越來越多的代碼編譯成本地代碼可以獲取更高地效率;HotSpot虛擬機(jī)中內(nèi)置了兩個即時編譯器分別為Client Compiler(C1)和Server Compiler(C2);混合模式、編譯模式、解釋模式、分層編譯模式(C1和C2同時工作)。
編譯對象及觸發(fā)條件:編譯對象為被多次調(diào)用的方法、被多次執(zhí)行的循環(huán)體。熱點(diǎn)檢測方法分別為基于采樣的熱點(diǎn)探測(檢查棧頂)和HotSpot采用的基于計(jì)數(shù)器的熱點(diǎn)探測(為每個方法建立計(jì)數(shù)器統(tǒng)計(jì)執(zhí)行次數(shù))。
基于計(jì)數(shù)器的熱點(diǎn)探測方法:方法調(diào)用計(jì)數(shù)器和回邊計(jì)數(shù)器;方法調(diào)用計(jì)數(shù)器在方法被調(diào)用后計(jì)數(shù)器加1、和回邊計(jì)數(shù)器計(jì)數(shù)和超過閾值后進(jìn)行編譯、過一段時間后計(jì)數(shù)減半;回邊計(jì)數(shù)器的作用是統(tǒng)計(jì)一個方法中循環(huán)體代碼執(zhí)行的次數(shù)、和方法調(diào)用計(jì)數(shù)器計(jì)數(shù)和超過閾值后進(jìn)行編譯、計(jì)數(shù)不會衰減。
C1編譯過程:簡單快速、局部優(yōu)化;一個平臺獨(dú)立的前端在完成一部分基礎(chǔ)優(yōu)化(如方法內(nèi)聯(lián)、常量傳播)后將字節(jié)碼構(gòu)造成一種高級中間代碼表示;一個平臺相關(guān)的后端在高級中間代碼上完成另外一下優(yōu)化(如空值檢查消除、范圍檢查消除)后生成低級中間代碼表示;在平臺相關(guān)的后端使用線性掃描算法在低級中間代碼上分配寄存器并做窺孔優(yōu)化,然后產(chǎn)生機(jī)器碼。
c2編譯過程:充分優(yōu)化過的高級編譯器;會執(zhí)行所有經(jīng)典的優(yōu)化動作和一些與Java語言特性密切相關(guān)的優(yōu)化技術(shù)。

編譯優(yōu)化技術(shù)

公共子表達(dá)式消除:語言無關(guān)的經(jīng)典優(yōu)化技術(shù)之一;用計(jì)算結(jié)果直接代替重復(fù)的公共子表達(dá)式,避免重復(fù)計(jì)算。
數(shù)組邊界檢查消除:語言相關(guān)的經(jīng)典優(yōu)化技術(shù)之一;省略一些不必要的數(shù)組邊界檢查操作。
方法內(nèi)聯(lián):最重要的優(yōu)化技術(shù)之一;消除方法調(diào)用的成本、為其他優(yōu)化手段建立良好的基礎(chǔ)。
逃逸分析:最前沿的優(yōu)化技術(shù)之一;為其他優(yōu)化手段提供依據(jù)的分析技術(shù);證明一個對象不會逃逸到方法或線程之外,則可以進(jìn)行棧上分配、同步消除、標(biāo)量替換等優(yōu)化。

Java內(nèi)存模型與線程

Java內(nèi)存模型

主內(nèi)存與工作內(nèi)存:所有的變量都存儲在主內(nèi)存中;每條線程有自己的工作內(nèi)存;工作內(nèi)存中保存了被該線程使用到的變量的主內(nèi)存副本拷貝;線程對變量的所有操作都必須在工作內(nèi)存中進(jìn)行。
內(nèi)存間交互操作:Java內(nèi)存模型定義了8種操作來完成主內(nèi)存與工作內(nèi)存的交互。
volatile型變量的特殊規(guī)則:可見性、有序性;讀前加內(nèi)存屏障,寫后加內(nèi)存屏障;
原子性:synchronized保證大范圍的原子性。
可見性:volatile、synchronized、final保證可見性。
有序性:volatile、synchronized保證有序性。
happens-before:Java內(nèi)存模型定義的兩項(xiàng)操作之間的偏序關(guān)系;程序次序規(guī)則、管程鎖定規(guī)則、volatile變量規(guī)則、線程啟動規(guī)則、線程終止規(guī)則、線程中斷規(guī)則、對象終結(jié)規(guī)則、傳遞性。

Java與線程

線程的實(shí)現(xiàn):內(nèi)核線程實(shí)現(xiàn)、使用用戶線程實(shí)現(xiàn)和使用用戶線程加輕量級進(jìn)程混合實(shí)現(xiàn)。
線程狀態(tài):新建;運(yùn)行;無限期等待;限期等待;阻塞;結(jié)束。

線程安全與鎖優(yōu)化

線程安全

線程安全:當(dāng)多個線程訪問一個對象時,如果不用考慮這些線程在運(yùn)行時環(huán)境下的調(diào)度和交替執(zhí)行,也不需要進(jìn)行額外的同步,或者在調(diào)用方進(jìn)行任何其他的協(xié)調(diào)操作,調(diào)用這個對象的行為都可以獲得正確的結(jié)果,那這個對象就是線程安全的。
線程安全程度:不可變、絕對線程安全、相對線程安全、線程兼容、線程對立。
互斥同步:synchronized、ReentrantLock。
非阻塞同步:CAS;Atomic;
無同步方案:可重入代碼;線程本地存儲。

鎖優(yōu)化

自旋鎖與自適應(yīng)鎖:讓線程不掛起,等待釋放鎖從而節(jié)約掛起恢復(fù)線程的資源;由前一次在同一個鎖上的自旋時間及鎖的擁有者來決定本次自旋的等待時間。
鎖消除:即時編譯器運(yùn)行時對一些代碼上要求同步,但是被檢測到不可能存在共享數(shù)據(jù)競爭的鎖進(jìn)行消除;鎖消除的主要判定依據(jù)來源于逃逸分析的數(shù)據(jù)分析。
鎖粗化:虛擬機(jī)探測到有一串零碎的操作都對同一個對象加鎖,將會把加鎖同步的范圍擴(kuò)展到整個操作序列的外部。
輕量級鎖:使用CAS在沒有多線程競爭的前提下減少傳統(tǒng)的重量級鎖使用操作系統(tǒng)互斥量產(chǎn)生的性能消耗。
偏向鎖:消除數(shù)據(jù)在無競爭情況下的同步原語,進(jìn)一步提高程序的運(yùn)行性能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方,同時不同JDK版本的...
    高廣超閱讀 16,072評論 3 83
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,885評論 11 349
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,286評論 8 265
  • 朋友圈中,她最早接受相親的。 那一年,她不過二十四五歲,離鄉(xiāng)背井獨(dú)自在京城打拼,蝸居在六人合租的單間,晚晚加班至深...
    舍梨閱讀 740評論 0 51
  • 許多外來務(wù)工人及學(xué)生實(shí)習(xí)去的大多數(shù)都是電子廠,在電子廠上班期間會認(rèn)識許多同事,你們彼此之間添加了好友,留下了聯(lián)系方...
    昆山訂閱閱讀 565評論 0 0

友情鏈接更多精彩內(nèi)容