Java并发编程之程序运行堆栈分析
2024-09-26 23:53:44
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.一个简单程序的完成运行过程:
最新文章
- can't run roscore 并且 sudo 指令返回 unable to resolve host
- NGUI 指定视口大小
- reversing-Easy Crack
- 如何在Macbook Pro搭建PHP开发环境
- nagios二次开发(二)---nagios和nagiosql合并与取舍
- Shell的概念
- STM32的JTAG、SWD和串口下载的问题
- zend framework virtualhost设置方法
- 17-UIKit(UIView的动画)
- 【锋利的Jquery】读书笔记四
- Python之路【第三篇】:模块
- base64减少图片请求
- 使用Docker安装Mysql
- 名片管理系统v1.1(tools)
- 转:20分钟教你使用hexo搭建github博客
- JavaScript设计模式之----组合模式
- 漫画:什么是HTTPS?
- javascript五种基本类型
- 通过script src引入ElementUI时,使用语句:window.ELEMENT.MessageBox.alert(xxx) 调用弹出框
- 20145232 韩文浩 《Java程序设计》第3周学习总结