jvm学习笔记(二)

垃圾收集算法:

1)标记-清除算法:先标记再清除,缺点是会造成大量内存碎片。

2)复制算法:虚拟机内存分为等大的两部分,一部分快用完时将这一部分复制到另一块内存上,在把复制前存放的这一块内存清除。缺点是每次只能使用一般内存,代价略高。

     改进:新生代对象寿命较短,不需要按照1:1的比例划分内存,因此可以分为一块较大的eden空间和两块较小的survivor。每次只使用eden和一块survivor,回收时,把eden和survivor还存活的对象拷贝到剩下的survivor中,再清理。当还存活的对象大小大于一块survivor的容量时,有时需要借助其他内存(例如老年代)分配。

3)标记整理算法:老年代对象存活率比较高,采用同复制算法时间和空间成本较高,因此在老年代采用标记整理法。先标记再让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

几种垃圾收集器:

     serial:单核单线程,收集过程中必须停止所有线程停掉,适用于clent。新生代收集。

     parnew:serial的多线程版本。新生代收集。

     parallel scavenge:尽可能的提高吞吐量,吞吐量=用户代码时间/(用户代码时间+垃圾收集时间),更高效率利用cpu时间,适合在后台运算而不需要太多交互的任务。

    serial old收集器:单线程,标记整理法。配合parallel scavenge使用。

    parallel old:多线程,标记-整理算法。配合parallel scavenge使用。

    cms:最短回收停顿时间。初始标记--》并发标记--》重新标记--》并发清除

                    缺点:1 、cpu资源好用大,影响吞吐量,默认回收线程数:(cpu数量+3)/4,核心数少时,占用cpu资源多。

                              2、无法处理浮动垃圾,因为并发清除阶段还会有新的垃圾出现。

                              3、标记清楚算法产生大量空间碎片,有事需要给大对象触发一次full gc,并在full gc之后进行碎片整理。                                    可调节。

     g1:标记——整理算法,精确控制停顿。主要措施是极力避免全区域垃圾收集,将整个java堆分为多个区域进行监控。


对象分配与回收策略:

     大多数情况下,对象在新生代Eden区中分配,eden没有足够空间时,发起一次minor gc。

    大对象直接进入老年代。应当尽量避免朝生夕死的大对象。

    长期存活的对象将进入老年代。

    空间分配担保。

名词解释:minor gc:新生代回收。

                 full gc:整个堆空间回收。








你可能感兴趣的:(jvm学习笔记(二))