堆、栈、常量池的区别

文章详细介绍了JAVA内存的三个主要区域:常量池存放字符串常量和基本类型常量;堆用于存储所有JAVA对象,提供灵活的内存分配;栈则存放基本类型变量和对象引用,其内存分配快速有效,但受限于生命周期和大小的确定性。
摘要由CSDN通过智能技术生成

1. 常量池:存放字符串常量和基本类型常量(public static final)。 常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。

2.堆:一种通用性的内存池(也存在于RAM中),用于存放所以的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。

3.栈:存放基本类型的变量数据和对象的引用。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成 相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性。
 

目前我自己认为,常量名字和它的值都存储在常量池。基本数据类型变量名和值存储在栈,引用数据类型变量名和地址存储在栈,值存储在堆,对象也是引用数据类型中的一种,和引用数据类型一样。

Java中的内存分为常量池。 1. (Stack):内存用于存储方法调用时的局部变量、方法参数、方法返回值以及方法调用时的执行环境。是线程私有的,每个线程都有自己的空间。是一种后进先出(LIFO)的数据结构,它的内存管理自动进行,不需要手动分配和释放。当一个方法被调用时,会在上创建一个帧(Frame),帧包含了方法的局部变量和部分运行时数据。当方法执行完毕后,对应的帧会被销毁。 2. (Heap):内存用于存储Java对象实例。是所有线程共享的一块内存区域。Java中通过关键字"new"来创建对象,对象会被分配在内存中。是一种动态分配和管理的内存区域,需要手动进行垃圾回收。Java虚拟机会负责对进行自动的内存分配和释放。 3. 常量池(Constant Pool):常量池用于存储字符串常量、类和接口的全限定名、字段和方法的名称和描述符等常量。常量池是每个类或接口的一部分,在编译期间就被确定,并且保存在.class文件中。运行时,常量池的内容被加载到内存中的运行时常量池中,在程序执行过程中可以动态地添加、删除或修改常量池中的内容。 总结:用于方法调用和执行环境,用于存储对象实例,常量池用于存储字符串和常量。它们在Java中扮演着不同的角色,并且具有不同的生命周期和管理方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺丁山勋爵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值