Garbage Collection,GC(垃圾回收机制) :回收垃圾对象所占的空间供新的对象使用
好处:防止内存泄露,有效的使用空闲的内存
PS:内存泄露(不再会被使用的对象的内存不能被回收,就是内存泄露)
分代的垃圾回收算法(Generational Collector)
一、基于:不同的对象的生命周期是不一样的
(1)年轻代
1.1 所有新生成的对象首先都放在年轻代内存中。年轻代的目标就是尽可能快速的手机掉那些生命周期短的对象。
1.2 年轻代内存分为一块较大的Eden空间和两块较小的Survior空间,每次使用Eden和其中的一块Survior.
1.3 当回收时,将Eden和Survior中还存活的对象一次性拷贝到另外一块Survior空间上,最后清理Eden和刚才用过的Survior空间
(2)年老代
1.1 在年轻代经历了N次GC后,仍然存活的对象,就会被放在老年代中。因此可以认为老年代存放的都是一些生命周期较长的对象
1.2 当老年代内存满时,触发Full GC
(3)持久代
1.1 用于存放静态文件,如Java类、方法等
二、GC的执行机制
(1)Scavenge[ˈskævɪndʒ] GC
当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC
作用:对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区
(2)Full GC
对整个堆进行整理,包括Young、Tenured和Perm,速度较Scavenge GC慢
1.年老代(Tenured)被写满
2.持久代(Perm)被写满
3.System.gc()被显示调用
三、JAVA依然会发生内存泄漏
1、数据库连接没有关闭
2、静态集合类HashMap、Vector引起内存泄漏(将所申请的对象放入一个Vector 中,如果仅仅释放引用本身(o=null),那么Vector 仍然引用该对象,应该将Vector对象设置为null)