Java内存:
1.堆内存:基本类型的变量和对象的引用变量。
2.栈内存:由new创建的对象和数组。
在堆中产生了一个数组&对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组&对象在堆内存中的首地址,在栈中这个特殊的变量就变成了数组&对象的引用变量,可以使用栈内存中的应用变量来访问堆中的数组&对象。
引用变量在程序运行到作用域外释放,而数组&对象本身在堆内存中分配,即使程序运行到new产生数组&对象的语句所作地之外,数组&对象占用的堆内存不会被释放。
数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但仍占着内存,在随后一个不确定的时间被垃圾回收器释放掉。
Java内存分配策略:
按照编译原理的观点,程序运行时的内存分配有三种策略:静态的、栈式的和堆式的。
静态存储分配:在编译时就可以确定每个数据目标在运行时刻的存储空间需求,因而在编译时就为他们分配固定的内存空间。
栈式存储分配:也是动态存储分配,程序对数据区的需求在编译时完全未知,在运行的时候才能知道,在运行时进入一个程序模块时,必须知道程序模块所需数据区大小,按照先进后出的分配原则。
堆式存储分配:专门负责编译或运行时模块入口处都无法确定存储需求的数据结构的内存分配。
堆与栈的区别:
堆主要用来存放对象的,栈主要用来执行程序的。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
垃圾回收:
Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。