Java并发编程之程序运行堆栈分析

Java程序运行的堆栈分析

  1.JVM运行时数据区

    JVM通过加载class文件的数据来执行程序。JVM在运行时会划分不同的区域以存放数据。如下图所示:

    

    线程共享部分:所有线程都能访问这块内存的数据,随虚拟机或GC的创建和销毁。主要包括:方法区和堆内存。

    线程独占部分:每个线程都有它独立的空间,随线程生命周期而创建和销毁。主要包括:虚拟机栈、本地方法栈和程序计数器。

    • 方法区:是JVM用来存储加载的类信息、常量、静态变量、编译后的代码数据。在虚拟机规范中,这是一个逻辑区,不同虚拟机有不同的实现方式。
    • 堆内存:在JVM启动时创建的,用于存放类的对象,new出来的对象都放这里。可以细分为:老年代、新生代(Eden、From Survivor、To Survivor)。垃圾回收器主要就是管理堆内存。
    • 虚拟机栈:虚拟机栈是每个线程私有的空间。线程栈由多个栈帧(Stack Frame)组成。栈帧的内容包含:局部变量表、操作数栈、动态链接、方法返回地址、附加信息等。栈内存默认最大为1M,超出会抛出StackOverFlowError。
    • 本地方法栈:和虚拟机功能类似,虚拟机栈是为JVM执行Java方法准备的。本地方法栈是为JVM执行native本地方法而准备的,不同的虚拟机厂商有不同的实现。
    • 程序计数器:记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行native方法,则计数器为空。CPU同一时间,只会执行一个线程中的一条指令。JVM多线程会轮流切换并分配CPU执行时间,因此在发生线程切换时,需要通过程序计数器来恢复正确的执行位置。

  2.Class文件解析

    Java源文件被编译器编译成一个Java Class文件,JVM通过加载该Class文件来执行程序。

    1.1.什么是Class文件?

      Class文件包含Java程序执行的字节码。

      其中,数据是严格按照特定的格式紧凑排列在class文件中的二进制流,用十六进制表示,中间没有任何分隔符。

      在文件的开头有一个0xcafebabe的特殊标志,可以通过javap工具来查看class文件的内容(javap -v Demo.class > demo.txt)。

    1.2.class文件的内容

      

      从图中可以看到,class文件主要包括的内容有:

      • JDK版本号/访问控制:

         

      • 访问修饰符

         

      • 常量池(Constant Pool):类包含的静态变量

        

      • 构造方法:如果代码中没有构造函数,那么JVM会提供一个无参的构造函数。

          

      • 程序入口方法:main方法

        

  3.一个简单程序的完成运行过程:

    

猜你喜欢

转载自www.cnblogs.com/fangtaoa/p/10925192.html