maven的使用經驗
依賴的scope有test、provided、compile等。test:一般是單元測試場景使用,在編譯環境加入classpath,但打包時不會加入,如junit等;provided:表示容器或者jdk已經提供該依賴,打包時不需要打包入war;compile:預設範圍,在工程環境的classpath(編譯環境)和打包(如果是war包,會包含在war包中)時候都有效。
jvm相關參考資料
<a href="http://colobu.com/2015/04/07/minor-gc-vs-major-gc-vs-full-gc/" target="_blank">minor gc vs major gc vs full gc</a>
jvm觀察和調試相關的指令
排查full gc問題,可以通過指令<code>jstat -gccause java_pid 1s</code>檢視gc發生的原因
觀察gc.log的時候:(1)gc開頭的都是young gc;(2)cms-initial-mark辨別,且沒有full字樣的,是old區的gc;(3)帶full字樣的是fgc(例外情況:-xx:+explicitgcinvokesconcurrent,這個參數會把full gc轉成cms gc,是以gc.log中不會有full gc字樣)。
檢視jvm程序:<code>ps -ef|grep java</code>
檢視jvm記憶體占用資訊:
<code>sudo -u admin /opt/taobao/java/bin/jstat -gccause ${pid} 1000 1000</code>
dump記憶體:
<code>sudo -u admin /opt/taobao/java/bin/jmap -f -dump:live,file=/home/admin/heap.bin ${pid}</code>
線上機器每隔一個小時full gc問題排查
參考文章
<a href="http://auzll.iteye.com/blog/1904081" target="_blank">1. tomcat 7.0中full gc頻繁</a>
<a href="http://blog.csdn.net/aesop_wubo/article/details/38406709" target="_blank">2. jvm中的explicitgcinvokesconcurrent選項</a>
排查思路
首先,懷疑jdk版本問題,更新之後依然存在,排除
第二,懷疑tomcat版本問題,由7.0.26.1更新到7.0.54.1之後消失
分析gc.log,每隔一小時出現一次cms收集,最開始認為這不是full gc;後查詢資料發現explicitgcinvokesconcurrent選項會将full gc轉換成cms gc,是以gc.log中沒有“full gc”字樣;然後根據參考文章1和參考文章2定位問題。
在單元測試中加載配置檔案
可以考慮使用@properties定位配置檔案、使用@value注入配置屬性;不過在這種情況下,需要解決不同環境下的屬性配置問題;
可以考慮通過暴露set接口,在單元測試中設定對應的屬性,進而避免處理外部配置檔案的先關技術。
mockito + spring + assertj是spring項目中寫單元測試的最佳組合,優點有:輕量、簡潔、可以測試web層(攔截器、過濾器等)、可以測試異常分支。
給controller的@requestmapping方法加日志,通過aop不容易加(有解決方案),一個比較迂回的方法是,讓controller使用一個service代理(包含一個process方法),攔截這個process方法比較容易。
資料庫部分,企業級java web要求的知識架構很多,後端就包括資料技術,最常用的是關系型資料庫mysql,可以閱讀下列文章補充一點知識點。當然,最常用、最有效的參考資料是官方文檔。
<a href="http://blog.jobbole.com/100349/" target="_blank">如果有人問你資料庫的原理,叫他看這篇文章</a>
<a href="http://hedengcheng.com/?p=771" target="_blank">mysql加鎖處理分析</a>
<a href="http://chuansong.me/n/1935575" target="_blank">caoz的“如何應對并發”系列</a>
常用概念,pv:請求次數/day;uv:不同uuid的個數/day。對于自己負責的業務,有兩個日志是必須的:bi日志和業務監控日志——bi日志用于計算業務名額,可以指導營運和産品的動作、業務日志用于研發同學監控自己服務的穩定性、機器的使用率、接口的qps等名額。
服務的穩定性,需要良好的監控保障,主要包括幾個方面:系統監控、應用監控(jvm)、業務監控(pv/uv/rt)和調用鍊路監控等。