Java Web技术经验总结(二)
該系列的第一篇在此:Java Web技術(shù)經(jīng)驗總結(jié)一,主要包含我在日常工作中的經(jīng)驗和心得體會(如有不足之處歡迎指出)。
Maven的使用經(jīng)驗
- 依賴的scope有test、provided、compile等。test:一般是單元測試場景使用,在編譯環(huán)境加入classpath,但打包時不會加入,如junit等;provided:表示容器或者JDK已經(jīng)提供該依賴,打包時不需要打包入war;compile:默認(rèn)范圍,在工程環(huán)境的classpath(編譯環(huán)境)和打包(如果是WAR包,會包含在WAR包中)時候都有效。
JVM相關(guān)參考資料
- Minor gc vs Major gc vs Full gc
- JDK內(nèi)置工具的使用:JDK內(nèi)置工具的使用和例子
JVM觀察和調(diào)試相關(guān)的命令
- 排查full gc問題,可以通過命令jstat -gccause java_pid 1s查看gc發(fā)生的原因
- 觀察gc.log的時候:(1)GC開頭的都是Young GC;(2)CMS-initial-mark標(biāo)識,且沒有full字樣的,是old區(qū)的GC;(3)帶full字樣的是fgc(例外情況:-XX:+ExplicitGCInvokesConcurrent,這個參數(shù)會把full gc轉(zhuǎn)成cms gc,因此gc.log中不會有full gc字樣)。
- 查看JVM進(jìn)程:ps -ef|grep java
- 查看JVM內(nèi)存占用信息:
sudo -u admin /opt/taobao/java/bin/jstat -gccause ${PID} 1000 1000 - dump內(nèi)存:
sudo -u admin /opt/taobao/java/bin/jmap -F -dump:live,file=/home/admin/heap.bin ${PID}
線上機(jī)器每隔一個小時full gc問題排查
- 參考文章
- 1. tomcat 7.0中full gc頻繁
- 2. JVM中的ExplicitGCInvokesConcurrent選項
- 排查思路
- 首先,懷疑jdk版本問題,升級之后依然存在,排除
- 第二,懷疑tomcat版本問題,由7.0.26.1升級到7.0.54.1之后消失
- 分析gc.log,每隔一小時出現(xiàn)一次cms收集,最開始認(rèn)為這不是full gc;后查詢資料發(fā)現(xiàn)ExplicitGCInvokesConcurrent選項會將full gc轉(zhuǎn)換成cms gc,因此gc.log中沒有“full gc”字樣;然后根據(jù)參考文章1和參考文章2定位問題。
- 結(jié)論:tomcat 7.0.26.1版本中的JreMemoryLeakPreventionListener,該監(jiān)聽器每隔一個小時會觸發(fā)一次System.gc()。根據(jù)tomcat官方的bug fix報告可知,在7.0.28版本將該間隔fix成Long.MAX_VALUE了。
在單元測試中加載配置文件
- 在spring項目中,使用Mockito+JUnit測試業(yè)務(wù)邏輯時,有時需要讀取一些外部配置文件(例如biz.properties),可以參考Spring下的單元測試(JUnit)--加載配置文件。
- 可以考慮使用@Properties定位配置文件、使用@Value注入配置屬性;不過在這種情況下,需要解決不同環(huán)境下的屬性配置問題;
- 可以考慮通過暴露set接口,在單元測試中設(shè)置對應(yīng)的屬性,從而避免處理外部配置文件的先關(guān)技術(shù)。
Mockito + Spring + AssertJ是Spring項目中寫單元測試的最佳組合,優(yōu)點有:輕量、簡潔、可以測試web層(攔截器、過濾器等)、可以測試異常分支。
log4j中的日志級別有:DEBUG、INFO、WARN、ERROR(級別依次變高),在生產(chǎn)環(huán)境中一般采用ERROR級別、在開發(fā)環(huán)境中使用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,基礎(chǔ)技術(shù)包括:Spring + HTML + CSS。JSP,Velocity和FreeMarker,那是上一代的模板引擎,應(yīng)該嘗試一下新的東西。參考:Thymeleaf官網(wǎng)
數(shù)據(jù)庫部分,企業(yè)級Java Web要求的知識架構(gòu)很多,后端就包括數(shù)據(jù)技術(shù),最常用的是關(guān)系型數(shù)據(jù)庫MySQL,可以閱讀下列文章補(bǔ)充一點知識點。當(dāng)然,最常用、最有效的參考資料是官方文檔。
- 如果有人問你數(shù)據(jù)庫的原理,叫他看這篇文章
- MySQL加鎖處理分析
- caoz的“如何應(yīng)對并發(fā)”系列
常用概念,PV:請求次數(shù)/day;UV:不同uuid的個數(shù)/day。對于自己負(fù)責(zé)的業(yè)務(wù),有兩個日志是必須的:BI日志和業(yè)務(wù)監(jiān)控日志——BI日志用于計算業(yè)務(wù)指標(biāo),可以指導(dǎo)運營和產(chǎn)品的動作、業(yè)務(wù)日志用于研發(fā)同學(xué)監(jiān)控自己服務(wù)的穩(wěn)定性、機(jī)器的使用率、接口的QPS等指標(biāo)。
服務(wù)的穩(wěn)定性,需要良好的監(jiān)控保障,主要包括幾個方面:系統(tǒng)監(jiān)控、應(yīng)用監(jiān)控(JVM)、業(yè)務(wù)監(jiān)控(PV/UV/RT)和調(diào)用鏈路監(jiān)控等。
總結(jié)
以上是生活随笔為你收集整理的Java Web技术经验总结(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac OS X上的lipo命令详解
- 下一篇: 从创建数据库到备份恢复还原详解