『Java』Java JVM常见面试题:JVM调优案例


『Java』Java JVM常见面试题:JVM调优案例

GC调优策略
降低Minor GC频率

  • Minor GC的时间分为两部分:扫描新生代和复制存活对象时间 。
  • 如果堆中短期的对象很多 , 扩容新生代的大小(虽然会增加扫描新生代的时间 , 但同时也会缩短复制对象的时间 , 因为减少了存回对象的数量 。 对于老年代来说 , 进行Major , 甚至是Full GC来说 , 所需要的时间也会减少 。 PS:扫描对象成本明显低于复制存活对象的成本)
  • 如果堆中长期存活的对象很多 , 则不应该增加新生代的大小 , 因为会增加Minor GC的时间(扫描和复制存活对象的时间 , 都不会减少)
降低Full GC频率
  • 减少大对象的创建
    • 会超过所设置的大对象大小的阈值 , 直接进入老年代
    • 即时没有超过所设置的大对象大小的阈值 , 在新生代空间有限的情况下 , 根据空间分配担保也会有大几率被分配到老年代
  • 增大堆内空间
    • 设置初始化堆内存和最大堆内存大小相同 , 也可以降低Full GC的频率 。 也会减少内存自动扩容、自动降容的成本 。
选择适当的GC回收器
  • 对单次操作的响应时间有优先的要求 , 可以选择CMS和G1收集器
  • 堆系统吞吐量有优先的要求 , 可以选择Parallel Scavenge收集器
案例大内存硬件上的程序部署策略
  • 场景:一个统计/大文档系统 , 给HotSpot虚拟机分配2G内存 , 用户使用觉得网站比较慢 , 在运维把内存升到12G 。
  • 问题:经常发生无规律长时间失去响应 。
  • 原因:(Parallel Scavenge/Old收集器)过大的堆内存进行Full GC时 , 用户线程长时间停顿导致(之前服务的堆内存2G , 在进行Full GC时 , 用户线程停顿时间稍断 , 所以用户在访问时 , 只是会觉得慢 , 但是把内存增加到12G之后 , 老年代在进行Full GC时 , 需要回收的内存变大 , 所需的时间就会增加 , 甚至会超过web服务器的响应时间 , 失去响应) 。
  • 部署方面(单机的情况下):