該系列的第一篇在此:JavaWeb技術經驗總結(一),主要包含我在日常工作中的經驗和心得體會(如有不足之處歡迎指出)。
-
Maven的使用經驗
依賴的scope有test、provided、compile等。test:一般是單元測試場景使用,在編譯環境加入classpath,但打包時不會加入,如junit等;provided:表示容器或者JDK已經提供該依賴,打包時不需要打包入war;compile:預設範圍,在工程環境的classpath(編譯環境)和打包(如果是WAR包,會包含在WAR包中)時候都有效。
-
JVM相關參考資料
-
Minor gc vs Major gc vs Full gc
-
JDK內建工具的使用:JDK內建工具的使用和例子
JVM觀察和除錯相關的命令
-
排查full gc問題,可以透過命令
jstat -gccause java_pid 1s
檢視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行程:
ps -ef|grep java
-
檢視JVM記憶體佔用資訊:
sudo -u admin /opt/taobao/java/bin/jstat -gccause ${PID} 1000 1000
-
dump記憶體:
sudo -u admin /opt/taobao/java/bin/jmap -F -dump:live,file=/home/admin/heap.bin ${PID}
線上機器每隔一個小時full gc問題排查
-
首先,懷疑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定位問題。
-
1. tomcat 7.0中full gc頻繁
-
2. JVM中的ExplicitGCInvokesConcurrent選項
-
參考文章
-
排查思路
-
結論:tomcat 7.0.26.1版本中的JreMemoryLeakPreventionListener,該監聽器每隔一個小時會觸發一次System.gc()。根據tomcat官方的bug fix報告可知,在7.0.28版本將該間隔fix成Long.MAX_VALUE了。
在單元測試中載入配置檔案
-
在spring專案中,使用Mockito+JUnit測試業務邏輯時,有時需要讀取一些外部配置檔案(例如biz.properties),可以參考Spring下的單元測試(JUnit)–載入配置檔案。
-
可以考慮使用@Properties定位配置檔案、使用@Value註入配置屬性;不過在這種情況下,需要解決不同環境下的屬性配置問題;
-
可以考慮透過暴露set介面,在單元測試中設定對應的屬性,從而避免處理外部配置檔案的先關技術。
Mockito + Spring + AssertJ是Spring專案中寫單元測試的最佳組合,優點有:輕量、簡潔、可以測試web層(攔截器、過濾器等)、可以測試異常分支。
log4j中的日誌級別有:DEBUG、INFO、WARN、ERROR(級別依次變高),在生產環境中一般採用ERROR級別、在開發環境中使用DEBUG級別。如果日誌級別為DEBUG級別 ,則程式碼中的logger.debug()
、logger.info()
、logger.warn()
和logger.error()
等日誌都會列印;如果日誌級別為WARN,則只會列印WARN和ERROR日誌。參考:日誌級別的選擇
給Controller的@RequestMapping方法加日誌,透過AOP不容易加(有解決方案),一個比較迂迴的方法是,讓Controller使用一個Service代理(包含一個process方法),攔截這個process方法比較容易。
Java Web的最佳實踐:Spring Boot + Thymeleaf,基礎技術包括:Spring + HTML + CSS。JSP,Velocity和FreeMarker,那是上一代的模板引擎,應該嘗試一下新的東西。參考:Thymeleaf官網
資料庫部分,企業級Java Web要求的知識架構很多,後端就包括資料技術,最常用的是關係型資料庫MySQL,可以閱讀下列文章補充一點知識點。當然,最常用、最有效的參考資料是官方檔案。
-
如果有人問你資料庫的原理,叫他看這篇文章
-
MySQL加鎖處理分析
-
caoz的“如何應對併發”系列
常用概念,PV:請求次數/day;UV:不同uuid的個數/day。對於自己負責的業務,有兩個日誌是必須的:BI日誌和業務監控日誌——BI日誌用於計算業務指標,可以指導運營和產品的動作、業務日誌用於研發同學監控自己服務的穩定性、機器的使用率、介面的QPS等指標。
服務的穩定性,需要良好的監控保障,主要包括幾個方面:系統監控、應用監控(JVM)、業務監控(PV/UV/RT)和呼叫鏈路監控等]