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

Java程序运行的堆栈分析

1.JVM运行时数据区

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

f254f84b04a0740a0cdd874c1ac9dcd4.png

线程共享部分:所有线程都能访问这块内存的数据,随虚拟机或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文件的内容

918f47e1ff3886a6f0d4fc7bc78f57cc.png

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

JDK版本号/访问控制:

2e0285d33da87a65809bdba9c955ece7.png

访问修饰符:

301abf92efb4b2b9769b9eb21430ca98.png

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

424b608571aa099df3dbcc566ef8c684.png

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

e05009577db1fc6adef66f22cb85a964.png

程序入口方法:main方法

44633472a7bda4018d7d81debafa24a6.png

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

90b37b8b198917cc04d5a37053858702.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值