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.一个简单程序的完成运行过程:

    

最新文章

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

热门文章

  1. 通过url下载文件到指定目录 java
  2. 第六章 组件 59 组件切换-使用Vue提供的component元素实现组件切换
  3. union共同体
  4. CF1155D Beautiful Array 贪心,dp
  5. java中如何根据函数查询引用的jar包
  6. flask第三篇 request
  7. 在SpringBoot程序中记录日志
  8. UEFI和GPT
  9. LeetCode 75. 颜色分类(Sort Colors)
  10. Chrome Development Tool: [VM] file from javascript