java中关于内存模型的几个概念
一个运行中的Java程序,每当启动一个新线程时,都会为这个新线程创建一个自己的PC(程序计数器)寄存器。
Java栈上的所有数据是私有的,每当一个java线程运行的时候, java虚拟机会为该线程分配一个java栈。
虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈或出栈。当线程调用java方法时,虚拟机压入一个新的栈帧到该线程的java栈中。当方法返回时,这个栈帧被从java栈中弹出并抛弃。一个帧用于存储参数、局部变量、操作数、中间运算结果等。
在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
栈有一个特性,存在栈中的数据可以共享。例如 x=1,y=1; 定义时虚拟机会在栈中寻找1 如果存在就直接指向,不存在就会创建,xy变量在栈中分配内存时执行同意的操作,所以他们指向同一个1,如果改变y的值为2不会影响到x的值,这个不同于对象间的共享。
栈和堆的关系:堆主要是用来存放java对象的,栈主要是用来存放对象引用的,对象应用的值为堆中对应内存的首地址,栈中的变量指向堆内存中的变量(可以视为java中的指针)
寄存器:
我们在程序中无法控制一个运行中的Java程序,每当启动一个新线程时,都会为这个新线程创建一个自己的PC(程序计数器)寄存器。
程序计数器的作用可以看做是当前线程所执行的字节码的行号指示器。
栈:
存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中Java栈上的所有数据是私有的,每当一个java线程运行的时候, java虚拟机会为该线程分配一个java栈。
虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈或出栈。当线程调用java方法时,虚拟机压入一个新的栈帧到该线程的java栈中。当方法返回时,这个栈帧被从java栈中弹出并抛弃。一个帧用于存储参数、局部变量、操作数、中间运算结果等。
在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
栈有一个特性,存在栈中的数据可以共享。例如 x=1,y=1; 定义时虚拟机会在栈中寻找1 如果存在就直接指向,不存在就会创建,xy变量在栈中分配内存时执行同意的操作,所以他们指向同一个1,如果改变y的值为2不会影响到x的值,这个不同于对象间的共享。
堆:
存储Java程序创建的类实例。所有线程共享,因此设计程序时也要考虑到多线程访问对象(堆数据)的同步问题。在堆中分配的内存,由Java虚拟机的自动的垃圾回收机制来管理堆的内存。栈和堆的关系:堆主要是用来存放java对象的,栈主要是用来存放对象引用的,对象应用的值为堆中对应内存的首地址,栈中的变量指向堆内存中的变量(可以视为java中的指针)