静态成员变量放在堆还是栈?都不是,放在方法区。
Java内存主要分成以下几块:
注:方法区(元数据区)是一个独立区域,既不属于堆,也不属于栈,在类加载的时候只运行一次。
JVM 内存布局-具体如下图所示:
Java 应用运行时使用的全部存储类型
(1) 栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象 — 由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
(2) 对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引 定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
成员变量和局部变量:
成员变量 – 就是方法外部,类的内部定义的变量;
局部变量 – 就是方法或语句块内部定义的变量。局部变量必须初始化。
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。
成员变量存储在堆中的对象里面,由垃圾回收器负责回收。
在java中只要是成员变量,一旦它所在类被实例化后,都是放在堆内存的,不管它是不是基础类型。局部变量才是放在栈内存的。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!