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)和调用链路监控等。