垃圾处理机制
- 什么情况下对象会被垃圾回收机制处理掉?
- 对象在内存中不被使用
- 每个对象都有自己的生命周期,当对象的生命周期结束时
- 对象超过其引用范围
- 将对象赋值为null
- java的垃圾回收机制
- java回收机制组基本的做法是分代回收,内存中的区域被划分为不通的世代
- 年轻代:采用停止_复制情理法,划分为Eden,survivor0,survivor1三个区域,当Eden区满的时候会还行一次MinorGC,将剩余存活的对象存到survivor0中,回收Eden中没有存活的对象.当Survivor0中满的时候,将仍然存活的对象存到Survivor1中,回收剩余的对象.当Survivor0和Survivor1中依次去存,切换几次后(Host默认是15次),将依然存活的对象复制到老年代中.
- 老年代: 老年代采用的是标记_整理算法即存活的对象向一端移动,保证内存的完整性,然后将未标记的对象清理掉.当老年代内存不够时也会执行MajorGC 即Full GC.
- 永久代:JDK1.6以后永久代就要被取消.
- 永久代的回收有两种,常量池中的常量,无用的类信息
- 常量的回收很简单,没有引用了就可以被回收
- 对于无用的类的回收必须保证三点:
- 类的所有实例都已经被回收
- 加载被的ClassLoader已经被回收
- 类对象的Class对象没有被引用
如果永久代存放的常量和类过大,无法放入永久代,也会触发永久代的GC,将一部分放入老年代
年轻代的GC是必须的,但是老年代和永久代的GC不是必须的,可以同时设置参数来决定.
总结:
+ 世代划分的出发点是对应用中对象存活的时间进行研究之后得出的统计规律,一般来说一个应用中大部分的对象存活时间都很短
+ 垃圾回收器只能回收由new操作符创建的对象,如果某些对象不是通过new操作符在内存中获取一块内存区域,这种对象不能被垃圾回收机制所处理
+ 由于垃圾回收机制不受人为控制,具体执行时间也不确定,所以finalize()方法也就无法执行,由此java提供了System.GC()方法强制启动垃圾回收器.