Minor GC 和 Full GC
Minor GC
新生代
Eden不足时机
Full GC
发生在老年区的GC,出现Full GC时.<br>往往伴随着Minor GC,比Minor GC慢10倍以上。
时机
1.调用System.gc()
只是建议虚拟机执行Full GC,但是虚拟机不一定真正去执行。
不建议使用这种方式,而是让虚拟机管理内存。
程序员自己调用
2.老年代空间不足
常见场景就是大对象和长期存活对象进入老年代
尽量避免创建过大的对象以及数组,调大新生代大小,<br>让对象尽量咋新生代中被回收,不进入老年代。
3.JDK1.7 之前方法区空间不足
当系统中要加载的类、反射的类和常量较多时,<br>永久代可能会被占满,在未配置CMS GC的情况下<br>也会执行Full GC,如果空间仍然不够则会抛出OOM异常
可采用增大方法区空间或转为使用CMS GC
4.空间分配担保失败
发生Minor GC时分配担保的两个判断失败
5. Concurrent Mode Failure
CMS GC 并发清理阶段用户线程还在执行
不断有新的浮动垃圾产生,
当预留空间不足时报Concurrent Mode Failure错误并触发Full GC
内存分配策略
1.对象优先在Eden分配
大多数情况下,对象在新生代Eden上分配,当Eden空间不够时,发起Minor GC,
当另外一Survivor空间不足时则将存活对象<br>通过分配担保机制提前转移到老年代。
2.大对象直接进入老年代
配置参数-XX:PretenureSizeThreshold
大于此值得对象直接在老年代分配,避免在Eden和Survivor之间的大量内存复制。
3.长期存活对象进入老年代
虚拟机为每个对象定义了一个Age计数器,
对象在Eden出生并经过Minor GC存活<br>转移到男一个Survivor空间中时Age++,
增加到默认16则转移到老年代。
4.动态对象年龄绑定
虚拟机并不是永远要求对象的年龄必须到达<font color="#a23c73">MaxTenuringThreshold</font>才能晋升老年代
如果在Survivor中<font color="#a23c73">相同年龄所有对象大小</font>总和大于<font color="#a23c73">Survivor空间的一半,</font><br>则年龄大于或等于该年龄的对象直接进入老年代。
5.空间分配担保
在发生Minor GC之前,虚拟机先检查老年代最大可用的连续空间<br>是否大于新生代的所有对象,
如果条件成立,那么Minor GC可以认为是安全的.可以通过HandlePromotionFailure参数设置允许冒险
此时虚拟机将与历代晋升到老年区对象的平均大小比较,<br>仍小于则要进行一次FulI GC。<br>在JDK1.6.24之后HandlePromotionFailure已无作用,即虚拟机默认为true。
虚拟机把描述类的数据从Class问价加载到内存并对数据进行校验、转换解析和初始化,<br>最终形成可以被虚拟机直接使用的Java类型。ava应用程序的高度灵活性就是依赖运行期动态加载和动态连接实现的。