java把内存划分为两种:堆内存 和 栈内存
堆内存:用来存放由 new 创建的对象和数组。
栈内存:用来存放基本数据类型的变量和对象的引用变量
堆(heap)
特点:动态的分配内存大小,所存储的数据的生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
因此,用堆保存数据时会得到更大的灵活性。
然而,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定。
缺点:由于要在运行时动态分配内存,所以存取速度较慢。
为什么呢?
因为堆是应用程序在运行的时候请求操作系统分配给自己内存,
由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.
栈(stack)
特点:1,存取速度快,仅次于CPU中的寄存器。
2,栈中的数据是可以共享的。
缺点:存在栈中的数据大小与生命周期必须是确定的,缺乏灵活性。
所以:在建立一个对象时,会从两个地方都分配内存,
在堆中存放建立的这个对象,
而在栈中存放一个指向这个堆对象的指针(引用)。
通俗来讲就是堆主要用来存放对象的,栈主要是用来执行程序的。