
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
java程序员不懂JVM内存回收,两年后也是个菜鸟
在学java程序员的时候,如果你还不懂JVM内存回收,那么你就只能是个很一般的程序员菜鸟了,那么什么是JVM内存回收呢?今天我们就来学习,都还不深入了解在上以前的课程中达内培训老师说过“JVM(三)内存回收(一)”我讲到了垃圾回收的几种算法,算是解决了之前提到的3个问题中的最后一个。
关于内存回收,还应该了解常用的内存回收器(GC Collector),即执行上述回收算法的引擎。
【垃圾回收器】
Serial / Serial old 回收器:从名字的字面意思就能明白,这两个是串行垃圾回收器。请看下图:
Serial/Serial Old收集器运行示意图
昆明达内培训老师从图中可以看出,当到达“安全点”的时候,所有的用户线程都被挂起,即“Stop the world”发生了,然后再由单个GC线程来回收所有不需要使用的对象的内存。这里需要注意的是:
在新生代(serial)中,采用的复制算法进行垃圾回收
在老年代(serial old)中,则是采用的标记-整理算法进行垃圾回收
这两个收集器一般不建议在多处理器的服务器端使用,如果要使用,一般用在内存很小的桌面应用程序或者单核(或少核)的CPU服务器上。
【回收器】
这三个回收器均为并行回收器,其中,除了Parallel old用于老年代回收外,另外两个都用在新生代。其并行主要体现在:Serial回收器在GC阶段只有单个线程进行GC,而这些回收器,会存在多个GC线程。
【新生代两个并行收集器区别】
ParaNew 除Serial收集器之外,只有它能和CMS搭配使用;另外,它更注重的是缩短停顿时间,达到更好的用户体验,比较适应用作与用户交互的应用程序上。使用 -XX:+UseConcMarkSweepGC选项默认会被指定为新生代的收集器,而使用-XX:+UseParaNewGC选项来强制指定它为新生代收集器;
【CMS 回收器】
CMS GC (-XX:+UseConcMarkSweepGC),其工作过程比之前的任何一个GC Collector都要复杂,但是对低时延的应用非常有用。下面我们通过和Serial GC对比一下来说明是怎么样做到更低时延的。
Parallel Scavenge 则是更注重吞吐量的一个收集器,所谓的吞吐量就是“运行用户代码的时间/(运行用户代码时间+垃圾收集时间)”,主要适合在后台需要大量运算而不需要交互太多的任务。
另外一个最大的不同是,该收集器在设定了虚拟机的优化目标之后,如指定了-Xmx,并且指定了MaxGCPauseMillis(更关注最大停顿时间)或GCTimeRatio(更关注吞吐量),再选择参数-XX:+UseAdaptiveSizePolicy,使用自适应功能之后,虚拟机会自动根据收集到的系统性能监控信息,动态调整新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数了,从而提供最合适的停顿时间或者最大的吞吐量。
老年代的并行收集器(Parallel old),是Parallel Scavenge的老年代版本,使用多线程+“标记-整理”算法实现。二者搭配之后,主要用于比较关注高吞吐量、CPU敏感的应用系统。-XX:+UseParallelOldGC来指定。
0元课程抢先听,扫码可得机会!