歡迎光臨
每天分享高質量文章

JavaWeb技術經驗總結(二)

該系列的第一篇在此:JavaWeb技術經驗總結(一),主要包含我在日常工作中的經驗和心得體會(如有不足之處歡迎指出)。

  1. Maven的使用經驗

    依賴的scope有test、provided、compile等。test:一般是單元測試場景使用,在編譯環境加入classpath,但打包時不會加入,如junit等;provided:表示容器或者JDK已經提供該依賴,打包時不需要打包入war;compile:預設範圍,在工程環境的classpath(編譯環境)和打包(如果是WAR包,會包含在WAR包中)時候都有效。

  2. 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)和呼叫鏈路監控等]

  • 贊(0)

    分享創造快樂