Java垃圾回收-新生代垃圾收集器

两个关于垃圾回收的关键词

Stop-the-World

  • JVM由于要执行GC而停止了应用程序的执行
  • 任何一种GC算法都会发生
  • 多数GC优化就是通过减少Stop-theWorld发生的时间来提高程序性能

Safepoint

  • 分析过程中对象引用关系不会发生变化的点
  • 产生Safepoint的地方:方法调用;循环跳转;异常跳转等,如果发生GC,就让所有进程到安全点,如果不在安全点,就恢复线程,等所有线程到安全点再说
  • 安全点数量得适中,太少:GC要等待的时间长。太多:增加程序的负荷

常见的垃圾收集器

JVM运行模式

  • Server:启动慢,但是启动进人稳定期运行后,运行速度比Client块,因为该模式下启动的是重量级虚拟机,对程序采用了更多的优化
  • Client:使用轻量级虚拟机

使用java -version查看启动的虚拟机是Server还是Client模式

垃圾收集器之间的联系

Java垃圾回收-新生代垃圾收集器_第1张图片

年轻代常见的垃圾收集器

Serial收集器(-XX:+UseSerialGC,复制算法)
它是JAVA最基本,也是历史最悠久的垃圾收集器,在jdk1.3.1之前,是JAVA年轻代收集器的唯一选择

  • 单线程收集,进行垃圾收集时,必须暂停所有工作线程
  • 简单高效,Client模式下默认的年轻代收集器

Java垃圾回收-新生代垃圾收集器_第2张图片
分配给虚拟机管理的内存,一般来说不会很大,收集几十M或者一两百M的年轻代,停顿时间大多都是几十毫秒,只要不是频繁发生,是完全可以接受的

ParNew收集器(-XX:+UseParNewGC,复制算法)

  • 多线程收集,其余行为、特点和Serial收集器一样
  • 单核执行效率不如Serial,在多核下执行才有优势

Parallel Scavenge收集器(-XX:+UseParallelGC,复制算法)
了解这个收集器前,先来了解一下什么是吞吐量。
吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

  • 比起关注用户线程停顿时间,更关注系统的吞吐量
  • 在多核下执行才有优势

如果在优化过程中遇到困难,可以在启动程序时,再加上-XX:+UseAdaptiveSizePolicy参数,配合-XX:+UseParNewGC,将内存管理的任务交给虚拟机去完成。

你可能感兴趣的:(Java)