【发布时间】:2015-07-18 01:04:54
【问题描述】:
我对以下优化可能性有点好奇,但不确定如何自己验证,也许有人已经知道答案了。
我们的应用程序中有很多类似的代码。基本上它是一个有状态的处理程序(saga),由一些消息(MyStartingMessage)启动,稍后可以由一些其他消息(MyCotinueMessage)继续。因为这些StatefullHandler 有多个实例,所以我们要检查Continue 消息是否应由给定实例处理。因此,我们在处理程序中设置了一些状态,当接收到消息时,我们检查每个处理程序实例,如果消息中的状态与处理程序状态匹配,则只有消息由该处理程序实例处理。
在下面显示的示例中,某些框架将提取匹配器并检查其中是否有任何匹配接收到的继续消息实例。
因为我们每秒处理数千条此类消息,所以我很好奇 JVM 是否确实优化了实例分配(一段时间后)以不每次都创建新实例。
class StatefullHandler implements MessageHandler {
public void handle(final MyStartingMessage m) {
m.setState(m.getUserId()); // used by the matchers
}
public void handle(final MyContinueMessage m) {
// handle
}
// only returned for queries and never modified
public Collection<MessageMatcher> matchers() {
// message will only be handled by this instance if state matches
// is this new operator optimized 'away' after some time??
return ImmutableSet.of(MessageMatcher.for(MyContinueMessage.class, msg -> msg.getUserId()));
}
}
如果没有优化,我实际上需要这样写:
class StatefullHandler implements MessageHandler {
private static final MATCHERS = ImmutableSet.of(
MessageMatcher.for(MyContinueMessage.class, msg -> msg.getUserId()));
public void handle(final MyStartingMessage m) {
m.setState(m.getUserId()); // used by the matchers
}
public void handle(final MyContinueMessage m) {
// handle
}
public Collection<MessageMatcher> matchers() {
return MATCHERS;
}
}
【问题讨论】:
-
在 Java 8 中,JVM 很可能会优化掉对象分配。
标签: java optimization jvm