解读JVM虚拟机( 四 )

  • 提供了俩个非常关键的参数控制系统的吞吐量
  • -XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间 , 可用把虚拟机在GC停顿的时间控制在MaxGCPauseMillis范围内 , 如果希望减少GC停顿时间可以将MaxGCPauseMillis设置的很小 , 但是会导致GC频繁 , 从而增加了GC的总时间 , 降低了吞吐量 。 所以需要根据实际情况设置该值 。
  • -XX:GCTimeRatio:设置吞吐量大小 , 它是一个0到100之间的整数 , 默认情况下他的取值是99 , 那么系统将花费不超过1/(1+n)的时间用于垃圾回收 , 也就是1/(1+99) = 1%的时间 。
  • 另外还可以指定 -XX:+UseAdaptiveSizePolicy打开自适应模式 , 在这种模式下 , 新生代的大小、eden、from/to的比例 , 以及晋升老年代的对象年龄参数会被自动调整 , 以达到在堆大小、吞吐量和停顿时间之间的平衡点 。
  • 并行回收器(ParallelOldGC回收器):
    • 老年代ParallelOldGC回收器也是一种多线程的回收器 , 和新生代的ParallelGC回收器一样 , 也是一种关注吞吐量的回收器 , 他使用了标记压缩算法进行实现 。
    • -XX:+UseParallelOldGC 进行设置
    • -XX:+ParallelGCThreads 也可以设置垃圾收集时的线程数量 。
    CMS回收器:
    • CMS全称为:Concurrent Mark Sweep 意为并发标记清除 , 他使用的是标记清除法 , 主要关注系统停顿时间 。
    • 使用 -XX:+UseConcMarkSweepGC 进行设置 。
    • 使用 -XX:ConcGCThreads 设置并发线程数量 。
    • CMS并不是独占的回收器 , 也就说CMS回收的过程中 , 应用程序仍然在不停的工作 , 又会有新的垃圾不断的产生 , 所以在使用CMS的过程中应该确保应用程序的内存足够可用 。 CMS不会等到应用程序饱和的时候才去回收垃圾 , 而是在某一阀值的时候开始回收 , 回收阀值可用指定的参数进行配置 , -XX:CMSInitiatingOccupancyFraction来指定 , 默认为68 , 也就是说当老年代的空间使用率达到68%的时候 , 会执行CMS回收 。 如果内存使用率增长的很快 , 在CMS执行的过程中 , 已经出现了内存不足的情况 , 此时CMS回收就会失败 , 虚拟机将启动老年代串行回收器进行垃圾回收 , 这会导致应用程序中断 , 知道垃圾回收完成后才会正常工作 , 这个过程GC的停顿时间可能较长 , 所以 - XX:CMSInitiatingOccupancyFraction的设置要根据实际的情况 。
    • 标记清除法有个缺点就是存在内存碎片的问题 , 那么CMS有个参数设置-XX:+UseCMSCompactAtFullCollecion可以使CMS回收完成之后进行一次碎片整理 , -XX:CMSFullGCsBeforeCompaction参数可以设置进行多少次CMS回收之后 , 对内存进行一次压缩 。
    G1回收器:
    • G1回收器(Garbage-First)是在jdk1.7中正式使用的垃圾回收器 , 从长期目标来看是为了取代CMS回收器 , G1回收器拥有独特的垃圾回收策略 , G1属于分代垃圾回收器 , 区分新生代和老年代 , 依然有eden和from/to区 , 它并不要求整个eden区或者新生代、老年代的空间都连续 , 它使用了分区算法 。
    • 并行性:G1回收期间可多线程同时工作 。
    • 并发性:G1拥有与应用程序交替执行能力 , 部分工作可与应用程序同时执行 , 在整个GC期间不会完全阻塞应用程序 。
    • 分代GC:G1依然是一个分代的收集器 , 但是它是兼顾新生代和老年代一起工作 , 之前的垃圾收集器他们或者在新生代工作 , 或者在老年代工作 , 因此这是一个很大的不同 。 空间整理:G1在回收过程中 , 不会像CMS那样在若干次GC后需要进行碎片整理 , G1采用了有效复制对象的方式 , 减少空间碎片 。
    • 可预见性:由于分区的原因 , G1可以只选取部分区域进行回收 , 缩小了回收的范围 , 提升了性能 。
    • 使用 -XX:+UseG1GC 应用G1收集器
    • 使用 -XX:MaxGCPauseMillis 指定最大停顿时间
    • 使用 -XX:ParallelGCThreads 设置并行回收的线程数量
    Tomcat性能影响实验:
    • 配置环境说明:Tomcat7
    • 一个JSP网站 测试网站吞吐量(1个指标、停顿时间 , 内存的使用情况 , 包括回收的效率....)
    • 工具:Apache JMeter 下载地址:
    • 实验原理:通过JMeter对Tomcat增加压力 , 不同的虚拟机参数应该会有不同的表现
    • 目的:观察不同配置参数对吞吐量的影响
    测试串行回收器:
    • -XX:+PrintGCDetails -Xmx32M -Xms32M
    • -XX:+HeapDumpOnOutOfMemoryError
    • -XX:+UseSerialGC -XX:PermSize=32M
    • 测试结果显示吞吐量为:1152 115
    扩大堆内存以提升系统性能: