首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java JVM HotSwap行为

Java JVM HotSwap行为
EN

Stack Overflow用户
提问于 2012-04-10 23:50:44
回答 2查看 450关注 0票数 1

我今天尝试了Javas Hotswap,它工作得很好。在我的测试过程中,我偶然发现了一个相当奇怪的行为。这是我的代码:

代码语言:javascript
复制
public class Test extends JFrame implements ActionListener{

private JButton c;
private int f =1;
/**
 * @param args
 */
public static void main(String[] args) {
    Test t = new Test();
}

public Test(){
    this.setPreferredSize(new Dimension(800, 600));
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    c = new JButton("Click");
    c.addActionListener(this);
    this.add(c);
    this.pack();
    this.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
    c.setText(String.valueOf(f++));

}

}

注意末尾的c.setText(String.valueOf(f++));行。如果我在程序运行时将其切换为f--,我注意到在更改后第一次单击按钮时,该值仍在计数。然而,之后的点击量是正确的。将其改回时也会发生同样的情况。

我注意到的下一件事是:如果我将代码更改为以下代码:c.setText(String.valueOf(f+=1));,运行JVM并将其热交换为c.setText(String.valueOf(f-=1));,更改将被直接应用,而不需要单击延迟。

我现在的问题是:究竟是什么导致了这种行为?f++f+=1在JVM代码级上有什么不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-10 23:59:10

在下面的代码中使用javap:

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    int i = 0;
    i++;
    System.out.println(i);
    i+=1;
    System.out.println(i);
}

返回

代码语言:javascript
复制
  0: iconst_0
  1: istore_1
  2: iinc          1, 1
  5: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
  8: iload_1
  9: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
 12: iinc          1, 1
 15: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
 18: iload_1
 19: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
 22: return

==>没有区别

票数 0
EN

Stack Overflow用户

发布于 2012-04-10 23:59:43

您是否关闭了所有优化?有一些不同的tricksJIT compiler可以在幕后动态执行,因此生成的underlying code会在执行过程中更改multiple times

使用actionPerformed()可以处理异步事件,这会使跟踪执行路径变得更加困难,即使没有热交换问题。

执行相同的测试代码

代码语言:javascript
复制
c.setText(String.valueOf(f++)); 

但是在一个设置了断点的大循环中进行,这样你就可以用更少的移动部分来测试变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10092069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档