在Java中,每个线程都有自己的虚拟机栈。虚拟机栈是用于存储线程执行方法时的局部变量、方法参数、方法调用和返回的数据等信息的内存区域。每个方法在执行时都会在虚拟机栈上创建一个称为"栈帧"的数据结构,栈帧中包含了方法的局部变量表、操作数栈、动态链接等信息。
由于每个线程都有独立的虚拟机栈,因此虚拟机栈是线程私有的,不被多个线程共享。每个线程在创建时都会分配一块独立的虚拟机栈空间,并且在线程生命周期内,栈会动态地扩展和收缩以适应方法调用的需要。
需要注意的是,虚拟机栈的大小是有限制的,一般来说,每个线程的虚拟机栈都有一个固定的容量上限。当线程的方法调用层级过深时,虚拟机栈可能会抛出"栈溢出"异常。
栈区:
每个线程包含一个栈区,栈中只保存基础数据类型的值(比如int i=1中1就是基础类型的对象)和对象的引用以及基础数据的引用
每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。
栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
堆区:
存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 。
方法区:
又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。(两者区别为堆区存放new出来的对象信息,方法区存放本身就具有的类信息)
标签:java,每个,对象,虚拟机,线程,方法,class From: https://blog.51cto.com/u_16095802/6691703