id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	due_date
115	应用重启与el表达式的关系	chenchongqi		"从3月份开始，报价前台应用重启次数频繁，从[attachment:jvm.log.8081.20120820_0606 日志]中看当时负载并不高：
{{{
system stat:
top - 06:07:16 up 77 days,  8:48,  0 users,  load average: 1.49, 2.05, 1.68
Tasks: 118 total,   1 running, 116 sleeping,   1 stopped,   0 zombie
Cpu(s): 10.5% us,  1.3% sy,  0.0% ni, 81.7% id,  4.8% wa,  0.2% hi,  1.5% si
Mem:  10237872k total, 10176508k used,    61364k free,   105708k buffers
Swap:  2096472k total,      208k used,  2096264k free,  3955388k cached
}}}

在jvm.log里我们发现大量的locked状态线程：
{{{
http-app-a-8081-918$845068310"" daemon prio=10 tid=0x0000002b4da53400 nid=0x4d38 waiting for monitor entry [0x00000
00040f3c000..0x0000000040f3dbb0]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at javax.el.BeanELResolver.getProps(BeanELResolver.java:308)
        - waiting to lock <0x0000002aa9948cc0> (a java.util.WeakHashMap)
        at javax.el.BeanELResolver.getValue(BeanELResolver.java:178)
        at com.caucho.jsp.el.PageContextELResolver.getValue(PageContextELResolver.java:175)
        at com.caucho.el.ArrayResolverExpr.getValue(ArrayResolverExpr.java:148)
        at com.caucho.el.PathExpr.getValue(PathExpr.java:142)
        at com.caucho.el.EqExpr.evalBoolean(EqExpr.java:78)
        at com.caucho.el.ConditionalExpr.evalString(ConditionalExpr.java:133)
        at _jsp._price__jsp._jspService(_price__jsp.java:1075)
}}}
为什么el表达式这里会有WeakHashMap的lock现象呢，我们从el表达式的源码和文档可以看到，每个el表达式的变量是有不同的作用域的，如果不指定作用域，取值的时候会分别去page、request、session、application里面去取，直到取到为止，删除变量的时候，也是会全部作用域都去删一遍，可见没有指定作用域的el表达式会有线程间的锁竞争。

而报价库列表页里面的el表达式太多了，这里必须要尽快去优化。同样大家以后用到el表达式的地方必须指定作用域，而且也不要滥用。"	Bug	new	major		报价库	报价库5.0		el表达式,重启		
