1. 程式人生 > >架構師之路--從原理角度來分析性能

架構師之路--從原理角度來分析性能

獲得 clas 思維 一體化 活性 數據拷貝 行業經驗 靈活性 時間

  埃及艷後Cleopatra,很小的時候看過媽媽買的一本書裏把她的名字翻譯成克婁巴特拉,裏面有很多描寫她美貌的場景描寫。然而這個以美貌著稱的奇女子,我看到書裏,凱撒和安東尼真正傾心的是Cleopatra背後的埃及文明及Cleopatra的智慧。羅馬是個好戰的國家,人民沒有很多的精力去創造各種文明和手工藝品。而Cleapatra在這些大佬面前的出場,總結兩個字:“華麗”。這種華麗會讓羅馬這些篡位的暴發戶首領眼前一亮。在柏林,有全世界最好的艷後肖像。她的頭發結的是個簡單的發髻,風格樸實,鼻子是稍有點長的鷹鉤鼻,嘴也算不上性感,沒有耳環,沒有項鏈。並非一個性感尤物的相貌。我可以理解。可以理解她坐在金碧輝煌的豪華大船的中央,穿著絢麗,體態驕傲而高貴,旁邊是面貌平常的修女來反襯她的美,那是政治。而留給後人的肖像,作為一個女孩子更想讓人記住的,是更內在本質的東西。古代資料記載,她聰明,詼諧,精通多種語言,喜愛學習和閱讀,還有驚人的毅力。後人評價說:“如果Cleopatra的鼻子再塌一點,世界的面貌將會改變。” 我想,其實智慧才是她最可貴的資產。

  部門開會討論方案。經常有一個很可愛的現象:“方案講解過程中,會被其他人批的體無完膚,但是最後該做的還是會做。”事情就是這樣,批判只是為了提醒實施過程該註意的問題,可能會有性能問題,一致性問題,並發問題,可能需要怎樣解決。但是提意見的人往往沒有決定權,因為有個真理叫做:“你試過嗎?”。然而這種討論會要先參加,提出自己的意見,然後看著過程的實施,檢驗自己的想法,是很有利於提高的。沒有提意見的理論基礎,沒有意見可提,最終開會都不會讓你來參加的話,可能工作很多年也只是會做項目而已。不過就我自己而言,現在的問題是一切從技術角度出發,應該多從業務和數據分析的角度整體,大局的重新審視一些目前的工作。終於有借口明天找我家微微一笑很傾城的男神老大聊聊天了。

  提到性能,先看看存儲數據的六個區域:

  1>寄存器:這是最快的存儲設備,因為它實際上在處理器內部,就是平時說的CPU。在Java內存模型中,所謂的工作內存就是將主內存的數據拷貝一些到寄存器中來提高計算速度。

  2>棧:這個存在於隨機存取存儲器區。其硬件基礎是內存條。記得我以前在人人的時候,有時候臺式機開不了機了,我有快捷解決方案:“向主機箱踢兩腳。”真的好使哦,因為開不了機是因為內存條松了。後來踢也不好使了,我就把機箱蓋兒打開手動把內存條緊了緊。好了,通過這個例子大家應該明白了,如果沒有內存條,是開不了機的。這個速度僅次於寄存器的設備通過寄存器中的棧指針與寄存器直接交互。其實一段程序的所有元素的生命周期都存於棧中,包括對象的引用。

  3>堆:通常說的內存池主要是指這部分,主要存儲Java對象。不同於Java棧,編譯器不需要知道堆中的東西要存儲多長時間,所以有它的靈活性。這種動態分配導致其分配和回收都需要比棧更長的時間。

  4>直接內存:直接內存並不是虛擬機內存的一部分,jdk1.4中引入NIO,引入了通道與緩沖區的IO方式,它可以調用Native方法直接分配堆外內存,這個堆外內存就是本機內存,不會影響到堆內存的大小。

  5>只讀存儲器:安卓手機都用這個東西來存放應用。因為應用一經安裝,就不再改變。像我這種做服務器端開發的,這個不詳細介紹。

  6>磁盤:Java是在C++上開發的,但是有更多限制。不能像C++一樣控制堆的分配,自己在棧中給對象分配空間,更不能建議編輯器給寄存器分配空間。但是Java對磁盤的存取卻是用程序直接控制的。Java可以讓對象持久化,同時這些對象也可以恢復成一個普通的隨機存儲儲存器中的對象。Java提供了輕量級持久化的支持,而JDBC和Hibernate在數據庫中提供了更為精細的存儲支持。

  7>其他機器:Java有一種叫流對象,是將對象轉換為比特流來傳輸到其他設備。和持久化對象一樣,流對象也可以恢復成普通對象。

  大家知道基本的數據類型在方法內執行的時候都是直接值拷貝到棧當中。當然它也可以包裝成非基本類型存到堆中。方法調用時像其他對象一樣只取它的引用。自動拆裝包嘛。其中數字的類型都是帶符號的。Java提供兩種高精度的數值類型,BigInteger和BigDecimal,它們沒有對應的基本數據類型。計算都要調用對象的方法,而不能直接使用運算符。當然這個要慢,就是所謂的用速度換精準度。我之前創業的生鮮網項目(已經創業失敗了)因為涉及很多錢的東西,大量用到這種數據類型。說到數據類型,大家都知道成員變量都會有一個默認值,而局部變量沒有。其實只要知道JVM原理就能明白:成員變量都需要在方法區中為其預先分配空間。而局部變量只是在棧中用到,所以沒有默認值。

  說到方法區,Hotspot基本是用持久代來實現方法區,當然jdk1.8之後改成metaspace元空間了。靜態類的成員變量和方法都是存在方法區中,而方法區是線程共享區域,所以只有一個。而普通java類是在堆中分配內存,分配是在調用new的時候完成的,一個new一個存儲空間。

  上周六原同事微信我,想讓我給他們公司做顧問,做一下團隊管理方面的建議和指導。我說那就不僅僅是團隊管理的問題,還涉及到團隊建設,業務選型,架構總體設計等諸多方面,暫定下周先去他們公司做一次訪談。

  

