首先谈谈对象内存分配原则:
1.大对象或数组直接分配到老生代
2.对于一般而言的对象优先分配到Eden区域
3.长期存活的对象进入老年代(每新生代GC一次(Minor GC/GC),对象就年龄就增加一岁,直到达到预设的age,然后就移动到老年代。)
4.动态年龄规划,通过动态计算,将其移动到老生代。
垃圾回收器的种类以及实现方式(主要学习下被人解决问题的思路,核心就是用多线程、单线程来完成垃圾回收,以及cpu的时间片占用。)
1.Serial:采取复制算法。单线程收集器。用在新生代。
2.Serial old:单线程收集器,采取标记-整理算法。用在老年代。
3.ParNew:Serial的多线程版本,采取的复制算法。用在新生代。
4.Parallel Scavenge:与ParNew类似,但是关注的是吞吐量。在这里指的是CPU运行用户代码耗时/CPU总的耗时。CPU总耗时可以简化归纳为:用户代码耗时+垃圾回收耗时。
通过配置达到-XX:MaxGCPauseMillis来设置垃圾回收的最大停顿时间;通过配置-XX:GCTimeRatio来设置吞吐率。
5.Parallel Old:是Parallel Scavenage老年代版本。
6.CMS:多线程的一个垃圾回收器,关注老年代。
主要分为以下几个步骤:初始标记-标记GC ROOTS直接关联到的对象。独占运行,用户线程停止。
并发标记-通过GC ROOTS TRANCE的过程,这个时候是和用户线程一起运行。
重新标记-将并发标记期间用户线程产生的新的无用对象标记上。
并发清理-清理标记过的数据
并发重置-重置CMS的数据结构,等待发起下一次GC。
缺点:采用标记-清理算法,容易产生大量碎片。
对CPU资源敏感。i-CMS的策略是采取抢占来放小该问题。
对并发清理期间产生的垃圾只能留到下一次FULL GC,这部分时间片中内存产生的垃圾叫‘浮动垃圾’。
7.G1:采取标记-整理算法。
按照收集区域划分
新生代:Serial、ParNew、Parallel Scavenge
老年代:CMS、Parallel Old、Serial Old
跨年代的收集器:G1
各种垃圾回收器搭配使用情况:
Serial+Serial old 、 Serial+CMS、
Parallel+parallel Scavenge、Parallel Scavenge+Serial old、
ParNew+CMS、ParNew+Parallel Old
另外老年代配合协同使用的是:CMS + Serial old。原因在于CMS要是在预留内存不足的时候就会“CURRENT MODEL FAILUER”,就会寻求Serial old来一次Full GC。