死磕java並發
❶ 自學web和自學java哪一個更難一點
以web方向為基礎的java學習路線:
(由於java真正的知識范圍很廣,這里只羅列出我個人覺得重要的,至少是web中用的上的東西。)
一.J2SE階段
·java基礎【變數、運算符、標識符等】
·面向對象【封裝、繼承、多態】;
·API;
·集合框架【List、Map】;
·泛型;
·IO流;
·多線程;
·JDBC;
·正則表達式;
·高級特性【枚舉、裝箱拆箱、反射、斷言、註解等】三.Web前端基礎
·html;
·CSS ;
·Javascript(JS);
·DOM;
·ajax;
·jQuery;四.Web後端基礎
·JSP;
·JavaBean;
·Servlet;
·過濾器、監聽器;
·EL表達式語言;
·jsp自定義標簽;
·JSTL標准標簽庫;
·MVC開發模式(JSP+Servlet+JavaBean);五.開源框架
·Struts、
·Hibernate、
·Spring;
【SSH整合框架】·springMVC;
·Mybatis
·Ibatis;
【SSM、SSI整合框架】六.開發工具
初級開發工具:(這里需要在初學階段掌握,為了模塊分類清晰,放在此處)
·JDK、Tomcat;
·eclipse/Myeclipse;
·Navicat;高級開發工具:
·Maven項目管理工具;
·Git分布式版本控制系統;
·ANT代碼生成工具;
·SVN/CVS/VSS版本控制工具;八.技術前沿
(處於該階段的程序員都有可能成為引領互聯網時代前進的業界精英。下面所列基本是各大技術論壇中討論的熱門技術話題,僅供參考)
·Node.js;
·AngularJS;
·EJB;
·集群;
·負載均衡;
·分布式架構;
·搜索引擎;
·規則引擎;
·事務JTA;
·JNDI;
·面向服務架構;
·面向雲架構;
·NoSQL-MongoDB;
·Hadoop大數據;
·Docker雲計算;
.
·機器學習;
·人工智慧;
·虛擬現實;
在j2se階段,重在熟練掌握if語句、for循環的運用,介面、繼承、構造方法的理解和使用,學會查API文檔。這個階段的難點在於集合、泛型、jdbc等內容,需要了解其基本的用法和意義。
資料庫階段可以說是從只會編一些沒什麼實際作用的死程序,到能夠開發小型項目的轉折點,以上三種資料庫至少掌握其中一種,個人建議從Mysql入手。當然資料庫的種類不止這三個,這里所列的是行內使用最多的資料庫。
做後端的人,前端的基礎也是必不可少的。如果以後想做前端的話,js是關鍵,作為風口浪尖上的熱門語言,js擁有一大批擁護者認為它將是十年後的大趨勢,然而也有一些人認為js的靈活性又造成了其過於復雜的代碼和混亂的邏輯,在開發中容易出錯且難以調試。不過html和js的基礎用法對於任何web開發人員來說都是尤為重要的。
後端基礎個人建議以Servlet為中心來學習,因為servlet和java有著更緊密的聯系,而jsp又是sevlet的簡化抽離,就算是MVC的Model2開發模式(jsp+servlet+javabean),servlet也是作為核心的控制層,它更是開源框架的技術基礎。
首個mvc模式的開源框架Struts以及後來的Struts2推出至今已經盛行了14年了,隨著Spring等框架的推出和發展,使得Struts2由於大量的配置文件和獨家標簽庫而顯得相對笨重許多。這些開源框架,到底哪個好用,哪個會被取代之類的問題都不重要,因為他們都是開發的工具,作為工具來說,被更好用的工具替代是必然的,只是時間問題,所以在學習的過程中,一定要掌握工具的用法熟悉實現流程就可以了,不要死磕其實現原理。不過如果你想成為技術大牛,或者想自己也能開發一套框架出來用就另當別論了。
這里羅列的是一些用戶量多、影響范圍廣的幾種工具,看公司或個人的喜好來選擇適合自己的開發工具。
在這里你可以選擇你要從事的更加細致專業的開發任務,或者說選擇做軟體開發過程中的哪一個模塊,技術要求更加的精益求精。
❷ it企業招聘,怎麼寫it求職簡歷
一、基本格調
即打開簡歷之後的第一印象。就好比我們看見一個人,會有一個整體的感覺,他是fashion的、小清新的還是老道的?有了第一印象之後再慢慢分解來看。
加分寫法:
簡潔明了,邏輯結構清晰。
字體,排版,順暢,清晰整齊就好。
最好是PDF格式,兼容性強且不易亂序。
設計的過於浮誇或者過於簡單的。(eg.有的簡歷五顏六色、非常酷炫,卻半天找不到聯系方式,抑或是只有個人基本信息和公司名稱)
寫了十幾頁,半天打不開的,或者載入了半天,打開還亂碼。
清晰羅列出以上信息,這樣HR就不用在接下來的電話溝通或面試中再去追問這些內容,建立我們接下來電話溝通對你的熟悉度。
再額外能加上QQ或者微信就更好了(以防有時候電話打不通哦,時不時會遇到這種情況)
大部分的基本信息沒有寫
甩給我一個Github鏈接,極致簡潔的幾句描述,需要通過你的鏈接來找你的聯系方式。(如果不是博客寫的特別好,基本是要放棄你了)
工作經歷項目經歷可參照萬能的STAR法則來寫,STAR不清楚的童鞋點這里啦
效力過哪些公司,我們匹配的公司? BAT? 知名大型互聯網公司?
做過什麼行業領域,和我們目前的行業是否匹配
擅長的技術語言,應用了哪些技術棧,(Java, Scala,Ruby, React, Vue, Microservice…)
經歷的項目復雜度,及在項目中承擔什麼樣的角色(人的變化/技術的變化/環境的變化/不同工作經歷相同角色的不同點)
時間節點(空檔期)
看了半天,不知所雲,沒有任何亮點,沒有讓人有去和你聊一聊深扒的信息。
XX(全棧工程師)2013.06 — 至今
參與需求分析及實現方案設計。
設計資料庫表結構,實現後台功能及web頁面展示。
產品線上部署及運維。
ay 配置管理工程師 2010.03 — 2013.03
負責公司產品性能測試,及線上數據分析
負責公司配置管理,環境維護等工作
MOGU是一款時尚資訊app,負責推薦頁面資訊feed流的展示及用戶歷史的展示
負責數據層,處理前端邏輯整個開發工作,分布式rpc服務搭建
負責進行壓測監測、緩存處理,對接又進行改進優化,主用redis緩存
使用java搭建爬蟲server平台,進行配置和開發,進行網頁改版監測功能開發
爬取淘寶時尚品牌與其他電商網站商品品牌與詳情等
通過頻率、ip池、匿名代理等應對一些網站的反爬
在調研了kafka的優勢和我們的具體需求之後,用kafka作為消費者,保證高吞吐處理消息,並持久化消息的同時供其它服務使用,進行了系統的設計和搭建使用。 本地日誌保證消息不丟失,並通過記錄游標滑動重復讀取數據。
使用storm 負責搭建消息處理架構,並完成基於業務的消息落地,提供後續的數據 統計分析實時和離線任務,諸如pv、uv等數據,為運營做決策
網站用戶行為埋點和基於js的日誌收集器開發,定義接又和前端部門配合。主用go 2、hadoop集群搭建和數據分析處理
對自己有一個全方位的一個描述總結,讓別人更好的解讀你。或者在此處,高亮你的優點特長有哪些。
即使不寫個人評價,也一定記得寫上工作期望。
我對自己的定位: 主攻前端,同時在其他方面打打輔助。我不希望過於依賴別人,即使沒有後端沒有設計沒有產品經理,我依然想要把這個產品做到完美。畢竟全棧才能最高效地解決問題。
我對工作的態度: 第一,要高效完成自己的本職工作。第二,要在完成的基礎上尋找完美。第三,要在完美的基礎上,與其他同事 互相交流學習,互相提升。工作是一種生活方式,不是一份養家糊口的差事。
我怎樣克服困難: 不用網路是第一原則,在遇到技術問題時我往往會去Google、Stack over flow上尋找答案。但通常很多問題 並不一定已經被人解決,所以熟練地閱讀源碼、在手冊、規范甚至 REPL的環境自己做實驗才是最終解決問題的辦法。相信事實的結果,自己動手去做。
怎樣保持自己的視野:我一直認為軟體開發中視野極其重要,除了在 Twitter 上關注業界大牛,Github Trending 也是每周必刷。 另外 Podcast、Hacker News、Reddit 以及TechRadar 也是重要的一手資料。保持開闊視野才能找到更酷的解決方案。
我的優勢: 熱愛技術、自學能力強,有良好的自我認知。全面的技能樹與開闊的視野,良好的心態、情商與溝通能力。
我的劣勢: 非科班出身沒有科班同學對演算法的熟練掌握,但我決定死磕技術,彌補不足。
極客、熱愛技術、熱愛開源
Ruby on Rails:精通
Agile/Lean:精通
ReactJS:掌握
Docker:掌握
AWS:掌握
減分寫法:
二、基本信息(姓名/性別/畢業院校/電話/郵箱/居住地/期望地)
加分寫法:
減分寫法:
三、工作經歷&項目經歷
加分寫法:
減分寫法:
來幾個栗子
栗子1錯誤打開方式:
點評:看不出來他做的什麼事情,沒有邏輯性,甚至不知道他做的什麼技術語言。
栗子2正確打開方式:
西安XXX公司 Java工程師 — 2016.2月-2017.2月
1、MOGU推薦架構數據與緩存層設計開發
2、基於JAVA的電商爬蟲開發
3、同圖搜索Solr服務開發
基於演算法組的同圖策略,使用solr做java接又實現rpc服務搭建,進行索引構建和solr實現
北京XXX
java大數據工程師— 2013.4月-2015.12月
1、負責實時流消息處理應用系統構建和實現
2、基於CDH的集群搭建工作,後期進行維護
編寫MapRece程序,能將復雜工作邏輯化,盡最大能力發揮大數據應用的特點, 對程序高要求,監控自己程序運行情況,使用內存合理,注重增量和全量運算的利弊
3、調度系統設計與實現 基於quartz2搭建調度平台,帶徒弟實現相關功能並定期review代碼
4、資料庫調優 負責主從搭建,並掌握主從搭建的利弊,了解業界mycat原理,有資料庫優化經驗,能 正確並擅長使用索引,對鎖有深刻的認識
5、網站開發 java web網站業務開發,並能很好的使用緩存技術,對重構有實際的經驗,並對面向對 象開發有全面的實戰經驗。了解java數據結構的使用場景,雖然對於大並發沒有太大的 發揮餘地,但是掌握了數據結構,對於並發和阻塞等有自己的見解。
點評:非常清晰的告訴簡歷閱讀者自己做了什麼事情,負責了什麼樣的事情,用了什麼技術棧,且邏輯連貫。
四、 工作期望&個人評價
加分寫法:
減分寫法:
完全看不出個性特點,寫和沒寫沒什麼區別。 來幾個栗子
栗子1 錯誤打開方式
為人性格,誠實謙虛,勤奮,能吃苦耐勞,有耐心,有團隊意識,能和同學和諧相處,能虛心接受別人的建議的人。
責任心強,善於溝通,具有良好的團隊合作精神;專業扎實,具有較強的鑽研精神和學習能力;性格比較樂觀外向,喜歡打羽毛球。
栗子2正確打開方式
栗子3正確打開方式
❸ G1從入門到放棄(一)
最近在看關於G1垃圾收集的文章,看了很多國內與國外的資料,本文對G1的這些資料進行了整理。這篇合適JVM垃圾回收有一定基礎的同學,作為G1入門可以看一下,如果要死磕G1實現的內容細節。大家可以找 R大 。 個人認為R大是目前國內JVM領域研究的先驅了,當然R大也是不建議大家去看JVM的源碼的。 為啥別讀HotSpot VM的源碼
G1系列第一篇文章會介紹G1的理論知識,不會做JVM源碼的深入分析。第二篇准備介紹G1實踐中的日誌分析。
G1(Garbadge First Collector)作為一款JVM最新的垃圾收集器,可以解決CMS中Concurrent Mode Failed問題,盡量縮短處理超大堆的停頓,在G1進行垃圾回收的時候完成內存壓縮,降低內存碎片的生成。G1在堆內存比較大的時候表現出比較高吞吐量和短暫的停頓時間,而且已成為Java 9的默認收集器。未來替代CMS只是時間的問題。
G1的內存結構和傳統的內存空間劃分有比較的不同。G1將內存劃分成了多個大小相等的Region(默認是512K),Region邏輯上連續,物理內存地址不連續。同時每個Region被標記成E、S、O、H,分別表示Eden、Survivor、Old、Humongous。其中E、S屬於年輕代,O與H屬於老年代。
示意圖如下:
H表示Humongous。從字面上就可以理解表示大的對象(下面簡稱H對象)。 當分配的對象大於等於Region大小的一半 的時候就會被認為是巨型對象。H對象默認分配在老年代,可以防止GC的時候大對象的內存拷貝。通過如果發現堆內存容不下H對象的時候,會觸發一次GC操作。
在進行Young GC的時候,Young區的對象可能還存在Old區的引用, 這就是跨代引用的問題。為了解決Young GC的時候,掃描整個老年代,G1引入了 Card Table 和 Remember Set 的概念,基本思想就是用空間換時間。這兩個數據結構是專門用來處理Old區到Young區的引用。Young區到Old區的引用則不需要單獨處理,因為Young區中的對象本身變化比較大,沒必要浪費空間去記錄下來。
下圖展示的是 RSet 與 Card 的關系。每個 Region 被分成了多個 Card ,其中綠色部分的 Card 表示該 Card 中有對象引用了其他 Card 中的對象,這種引用關系用藍色實線表示。 RSet 其實是一個HashTable,Key是Region的起始地址,Value是 Card Table (位元組數組),位元組數組下標表示 Card 的空間地址,當該地址空間被引用的時候會被標記為 dirty_card 。
關於RSet結構的維護,可以參考這篇 文章 ,這里不做過多的深入。
SATB的全稱(Snapshot At The Beginning)字面意思是開始GC前存活對象的一個快照。SATB的作用是保證在並發標記階段的正確性。如何理解這句話?
首先要介紹三色標記演算法。
在GC掃描C之前的顏色如下:
在並發標記階段,應用線程改變了這種引用關系
得到如下結果。
在重新標記階段掃描結果如下
這種情況下C會被當做垃圾進行回收。Snapshot的存活對象原來是A、B、C,現在變成A、B了,Snapshot的完整遭到破壞了,顯然這個做法是不合理。
G1採用的是 pre-write barrier 解決這個問題。簡單說就是在並發標記階段,當引用關系發生變化的時候,通過 pre-write barrier 函數會把這種這種變化記錄並保存在一個隊列里,在JVM源碼中這個隊列叫 satb_mark_queue 。在remark階段會掃描這個隊列,通過這種方式,舊的引用所指向的對象就會被標記上,其子孫也會被遞歸標記上,這樣就不會漏標記任何對象,snapshot的完整性也就得到了保證。
這里引用R大對SATB的解釋:
SATB的方式記錄活對象,也就是那一時刻對象snapshot, 但是在之後這裡面的對象可能會變成垃圾, 叫做浮動垃圾(floating garbage),這種對象只能等到下一次收集回收掉。在GC過程中新分配的對象都當做是活的,其他不可達的對象就是死的。
如何知道哪些對象是GC開始之後新分配的呢?
在Region中通過top-at-mark-start(TAMS)指針,分別為prevTAMS和nextTAMS來記錄新配的對象。示意圖如下:
每個region記錄著兩個top-at-mark-start(TAMS)指針,分別為prevTAMS和nextTAMS。在TAMS以上的對象就是新分配的,因而被視為隱式marked。 這里引用R大的解釋。
其中top是該region的當前分配指針,[bottom, top)是當前該region已用(used)的部分,[top, end)是尚未使用的可分配空間(unused)。
(1): [bottom, prevTAMS): 這部分里的對象存活信息可以通過prevBitmap來得知
(2): [prevTAMS, nextTAMS): 這部分里的對象在第n-1輪concurrent marking是隱式存活的
(3): [nextTAMS, top): 這部分里的對象在第n輪concurrent marking是隱式存活的
Young GC 回收的是所有年輕代的Region。 當E區不能再分配新的對象時就會觸發 。E區的對象會移動到S區,當S區空間不夠的時候,E區的對象會直接晉升到O區,同時S區的數據移動到新的S區,如果S區的部分對象到達一定年齡,會晉升到O區。
Yung GC過程示意圖如下:
Mixed GC 翻譯過來叫混合回收。之所以叫混合是因為回收所有的年輕代的Region+部分老年代的Region。
1、為什麼是老年代的 部分 Region?
2、什麼時候觸發Mixed GC?
這兩個問題其實可以一並回答。回收 部分 老年代是參數 -XX:MaxGCPauseMillis ,用來指定一個G1收集過程目標停頓時間,默認值200ms,當然這只是一個期望值。G1的強大之處在於他有一個停頓預測模型(Pause Prediction Model),他會有選擇的挑選 部分 Region,去盡量滿足停頓時間,關於G1的這個模型是如何建立的,這里不做深究。
Mixed GC的觸發也是由一些參數控制。比如 XX: 表示老年代占整個堆大小的百分比,默認值是45%,達到該閾值就會觸發一次Mixed GC。
Mixed GC主要可以分為兩個階段:
1、全局並發標記(global concurrent marking)
全局並發標記又可以進一步細分成下面幾個步驟:
2、拷貝存活對象(Evacuation)
Evacuation階段是全暫停的。它負責把一部分region里的活對象拷貝到空region里去(並行拷貝),然後回收原本的region的空間。Evacuation階段可以自由選擇任意多個region來獨立收集構成收集集合(collection set,簡稱CSet),CSet集合中Region的選定依賴於上文中提到的 停頓預測模型 ,該階段並不evacuate所有有活對象的region,只選擇收益高的少量region來evacuate,這種暫停的開銷就可以(在一定范圍內)可控。
Mixed GC的清理過程示意圖如下:
G1的垃圾回收過程是和應用程序並發執行的,當Mixed GC的速度趕不上應用程序申請內存的速度的時候,Mixed G1就會降級到Full GC,使用的是Serial GC。Full GC會導致長時間的STW,應該要盡量避免。
導致G1 Full GC的原因可能有兩個:
PS: 本文主要參考的國內文章:
java Hotspot G1 GC的一些關鍵技術
Garbage First G1收集器 理解和原理分析
G1: One Garbage Collector To Rule Them All
請教G1演算法的原理
深入理解 Java G1 垃圾收集器
Getting Started with the G1 Garbage Collector !