java中我们把java内存分为两种一种是栈内存,一种则是堆内存
一、堆栈
在计算机领域,堆栈设计一个不容忽视的概念,堆栈是一种数据结构。堆栈是一种数据结构。堆栈都是一种书库项按顺序排列的数据结构,只能在一端对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。 1、java内存分配中的栈 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java在栈中为这个变量分配内存空间,当该变量退出其作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 2、java内存分配中的堆 堆内存是用来存放由new创建的对象和数组。在堆中 分配的内存,由java虚拟机自动垃圾回收机制来进行统一管理。。在堆中产生了一个数组或对象,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象。引用变量就相当于是为数组或者对象起的一个名称。
栈中的变量指向堆内存中的变量,这就是Java中的指针!常量池(constant pool) 3、栈中的变量指向堆内存中的变量,这就是Java中的指针!常量池(constant pool) JAVA中的常量池,实际上分为两种形态:静态常量池和运行时常量池。 所谓静态常量池,即*.class文件中的常量池,calss文件中的常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入内存中,并保存在方法区中,我们常说的常量池,就是值方法区中的运行时常量池。
对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象由垃圾回收器负责回收,因此大小和生命周期是不需要确定,具有很大的灵活星。 对于字符串:其对行的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能去顶的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
|