- Garbage Collector优势
当我们在使用一个没有Garbage Collector机制的语言编程的时候,我们会碰到一些很难发现的bug,因为这些bug和我们手动释放内存空间相关。典型的有一下两个问题。
- 空指针,当我们使用一段空间的引用释放了这块空间的时候,可能还有别的引用指向这块空间。但是这块空间已经被释放掉了,所以当我们使用另外一个引用去读取这块空间内容的时候,可能读取的是其他的内容了。这个是我们不想看到的。
- 内存泄露。内存泄露就是程序在运行的过程中,没有引用指向这段空间。但是这段空间也没有明确的释放掉。例如在一个列表中,我们本来是想释放整个列表的,但是我们不小心只释放了第一个节点。这样就会导致内存的泄露。
利用Garbage Collector机制,就能避免上述的两个问题。对于第一个问题,只要还有引用只想某段空间,这段空间就不会被释放掉。内存泄露的话,因为都是Java自己回收的,所以也也不会出现这样的问题,Garbage Collector会释放掉全部没有引用的内存空间。
- Java中有这样的几段空间
- Eden Space(heap),大多数的object都是在这里被创建的,除了一些较大的object。
- Survivor Space(heap),那些在Eden Space的Garbage Collector留下来的Object会在这段空间里。
- Tenured Generation(heap), 那些在Survivor Space经过几次Garbage Collector留下来的Ojbect会进入这个空间,也包括上面提到的一些较大的Object,会直接创建在这段空间里。
- Permanent Generation(non-heap),在这段空间里,包含了