Java程序运行的堆栈分析
1.JVM运行时数据区
JVM通过加载class文件的数据来执行程序。JVM在运行时会划分不同的区域以存放数据。如下图所示:
线程共享部分:所有线程都能访问这块内存的数据,随虚拟机或GC的创建和销毁。主要包括:方法区和堆内存。
线程独占部分:每个线程都有它独立的空间,随线程生命周期而创建和销毁。主要包括:虚拟机栈、本地方法栈和程序计数器。
- 方法区:是JVM用来存储加载的类信息、常量、静态变量、编译后的代码数据。在虚拟机规范中,这是一个逻辑区,不同虚拟机有不同的实现方式。
- 堆内存:在JVM启动时创建的,用于存放类的对象,new出来的对象都放这里。可以细分为:老年代、新生代(Eden、From Survivor、To Survivor)。垃圾回收器主要就是管理堆内存。
- 虚拟机栈:虚拟机栈是每个线程私有的空间。线程栈由多个栈帧(Stack Frame)组成。栈帧的内容包含:局部变量表、操作数栈、动态链接、方法返回地址、附加信息等。栈内存默认最大为1M,超出会抛出*Error。
- 本地方法栈:和虚拟机功能类似,虚拟机栈是为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并发编程之程序运行堆栈分析的更多相关文章
-
Java多线程-程序运行堆栈分析
class文件内容 class文件包含JAVA程序执行的字节码:数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符:文件开头有一个0xcafebabe(16进制)特殊的一个标志. ...
-
转: 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17382679 在<Java并发编程学习笔记之五:volatile变量修饰符-意料之外 ...
-
Java并发编程原理与实战八:产生线程安全性问题原因(javap字节码分析)
前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析. 一.问题引出 先看一段代码 packa ...
-
【Java并发编程实战】-----&ldquo;J.U.C&rdquo;:ReentrantLock之三unlock方法分析
前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...
-
Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析
相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...
-
Java并发编程基础之volatile
首先简单介绍一下volatile的应用,volatile作为Java多线程中轻量级的同步措施,保证了多线程环境中“共享变量”的可见性.这里的可见性简单而言可以理解为当一个线程修改了一个共享变量的时候, ...
-
Java并发编程75道面试题及答案
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
-
Java并发编程73道面试题及答案 —— 面试稳了
今天主要整理一下 Java 并发编程在面试中的常见问题,希望对需要的读者有用. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任 ...
-
多线程(一)java并发编程基础知识
线程的应用 如何应用多线程 在 Java 中,有多种方式来实现多线程.继承 Thread 类.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实现带 ...
随机推荐
-
SparkContext的初始化(季篇)——测量系统、ContextCleaner及环境更新
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
-
eclipse修改SVN下载的项目“>;”变成“*”
遇到过这样的问题,可能是因为下载的eclipse 的版本国过于高的原因. 一张图说明就行了. 将红色的地方打上勾就行了.
-
理解position 绝对定位和相对定位
一.position的三种取值 1.取值 Position : static / absolute / fixed / relative static:静态 absolute:绝对定位 ...
-
web前端之 HTML介绍
概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...
-
如何快速的理解JavaScript闭包?
先看问题 1. 在js中的作用域是什么? 作用域就是作用范围,作用空间.作用域分为全局作用域和局部作用域.(这个东西大家都明白) 如果把局部作用域比作一个国家,那么全局作用域就是地球,地球上除了那个国 ...
-
Hibernate 单向一对多映射
单向 n-1: 单向 n-1 关联只需从 n 的一段访问 1 的一端 此处 Order 类和 Customer 类,其中 Order 类需要引用 Customer 类 代码: public class ...
-
5Linux流程控制语句-if、for、while、case语句、计划任务
流程控制语句.计划任务服务程序,今天记录的有点乱,在预习的时候就记了挺多了,书都花了,上几张图. for 循环 →指定一定的范围 while 循环 →指定一定的条件 for循环语句允许脚 ...
-
Vue.js 基本功能了解一下~
一.写在前面 隔了这么久才来出Vue的第二篇文章,真是堕落了,自己先惩罚下/(ㄒoㄒ)/~~ 回过头看自己第一篇相关文章<初试 Vue.js>(http://www.cnblogs.com ...
-
使用SURF::create()以后报错无法解析
理论上,如果在cmake中勾选了Build_opencv_world.OPENCV_ENABLE_NONFREE以及选择了OPENCV_EXTRA_MODULES_PATH三项后,再编译INSTALL ...
-
Oracle EBS 物化视图
怎么理解物化视图呢,先随意拿一个建物化视图的例子看一下. create materialized view EBS_ACCOUNTS_HIERARCHY_MV refresh complete on ...