前言
之前有一个疑惑的地方:基本类型是存放在栈内存中,引用类型是存放在栈内存和堆内存中。栈内存和堆内存是什么?
栈内存
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,这些变量会被存放在连续的内存中,随着方法执行结束,这个方法的内存栈也会自然被销毁。
每个变量名都对应具体地存储位置,所以才有栈内存存储的变量读取都很快;缺点是缺点是数据大小与生存期必须是确定的,缺乏灵活性。
堆内存
堆内存的存储和栈不同,他们是内存中的一片空间,存储的顺序并不固定。由于堆内存存放的顺序毫无规律,那么就需要用栈内存将堆内存中对应的地址存储起来:
当我们在程序中创建一个对象时,由于对象的创建成本通常较大,程序会将对象保存到堆内存,然后将指向堆内存的指针(存储地址)存放在栈内存中。
堆内存的优点是:它是动态分配的内存,物理地址不连续,缺点是不会自动被释放。
垃圾回收机制
栈内存和堆内存的存在,通常与垃圾回收机制有关,可以让程序运行时占用的内存最小。
基本类型使用栈内存,根据地址可以快速读取变量,在方法执行完毕之后,会自动释放掉。
引用类型使用栈内存和堆内存,堆内存的大小是不固定的,便于引用类型扩展属性,对象存放在堆内存中,然后将堆内存中指向的地址保存在栈内存中,这样就不用每次使用同一个对象的时候新建对象,而是直接通过地址去使用该对象,由于对象还可能被另外的变量引用,所以最好在不需要该对象的时候,将该对象赋值null
,方便系统的垃圾回收机制回收它。