背景
程序计数器、虚拟机栈和本地方法栈3个区域随线程而生,随线程而灭。
栈中的栈帧随着方法的进入和推出,而进行着出栈和进栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来就已知的。
因此这几个区域的内存分配和回收都具有确定性,在方法结束或线程结束时,内存就跟随着回收了。
而Java堆和方法区则不一样,一个接口的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,只有在程序处于运行期间,才知道创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器关注的就是这部分内存。
对于从事C和C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权利的皇帝,也是从事最基础工作的劳动人民—–既拥有每一个对象的所有权,又担负着每一个对象从生命开始到终结的维护责任。 对于Java程序员来说,虚拟机的自动内存分配机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄露和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序员把内存控制的权利交给Java虚拟机,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将会是一项异常艰难的工作。
判断对象已死 - 哪些内存需要回收
堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象)。
...