首先JVM数据区
另外字符串常量池在堆里
各个数据区存放的内容
栈:指的是虚拟机栈,存放栈帧(每个方法都有个栈帧)栈帧里会存放(局部变量(局部变量表里),基本数据类型,对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址))。方法执行完,自动释放。
堆:存放对象实例和数组
方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码和编译加载的数据等。运行时常量池是方法区的一部分,用于存放编译器生成的各种字面量和符号引用。但是在JDK1.8以后,这块区域的名字改了,叫做“Metaspace”,可以认为是“元数据空间”这样的意思。当然这里主要还是存放我们自己写的各种类相关的信息。
程序计数器是一块比较下的内存空间,主要存放当前执行的字节码指令位置。分支、循环、跳转、异常处理、线程恢复等基础功能都需要一来这个计数器来完成。
本地方法栈(Native Stack):存储本地方方法的调用状态。
局部变量和成员变量的区别
①声明的位置
局部变量:方法体们中,形参,代码块们中
成员变量:类中方法外
- 类变量:有static修饰
- 实例变量:没有static修饰
②可用的修饰符
局部变量:final
成员变量:public、protected、private、final、static、volatile、transient
③值存储的位置
局部变量:栈
实例变量:堆
类变量:方法区。
④作用域
局部变量:从声明处开始,到所属的]结束口实例变量:在当前类中“this.”(有时this.可以缺省),在其他类中“对象名.”访问
类变量:在当前类中“类名.”(有时类名.可以省略),在其他类中“类名.”
或“对象名.”访问
⑤生命周期
局部变量:每一个线程,每一次调用执行都是新的生命周期口
实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例变量是独立的
类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的