jvm自增,自减运行原理

简介: 在jvm中,涉及到变量运算时,会发生压栈弹栈等动作,但如果仅仅是自增和自减,那么jvm会直接在本地变量中实现。public class JavaTest{ public static void main(String[] args){ int ...

在jvm中,涉及到变量运算时,会发生压栈弹栈等动作,但如果仅仅是自增和自减,那么jvm会直接在本地变量中实现。

public class JavaTest{

    public static void main(String[] args){
        int a=1,b=1,c=1,d=1;
        a++;
        ++b;
        c = c++;
        d=++d;
        System.out.println(a+"..."+b+"..."+c+"..."+d);
    }
}

这段代码很简单,运行结果为2,2,1,2。
对于这样的结果大家可能都觉得是对的,因为c=c++的时候会先执行赋值操作,再进行自增,所以c等于1。但是c进行赋值之后,自增的操作也是c本身,为什么c这个变量不等于自增后的数值呢?
我们使用javap来将这段代码进行解析,结果如下:

F:\>javap -c JavaTest
Compiled from "JavaTest.java"
public class JavaTest {
  public JavaTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_1
       3: istore_2
       4: iconst_1
       5: istore_3
       6: iconst_1
       7: istore        4
       9: iinc          1, 1
      12: iinc          2, 1
      15: iload_3
      16: iinc          3, 1
      19: istore_3
      20: iinc          4, 1
      23: iload         4
      25: istore        4
      27: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      30: new           #3                  // class java/lang/StringBuilder
      33: dup
      34: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      37: iload_1
      38: invokevirtual #5                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      41: ldc           #6                  // String ...
      43: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      46: iload_2
      47: invokevirtual #5                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      50: ldc           #6                  // String ...
      52: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      55: iload_3
      56: invokevirtual #5                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      59: ldc           #6                  // String ...
      61: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      64: iload         4
      66: invokevirtual #5                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      69: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      72: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      75: return
}

下面我们来分析一下,前面0-7可以看出是定义了4个变量,分别进行压栈和弹栈操作,将变量最终放入到本地变量中。9这个操作就对应于代码中的a++,可以看出没有进行压栈和弹栈,只是执行了iinc,也就是自增操作,所以这个时候,本地变量中a就等于2。12对应于代码中的++b,情况和9类似。c=c++对应于15-19,从这里可以看出,jvm先执行了压栈,将c压入栈顶,然后执行自增操作,所以这个时候,栈顶的c为1,本地变量c为2,但是在这个时候,19又将栈顶的c弹栈并赋值给本地变量c了,所以本地变量c最终为1。d=++d和上面原理是一致的。
通过对代码的汇编码的分析,我们可以知道c=c++为什么等于自增前的c了,其实不是因为先进行了赋值,自增后的数据没有再次赋值,而是由于自增后被原数据给覆盖了。

目录
相关文章
|
存储 安全 算法
深入剖析JVM内存管理与对象创建原理
JVM内存管理,JVM运行时区域,直接内存,对象创建原理。
40 2
|
3月前
|
消息中间件 算法 Java
jvm性能调优 - 14JVM的老年代垃圾回收器CMS原理
jvm性能调优 - 14JVM的老年代垃圾回收器CMS原理
48 0
|
24天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
66 0
|
7天前
|
监控 前端开发 安全
JVM工作原理与实战(十四):JDK9及之后的类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了JDK8及之前的类加载器、JDK9及之后的类加载器等内容。
|
7天前
|
监控 Java 关系型数据库
JVM工作原理与实战(十三):打破双亲委派机制-线程上下文类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、线程上下文类加载器等内容。
|
7天前
|
存储 XML 监控
JVM工作原理与实战(三):字节码文件的组成
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了字节码文件的基础信息、常量池、方法、字段、属性等内容。
|
1月前
|
算法 Oracle Java
【JVM】了解JVM中动态判断对象年龄的原理
【JVM】了解JVM中动态判断对象年龄的原理
26 0
|
3月前
|
运维 监控 Java
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析的开发指南
学习JVM需要一定的编程经验和计算机基础知识,适用于从事Java开发、系统架构设计、性能优化、研究学习等领域的专业人士和技术爱好者。
55 5
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析的开发指南
|
3月前
|
存储 缓存 Java
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你认识和了解JMM并发模型的基本原理
每位Java开发者都了解到Java字节码是在Java运行时环境(JRE)上执行的。JRE包含了最为关键的组成部分:Java虚拟机(JVM),它负责分析和执行Java字节码。通常情况下,大多数Java开发者无需深入了解虚拟机的内部运行原理。即使对虚拟机的运行机制不甚了解,也不会对开发工作产生太多影响。然而,对JVM有一定了解的话,将更有助于深入理解Java语言,并解决一些看似困难的问题。
60 4
【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你认识和了解JMM并发模型的基本原理
|
3月前
|
存储 Java C++
JVM 运行时数据区
JVM 运行时数据区