2017-04-10 15:46
多数是由自己的程序中出现内存泄漏造成的,少数情况是第三方依赖有内存泄漏,在线上使用 jmap 与 jstack 这些命令去定位一下内存占用的异常情况,再修改那些内存泄漏的地方
除了内存泄漏以外,还有一种情况是内存回收的速度跟不上内存被吃掉的速度,例如:在有一定访问量的情况下,某个地方在不停的创建对象,好比 Db.find("select * from bigTable") 这种 select * 并且不带 where 条件的查询会生成很多对象
还有更专业的工具在 eclipse 中就可以查看,例如 jprofile 之类的
一般不需要复杂工具,用用 jmap 与 jstack 就好,参考这里:http://hillside.iteye.com/blog/706129
2017-04-10 15:19
根据异常定位到 InterceptorManager.java 文件的第 83 行代码如下:
method.getAnnotation(Before.class)
很显然这行代码是一个极其正确的代码,问题必然是出现在代码之外的地方,从下面几个方法去尝试解决:
1:确定 jdk 的版本,以及是否是 oracle 的 jdk,而非 openjdk
2:如果使用 JFinal.start(...) 启动,确定启动参数在 IDEA 开发环境之下,是否去掉了最后一个参数,也即最后一个 int 参数在 IDEA 之下一定要去掉
3:尝试将 @Before({LoginValidator.class}) 改为 @Before(LoginValidator.class)
无论如何,这个问题必然与 jfinal 无关,因为 method.getAnnotation(Before.class) 这行代码已经使用了五年以上了,从未出过问题