网站首页 > java教程 正文
静态成员变量放在堆还是栈?都不是,放在方法区。
Java内存主要分成以下几块:
- 堆heap【new出来的空间和数组空间,存放对象、数组,数据不能共享】
- 虚拟机栈(局部变量表、操作栈、动态连接、方法返回地址)
- 本地方法栈(native method stack)【操作系统的本地方法所需要的空间,存放局部变量、引用】
- 方法区(method area,也叫元数据区-Metaspace)【所有对象数据共享区域,存储静态变量和普通方法、静态方法、常量、字符串常量(严格说存放在常量池,堆和栈都有)等类信息,说白了就是保存类的模板】
- 程序寄存器(program counter register)【速度最快且空间最小的一块区域,由编译器分配,我们对此没有直接的控制权】
注:方法区(元数据区)是一个独立区域,既不属于堆,也不属于栈,在类加载的时候只运行一次。
JVM 内存布局-具体如下图所示:
Java 应用运行时使用的全部存储类型
- 寄存器:最快的存储区,由编译器根据需求进行分配,我们在程序中无法控制。
- 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。
- 堆:存放所有new出来的对象或数组。
- 静态域:存放静态成员(static定义的)。 ---- 方法区
- 常量池:存放字符串常量和基本类型常量(public static final)。
- 非RAM存储:硬盘等永久存储空间。
(1) 栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象 -- 由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
(2) 对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
成员变量和局部变量:
成员变量 - 就是方法外部,类的内部定义的变量;
局部变量 - 就是方法或语句块内部定义的变量。局部变量必须初始化。
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。
成员变量存储在堆中的对象里面,由垃圾回收器负责回收。
在java中只要是成员变量,一旦它所在类被实例化后,都是放在堆内存的,不管它是不是基础类型。局部变量才是放在栈内存的。
猜你喜欢
- 2024-09-14 Java常量池及其应用(java 常量池和运行时常量池)
- 2024-09-14 数据必学Java基础(十一):变量和常量详细讲解
- 2024-09-14 彻底弄懂java中的常量池(java常量池中存放的数据)
- 2024-09-14 简单易懂,Java中常量的声明方式汇总
- 2024-09-14 「我们一起学Java04」 Java中的常量、变量和数据类型
- 2024-09-14 Java中的常量治理(java常量值)
- 2024-09-14 Java开发中常量池的理解与归纳(java常量池中存放的数据)
- 2024-09-14 漫谈java中的常量和常量池(java中常量池的概念及存在的区域)
- 2024-09-14 「Java基础知识」Java的常量与变量
- 2024-09-14 八、Java基本语法元素-变量与常量
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)