JVM线程私有数据区

本章节内容参考:《深入理解Java虚拟机》

运行时数据区:

本章节只介绍线程私有的内存模型。

虚拟机栈(FILO):java方法执行的内存模型。

  栈帧(线程执行的一个方法的内存模型,每调用一个方法,压入一个栈帧)

   局部变量表:编译器可知的8种基本类型、reference类型、returnAddress类型

  操作数栈:一个用于计算的临时数据存储区(明显,此栈是为了存放要操作的数据用的)

   动态链接:支持java多态

  返回地址:方法结束的地方。return/Exception

本地方法栈:Native方法执行的内存模型。

程序计数器:这个计数器记录的是正在执行的虚拟机字节码指令的地址(如果线程正在执行的是一个java方法)。 字节码解释器工作时,就是通过改变这个计数器的值来选取需要执行的字节码                                         指令(分支,循环,跳转、异常处理、线程恢复)

线程中,方法A调用方法B。

线程的执行的过程:

    线程开始,分配虚拟机栈大小(JVM参数 -Xss:大小,1.5+默认1M),执行方法A时,创建一个栈帧A压入虚拟机栈顶,根据程序计数器中的记录的下一个要执行的字节码指令的地址,找到指令,执行指令(将要操作的数据压入操作数栈栈顶,将操作结果放入局部变量表中)。中间调用方法B,则创建栈帧B,接着执行方法B的指令,直到方法B结束(遇到方法返回的字节码指令或异常),B栈帧出栈,如果有返回数据,将返回数据压入栈帧A的操作数栈中,方法A接着执行。  

为更形象的理解,结合代码演示(操作数栈和局部变量表):

源码:

public void add() {

int a = 3;

int b = 4;

int c = a + b;

}

javap结果:

public void add();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=2, locals=4, args_size=1

0: iconst_3     // 将int类型常量3压入操作数栈顶

1: istore_1     // 将操作数栈顶的数据弹出,存入局部变量表索引1

2: iconst_4     // 将int类型常量4压入操作数栈栈顶

3: istore_2     // 将操作数栈顶的数据弹出,存入局部变量表索引2

4: iload_1      // 将局部变量表索引为1的数据加入到操作数栈顶

5: iload_2      // 将局部变量表索引为2的数据加入到操作数栈顶

6: iadd          // 将栈中2个数相加,将结果入栈顶 (注意:如果栈中数据大于2了,也只做两个数据的相加处理)

7: istore_3     // 将栈顶结果弹出,存入局部变量表索引3

8: return

LineNumberTable:

line 26: 0

line 27: 2

line 28: 4

line 29: 8

LocalVariableTable:  // 局部变量表,4个局部变量,this、a、b、c

Start  Length  Slot  Name   Signature

0       9     0  this   LCongoPengYuyan;

2       7     1     a   I

4       5     2     b   I

8       1     3     c   I

原文地址:https://www.cnblogs.com/sleepingDogs/p/11032471.html

时间: 2024-11-05 20:26:01

JVM线程私有数据区的相关文章

JVM运行时数据区

本篇主要介绍一下,JVM运行时数据区的内容. 首先大概介绍一下下图所示的内容.JVM运行时数据区主要分为了两大部分的内容:线程共有的方法区(Method Area)和堆(Heap).线程私有的虚拟机栈(VM Stack),本地方法栈(Native Method Stack)和程序计数器(Program Counter Register).在数据区下面的执行引擎中又包含了:即时编译器(JITCompiler)和垃圾收集器(GC).GC主要用于回收线程共享的区域(方法区和堆),对于私有的内存区域则方

jvm特性与原理---------->jvm运行时数据区分区

1.概述: 内存分区:JVM会把自己所管理的所有内存区域进行分区. 各个区域的服务对象 各个区域中分别存放了什么内容 存放的数据是如何创建的 这些数据在各个区域中存放,存储的布局是什么样的 如何访问存放在不同内存区域的数据 各个区域的创建和销毁时间 随着进程的启动和结束而创建和销毁 随着线程的启动和结束而创建和销毁 各个区域服务过程中可能产生的问题(异常) 各个区域中可能产生的异常 如何解决上述各种异常 2.JVM内存分区 3.JVM内存各个区域的比较   JVM内存分区(JVM运行时数据区)