先介紹一下原同事的公司:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 車到加油高薪急招 中高級JAVA、中級.NET、PM、高級數據分析等職位 公司簡介 車到( http://www.51autogo.com/ )專註於為油企提供加油站綜合運營解決方案,其他核心團隊具有深厚成品油行業經驗,分別來自殼牌、BP、百度、騰訊、銷售易等跨國油企和互聯網公司。核心優勢是同時擁有國內最大的線上營銷、線下運營一體化運營網絡。 通過輕資產模式,車到快速建立了全國加油站服務網絡,通過為加油站提供品牌、系統、運營等多種服務,可幫助其快速提升銷量和利潤,短短幾年內在行業內獲得了領先地位。目前已與殼牌、延長、海油、中化道達爾等多家大型油企、數百家民營油企建立了深度合作關系。2016年合作油站近千座、流水金額超過36億。 高級JAVA 崗位職責: 1、 參與公司項目的開發,配合需求方和團隊完成項目的代碼開發以及相關文檔編寫 2、 承擔核心功能代碼編寫,重點項目的系統架構設計以及開發; 3、 深入理解業務需求,分析和發現系統的瓶頸,推動產品性能和架構優化; 4、 技術文檔的編寫; 5、 有能力對平臺框架的性能進行優化/功能升級; 6、 新人指導、培訓以及Code Review,主導技術難題攻關,提升團隊整體技術水平; 任職要求: 1、 全日制本科、碩士及以上學歷,985/211院校計算機相關專業畢業,英語讀寫良好; 2、 3年及以上實際Java後端研發經驗,1年以上互聯網系統架構設計經驗; 3、 熟練掌握java及面向對象設計開發,對部分java技術有深入研究,研究過優秀開源軟件的源碼並有心得者優先; 4、 有較強的邏輯思維能力,善於分析、歸納、解決問題, 能夠獨立或帶隊進行項目開發; 5、 對主流框架有深入理解(如Spring MVC,Spring,MyBatis等)並且熟練使用; 6、 對MQ、RPC、緩存有較為深入研究,理解IO、多線程等基礎框架,對JVM的原理有一定的了解; 7、 熟悉Mysql數據庫和優化方案、主流應用服務器tomcat,jetty等 配置與部署。 8、 了解linux基本命令使用。 高級數據分析 崗位描述: 1、對於各類營銷活動的執行、活動效果進行數據追蹤、用戶行為分析; 2、專項就流失用戶喚醒、用戶差異化營銷等項目進行數據統計和分析; 3、能夠深入了解研究相關的數據問題和痛點,通過商業分析為研究報告的運營決策、數據產品方向提供數據支持; 4、通過數據報告、產品和建模成果改進數據產品,推動數據驅動研究的實踐和發展。 5、對公司銷售運營數據進行分析匯總,為公司運營提供數據支持,能夠與運營和產品團隊深入溝通,並向產品團隊提出有效需求;針對研究的新問題、新方向提出數據分析解決方案並對油站營銷方案提供有效建議; 崗位要求 1、4年以上相關工作經歷,統計、數學、計算機軟件、數量經濟或其他相關國家統招重點院校本科及以上學歷; 2、了解Hadoop、SPSS等數據平臺技術,對企業數據架構有清晰的思路,對數據中間層設計、搭建及維護有一定的經驗; 3、熟練運用office、SQL,掌握R語言,能高效的與技術和產品團隊進行溝通; 4、良好的研究嗅覺,有良好的數據分析、挖掘和建模的經驗;

  這就是我對他們公司的所有了解,源於他總是找我給他公司招人。我現在對於他們究竟要做什麽線上產品,最終要達到什麽效果,人員情況都不了解。下周見他們老總之前要做充分的準備。

架構師之路--從原理角度來分析性能