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

    

Java并发编程之程序运行堆栈分析的更多相关文章

  1. Java多线程-程序运行堆栈分析

    class文件内容 class文件包含JAVA程序执行的字节码:数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符:文件开头有一个0xcafebabe(16进制)特殊的一个标志. ...

  2. 转: 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17382679 在<Java并发编程学习笔记之五:volatile变量修饰符-意料之外 ...

  3. Java并发编程原理与实战八:产生线程安全性问题原因(javap字节码分析)

    前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析. 一.问题引出 先看一段代码 packa ...

  4. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析

    前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...

  5. Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析

    相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...

  6. Java并发编程基础之volatile

    首先简单介绍一下volatile的应用,volatile作为Java多线程中轻量级的同步措施,保证了多线程环境中“共享变量”的可见性.这里的可见性简单而言可以理解为当一个线程修改了一个共享变量的时候, ...

  7. Java并发编程75道面试题及答案

    1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...

  8. Java并发编程73道面试题及答案 —— 面试稳了

    今天主要整理一下 Java 并发编程在面试中的常见问题,希望对需要的读者有用. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任 ...

  9. 多线程(一)java并发编程基础知识

    线程的应用 如何应用多线程 在 Java 中,有多种方式来实现多线程.继承 Thread 类.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实现带 ...

随机推荐

  1. 用github page为自己的项目编写文档

    ———————————————— 一.用md文件建立网页这一步要做的就是把四个实验报告做出来.1.首先为了方便管理,我们在ML下创建一个名为docs的文件夹. 2.然后在修改设置,让github从do ...

  2. win10日历交互效果

    win10日历 早就想试着实现以下win10日历的动态css效果,现在终于有时间试试啦.本篇文章只是实现简单的效果,进阶篇后续会放上来 目标效果 鼠标移入目标元素,周围相关八块元素点亮,点亮高光范围呈 ...

  3. jenkins 批量修改svn 地址

    svn服务器的ip变了,jenkins里那么多任务一个个修改要疯了, 每个已经创建后的任务的svn 地址都配置在 jenkins 主目录下的jobs 里对应的任务下的config.xml 里 在job ...

  4. 07 saltstack生产实例-mysql主从

    1.服务部署 .服务部署 抽象:功能模块 redis 安装.配置.启动 mysql 安装.配置(my.cnf可以统一 目录默认配置可以统一) master: server_id slave: serv ...

  5. easyui datagrid 选中行效果

    转:http://blog.csdn.net/hzw2312/article/details/27534065 jquery easyui datagrid 获取Checked选择行(勾选行)数据 g ...

  6. VLC播放器:快捷键

     造冰箱的大熊猫@cnblogs 2019/2/27 VLC播放器(VLC Media Player)快捷键汇总(在Ubuntu 16.04环境下测试) - 音量大/小:CTRL+上/下 - 静音开/ ...

  7. 如何查询Office版本号

     造冰箱的大熊猫@cnblogs 2019/1/28 如何查询当前所用Microsoft Office的版本信息? 以Word 2007为例,点击程序左上角的Office图标,在弹出的菜单中选择“Wo ...

  8. C. Planning(贪心)

    C. Planning time limit per test 1 second memory limit per test 512 megabytes input standard input ou ...

  9. Another Filling the Grid

    E. Another Filling the Grid 参考:Codeforces Round #589 (Div. 2)-E. Another Filling the Grid-容斥定理 容斥这个东 ...

  10. Codeforces 385C Bear and Prime Numbers(素数预处理)

    Codeforces 385C Bear and Prime Numbers 其实不是多值得记录的一道题,通过快速打素数表,再做前缀和的预处理,使查询的复杂度变为O(1). 但是,我在统计数组中元素出 ...