Java開發(fā)者必讀的10篇精選文章
作為最受歡迎的編程語(yǔ)言之一,Java已經(jīng)走過(guò)了20個(gè)年頭。從已經(jīng)落寞的諾基亞到現(xiàn)在火熱的電商系統(tǒng),我們都能看到Java語(yǔ)言的身影。經(jīng)過(guò)20年的歷練,這門語(yǔ)言已經(jīng)逐漸成熟,并經(jīng)過(guò)很多大型系統(tǒng)的考驗(yàn)。社區(qū)關(guān)于這門語(yǔ)言的討論,也從語(yǔ)言使用過(guò)渡到了性能優(yōu)化以及反思。下面是學(xué)習(xí)啦小編為大家收集整理的Java開發(fā)者必讀的10篇精選文章,歡迎大家閱讀。
Java開發(fā)者必讀的10篇精選文章
1、作為一名Java程序員,我為何不在生產(chǎn)項(xiàng)目中轉(zhuǎn)向GO
自Google在2009年發(fā)布Go語(yǔ)言的第一個(gè)正式版之后,這門語(yǔ)言就以出色的語(yǔ)言特性受到大家的追捧,尤其是在需要高并發(fā)的場(chǎng)景下,大家都會(huì)想到是不是該用Go。隨后,在國(guó)內(nèi)涌現(xiàn)出了一批以七牛為代表的使用Go作為主要語(yǔ)言的團(tuán)隊(duì),而許世偉大神本人也在各種場(chǎng)合下極力推動(dòng)Go在國(guó)內(nèi)的發(fā)展,于是在這種大環(huán)境下,中國(guó)的Go開發(fā)者群體逐漸超越了其他地區(qū)。
那么問題來(lái)了,業(yè)余時(shí)間好學(xué)是一回事,真正要將一個(gè)新東西運(yùn)用到生產(chǎn)中則是另一回事。JavaScript的開發(fā)者可以義無(wú)反顧地選擇Node.js,但是對(duì)于Java開發(fā)者來(lái)說(shuō),在下一個(gè)大項(xiàng)目里究竟是該選擇Go,還是Java呢?
2、企業(yè)級(jí)Java應(yīng)用最重要的4個(gè)性能指標(biāo)
雖然很多人都曾預(yù)言Java將一蹶不振,但是不可否認(rèn)的是,很多重要項(xiàng)目中,尤其是銀行和政府一些大型項(xiàng)目,Java仍在其中扮演著極其重要的角色。國(guó)內(nèi)APM領(lǐng)軍企業(yè)OneAPM的Java工程師陶炳哲,多次參與銀行、運(yùn)營(yíng)商等大型企業(yè)的性能優(yōu)化工作,總結(jié)了企業(yè)級(jí)Java應(yīng)用最應(yīng)重視的4個(gè)性能指標(biāo),主要包括:商業(yè)事務(wù),外部服務(wù),垃圾回收以及應(yīng)用布局。
3、你的Java代碼對(duì)JIT編譯友好嗎?
JIT編譯器是Java虛擬機(jī)(以下簡(jiǎn)稱JVM)中效率最高并且最重要的組成部分之一。但是很多的程序并沒有充分利用JIT的高性能優(yōu)化能力,很多開發(fā)者甚至也并不清楚他們的程序有效利用JIT的程度。
在本文中,我們將介紹一些簡(jiǎn)單的方法來(lái)驗(yàn)證你的程序是否對(duì)JIT友好。這里我們并不打算覆蓋諸如JIT編譯器工作原理這些細(xì)節(jié)。只是提供一些簡(jiǎn)單基礎(chǔ)的檢測(cè)和方法來(lái)幫助你的代碼對(duì)JIT友好,進(jìn)而得到優(yōu)化。
4、Java大牛談:我為什么反對(duì)用Node
隨著無(wú)線端的快速普及,前后端分離技術(shù)走上前臺(tái),而Node由于它的一些特性被工程師快速接受尤其是前端工程師,所以產(chǎn)生了很多Node是否會(huì)引起新的技術(shù)變革的討論。
我本人是淘系的一個(gè)Web開發(fā)人員,基本上經(jīng)歷了淘系關(guān)于Node和Java技術(shù)選型討論的過(guò)程,所以今天我給大家推演一下在像淘系這個(gè)環(huán)境下Node能否會(huì)成為主流的Web開發(fā)技術(shù),當(dāng)然后面也給出了我認(rèn)為比較適合的場(chǎng)景。
在Java虛擬機(jī)(以下簡(jiǎn)稱JVM)中,類包含其對(duì)應(yīng)的元數(shù)據(jù),比如類的層級(jí)信息,方法數(shù)據(jù)和方法信息(如字節(jié)碼,棧和變量大小),運(yùn)行時(shí)常量池,已確定的符號(hào)引用和虛方法表。
在過(guò)去(當(dāng)自定義類加載器使用不普遍的時(shí)候),類幾乎是“靜態(tài)的”并且很少被卸載和回收,因此類也可以被看成“永久的”。另外由于類作為JVM實(shí)現(xiàn)的一部分,它們不由程序來(lái)創(chuàng)建,因?yàn)樗鼈円脖徽J(rèn)為是“非堆”的內(nèi)存。
在JDK8之前的HotSpot虛擬機(jī)中,類的這些“永久的”數(shù)據(jù)存放在一個(gè)叫做永久代的區(qū)域。永久代一段連續(xù)的內(nèi)存空間,我們?cè)贘VM啟動(dòng)之前可以通過(guò)設(shè)置-XX:MaxPermSize的值來(lái)控制永久代的大小,32位機(jī)器默認(rèn)的永久代的大小為64M,64位的機(jī)器則為85M。永久代的垃圾回收和老年代的垃圾回收是綁定的,一旦其中一個(gè)區(qū)域被占滿,這兩個(gè)區(qū)都要進(jìn)行垃圾回收。但是有一個(gè)明顯的問題,由于我們可以通過(guò)‑XX:MaxPermSize 設(shè)置永久代的大小,一旦類的元數(shù)據(jù)超過(guò)了設(shè)定的大小,程序就會(huì)耗盡內(nèi)存,并出現(xiàn)內(nèi)存溢出錯(cuò)誤(OOM)。
備注:在JDK7之前的HotSpot虛擬機(jī)中,納入字符串常量池的字符串被存儲(chǔ)在永久代中,因此導(dǎo)致了一系列的性能問題和內(nèi)存溢出錯(cuò)誤。想要了解這些永久代移除這些字符串的信息,請(qǐng)?jiān)L問這里查看。
6、Java9新功能:HTTP2&REPL篇
對(duì)Java 9的炒作將不再局限于模塊化(modularity),Java 9正在搜羅大量額外的功能模塊,這些功能模塊正作為Java增強(qiáng)提案(JEP)提交,并在OpenJDK (Java SE的參考實(shí)現(xiàn)項(xiàng)目)中實(shí)現(xiàn)。
在這篇文章中,我們將重點(diǎn)關(guān)注一些或?qū)⒃贘ava 9整個(gè)生命周期中,對(duì)開發(fā)者的工作生活影響最大的JEP,包括新的HTTP/2支持和JShell REPL(讀取-求值-打印-循環(huán)),后者帶來(lái)了基于shell的交互式Java開發(fā)環(huán)境和探索性開發(fā)API。
7、簡(jiǎn)化你的Java代碼,讓工作更高效
計(jì)算機(jī)專家在問題求解時(shí)非常重視表達(dá)式簡(jiǎn)潔性的價(jià)值。Unix的先驅(qū)者Ken Thompson曾經(jīng)說(shuō)過(guò)非常著名的一句話:“丟棄1000行代碼的那一天是我最有成效的一天之一。”這對(duì)于任何一個(gè)需要持續(xù)支持和維護(hù)的軟件項(xiàng)目來(lái)說(shuō),都是一個(gè)當(dāng)之無(wú)愧的目標(biāo)。早期的Lisp貢獻(xiàn)者Paul Graham甚至將語(yǔ)言的簡(jiǎn)潔性等同為語(yǔ)言的能力。這種對(duì)能力的認(rèn)識(shí)讓可以編寫緊湊、簡(jiǎn)介的代碼成為許多現(xiàn)代軟件項(xiàng)目選擇語(yǔ)言的首要標(biāo)準(zhǔn)。
相比于其他程序設(shè)計(jì)語(yǔ)言,Java語(yǔ)言的冗長(zhǎng)已經(jīng)名聲在外。其主要原因是由于程序開發(fā)社區(qū)中所形成的慣例,在完成任務(wù)時(shí),很多情況下,要更大程度地考慮描述性和控制。例如,長(zhǎng)期來(lái)看,長(zhǎng)變量名會(huì)讓大型代碼庫(kù)的可讀性和可維護(hù)性更強(qiáng)。描述性的類名通常會(huì)映射為文件名,在向已有系統(tǒng)中增加新功能時(shí),會(huì)顯得很清晰。如果能夠一直堅(jiān)持下去,描述性名稱可以極大簡(jiǎn)化用于表明應(yīng)用中某一特定的功能的文本搜索。這些實(shí)踐讓Java在大型復(fù)雜代碼庫(kù)的大規(guī)模實(shí)現(xiàn)中取得了極大的成功。
本文將著重介紹編寫簡(jiǎn)潔Java代碼的最佳實(shí)踐,特別是關(guān)于JDK8中新增的功能。簡(jiǎn)而言之,Java 8中Lambda表達(dá)式的引入讓更加優(yōu)雅的代碼成為可能。這在用新的Java Streaming API處理集合時(shí)尤其明顯。
8、你的Java日志,有沒有用這些改進(jìn)辦法
在任何系統(tǒng)中,日志都是非常重要的組成部分,它是反映系統(tǒng)運(yùn)行情況的重要依據(jù),也是排查問題時(shí)的必要線索。絕大多數(shù)人都認(rèn)可日志的重要性,但是又有多少人仔細(xì)想過(guò)該怎么打日志,日志對(duì)性能的影響究竟有多大呢?今天就讓我們來(lái)聊聊Java日志性能那些事。
掃描二維碼關(guān)注公眾號(hào)后,發(fā)送數(shù)字 8 即可閱讀原文。
9、Java NIO通信框架在電信領(lǐng)域的實(shí)踐
從廣義上看電信軟件的范圍非常廣,細(xì)分實(shí)際可以分為兩大類:系統(tǒng)軟件和業(yè)務(wù)應(yīng)用軟件。
系統(tǒng)軟件包括路由器底層的信令機(jī)軟件、手機(jī)操作系統(tǒng)等,業(yè)務(wù)應(yīng)用軟件主要包括客戶關(guān)系管理CRM、網(wǎng)上營(yíng)業(yè)廳、融合計(jì)費(fèi)OCS和各類消息網(wǎng)關(guān),例如短信網(wǎng)關(guān)、彩信網(wǎng)關(guān)等。
本文重點(diǎn)介紹電信業(yè)務(wù)應(yīng)用軟件的技術(shù)變遷歷史,以及華為電信軟件架構(gòu)演進(jìn)和Java NIO框架在技術(shù)變遷中起到的關(guān)鍵作用。
10、寫代碼這回事兒,架構(gòu)師你可以說(shuō)不嗎?
要讓一個(gè)成功的架構(gòu)得以實(shí)現(xiàn),架構(gòu)師必須要在整個(gè)生命周期始終保持與交付團(tuán)隊(duì)的緊密合作。保持緊密合作能夠促進(jìn)架構(gòu)層面的快速反饋循環(huán)。并且還能夠?yàn)榧軜?gòu)師提供更多的與團(tuán)隊(duì)交流架構(gòu)愿景和領(lǐng)導(dǎo)團(tuán)隊(duì)的機(jī)會(huì)。
正如本文題目所描述的那樣,架構(gòu)師除了可以參與到實(shí)際的編碼工作中之外,還有許多其他的方式可以參與到交付團(tuán)隊(duì)中,例如結(jié)對(duì)編程和同行評(píng)審。相反,某些參與方式有可能會(huì)對(duì)團(tuán)隊(duì)造成負(fù)面影響,例如接管交付、不允許團(tuán)隊(duì)自組織或者采用集體所有制。
其中一個(gè)關(guān)鍵目的是為了避免“象牙塔”架構(gòu)師的角色——只在項(xiàng)目最初發(fā)布架構(gòu),然后就再也不見蹤影。謀求與交付團(tuán)隊(duì)的協(xié)作關(guān)系,共同努力盡早識(shí)別和解決架構(gòu)性缺陷,從而交付成功的架構(gòu)和最終的產(chǎn)品。