Java内存模型与JVM运行时数据区的区别

首先,这两者是完全不同的概念,绝对不能混为一谈. 1.什么是Java内存模型? Java内存模型是Java语言在多线程并发情况下对于共享变量读写(实际是共享变量对应的内存操作)的规范,主要是为了解决多线程可见性.原子性的问题,解决共享变量的多线程操作冲突问题. 多线程编程的普遍问题是: 所见非所得 无法肉眼检测程序的准确性 不同的运行平台表现不同 错误很难复现 故JVM规范规定了Java虚拟机对多线程内存操作的一些规则,主要集中体现在volatile和synchronized这两个关键字. vo

JVM运行时数据区与JVM堆内存模型小结

前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 程序计数器:保存当前线程执行的指令的地址(大意如此). 虚拟机栈:由栈帧组成,而每个栈帧又包括局部变量表.操作数栈.动态连接(调用其他方法).出口(被调用时返回值) -- 每个栈帧就代表了一个方法的执行. 本地方法栈:类似虚拟机栈,只不过方法改成了native方法. 方法区:保存了类的各种信息.类的

12.6 线程私有数据

线程私有数据是一种用于存储和获取与特定线程相关联数据的机制,称为线程特定的或者是线程私有的,是因为我们希望每个线程都可以独立访问其独有的数据,而不用担心与其他线程的同步访问问题. 许多人费力实现了促进进程数据以及属性贡献的线程模型,那么为什么还有人想要实现一个接口,在这样一个模型中防止共享呢?有如下两点原因: 首先,有些时候我们需要以线程为基础维护一些数据,因为没有任何机制可以保证线程ID总是比较小的,且是连续的整数,因此我们不能简单地将每一个线程的私有数据分配为一个数组,然后使用线程ID作为索

SylixOS线程私有数据浅析

目录 1. 线程私有数据概述    1 2. 线程私有数据的相关API函数流程浅析    1 2.1    加入线程私有变量    1 2.2    删除线程私有变量    3 2.3    设置私有线程变量    6 2.4    获得线程私有变量值    8 3. 总结    10 4. 参考文献    10 线程私有数据概述 在SylixOS中为了满足多线程安全的要求,使得一种资源可以安全的被多个线程使用,采用了包括代码临界区保护和可重入性等方法.本文描述实现可重入的一种方法:线程私有数据

【C/C++多线程编程之十】pthread线程私有数据

多线程编程之线程私有数据 Pthread是 POSIX threads 的简称,是POSIX的线程标准.  线程同步从互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程之七]pthread信号量,条件变量[C/C++多线程编程之八]pthread条件变量,读写锁[C/C++多线程编程之九]pthread读写锁,多线程的同步机制已经有了清晰深入的探究,多线程编程的精髓所在,需要深入理解.        线程私有数据TSD(Thread-specific Data)

线程私有数据

在多线程程序中,经常要用全局变量来实现多个函数间的数据共享.由于数据空间是共享的,因此全局变量也为所有线程共有. 测试代码如下: [cpp] view plaincopy #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> int key = 100; //全局变量 void *helloworld_one(void *arg) { printf(&q

《Java虚拟机原理图解》3、JVM执行时数据区

[last updated :2014/11/7]     JVM执行时数据区(JVM Runtime Area)事实上就是指JVM在执行期间,其对计算机内存空间的划分和分配.本文将通过下面几个话题来讨论JVM执行时数据区. Topic 1. JVM执行时数据区里有什么? Topic 2. 虚拟机栈 是什么?虚拟机栈里有什么? Topic 3.栈帧是什么?栈帧里有什么? Topic 4. 方法区是什么?方法区里有什么? Topic 1.JVM执行时数据区里有什么? Topic 2. 虚拟机栈是什