内存分配:
1.静态:静态存储区,内存在程序编译的时候就一句分配好,这块的内存在程序整个运行期间都一直存在,主要存放静态数据、全局的static数据和一些常量。
2.栈式:在执行函数时,函数一些内部变量的存储都可以在栈上面创建,函数执行结束的时候这些存储单元就会自动被释放掉。
3.堆式:也叫动态内存分配,可以用malloc或者new来申请分配一个内存。在C、C++中可能需要自己来是否,而JAVA直接依赖GC机制。
堆栈的区别:堆是不连续的内存区域,堆空间比较灵活也特别大;栈是一块连续的内存区域,大小是由操作系统决定。堆管理很麻烦,频繁的new/remove会造成大量的内存碎片,这样会慢慢导致效率低下;而栈是先进先出,进出完全不会产生碎片,运行效率高且稳定。
成员变量全部存储在堆中,局部便利的基本数据类型和引用存储于栈中,引用的对象实体存储在堆中。
引用:
1.StrongReference强引用:从不回收,知道JVM停止时才会终止
2.SoftReference软引用:当内存不足的时候终止
3.WeakReference弱引用:当垃圾回收的时候进行回收,CG后终止
4.PhatomReference虚引用:在垃圾回收的时候进行回收,CG后终止
PS:开发时,为了防止内存溢出,处理一些占用内存比较大且生命周期长的对象的时候,可以尽量使用软引用和弱引用。