pho*_*360 8 java jboss ejb java-ee jboss7.x
我正在观察一种不寻常的行为,我想了解发生了什么.
想象一下简单的设置.
首先,我有一个只返回一些东西的无状态bean:
@Stateless
public class SimpleService{
private Map<String, String> map;
@PostConstruct
public init(){
map = new HashMap<>();
}
public Map<String,String> getMap(){
return map;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有另一个无状态bean进行一些处理
@Stateless
public class ProcessService{
private static final Logger log = LoggerFactory.getLogger(ProcessService.class);
private static final int MAX = 2000;
@Inject
private SimpleService simpleService;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void process(){
final long start = System.currentTimeMillis();
for(int i=0; i<MAX; i++){
simpleService.getMap();
}
final long end = System.currentTimeMillis();
log.info(MessageFormat.format("Process took {0} ms", end - start));
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个简单的CDI bean来调用process方法.
结果:
当我process连续多次调用该方法时,处理时间不断增加:
Process took 900 ms
Process took 1,100 ms
Process took 1,200 ms
Process took 1,400 ms
Run Code Online (Sandbox Code Playgroud)
并且每次调用该方法时它都会继续上升.
怎么解释?
我正在使用Java JDK 1.7.0_25和JBOSS EAP 6.1.
编辑
顺便说一句,"重置"该方法的处理时间的唯一方法是重新启动服务器.
我已经使用 WildFly 8.1.0.Final 进行了测试,得到以下结果:
Process took 900 ms
Process took 600 ms
Process took 400 ms
Process took 300 ms
Process took 130ms
Process took 100ms
Run Code Online (Sandbox Code Playgroud)
然后它在 90 毫秒左右稳定下来。
所以我认为我们可以放心地假设最初的问题是 JBoss AS 7 中的一个错误,该错误已在 WildFly 8.1 中修复。除了修复之外,他们甚至还引入了一些优化!
编辑!
向大家道歉,我做出了错误的诊断。该错误与 JBoss 的版本无关,而是由 JRebel 造成的。
当我下载 Wildfly 时,我没有使用附加的 JRebel 代理在调试模式下运行它(我在 EAP 6.1 中经常这样做)。如果我在没有 JRebel 的情况下启动 JBoss EAP 6.1,则不会出现问题。
我已经习惯了 JRebel,我忘记了我已经打开了它!
我将向 JRebel 团队提出问题。
编辑2
JRebel 团队进行了调查并能够重现该缺陷。它已在夜间构建中修复,并将在下一个版本中修复(2014 年 8 月/9 月到期)
| 归档时间: |
|
| 查看次数: |
658 次 |
| 最近记录: |