在Java中有四块内存空间
分别是栈内存空间、堆内存空间、全局数据区、全局代码区
其中全局数据区存放static(静态)类型的属性, 全局代码区存放所有的方法定义.
使用最多的两块内存区域是栈和堆.
栈内存中存放的是在函数中定义的基本类型的变量和定义的引用变量, 当一段代码块定义一个变量时, Java就在栈中为这个变量分配内存空间, 当超过变量的作用域后, Java会自动释放掉为该变量分配的内存空间, 该内存空间可以立即被另做他用.
引用变量(简称 ‘引用’)实质上是数组或对象在堆内存中的首地址, 引用变量也属于变量, 所以超出作用域后也会被回收. 引用其实就是java中的指针.
堆内存中存放的是由new所创建的数组和对象, 堆内存的垃圾回收机制与栈内存不同, 堆的内存回收是由Java虚拟机的自动垃圾回收器来管理, 在堆中产生了一个对象或数组, 当没有引用变量指向的时候, 才会被变为垃圾. 不能再被使用, 但此时仍旧占据内存空间, 在随后一个不确定的时间被垃圾回收器释放掉.
Java本身提供垃圾收集机制(Garbage Collection,GC),会不定期施放不用的内存空间,只要对象不用了,就会等待GC释放空间.
一个栈内存的引用只能指向一个堆内存的对象,如果要想再指向其他的堆内存的对象,则必须先断开已有的指向才能分配新的指向。