JVM调优实战——YoungGC的优化过程

问题

在这里插入图片描述
Young GC较为频繁。查看服务器的JVM参数如下

-Xms1000M 
-Xmx1800M 
-Xmn350M 
-Xss300K 
-XX:+DisableExplicitGC 
-XX:SurvivorRatio=4 
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 
-XX:CMSInitiatingOccupancyFraction=70 
-XX:+CMSParallelRemarkEnabled 

-Xms表示初始化堆内存

-Xmx表示最大堆内存

-Xmn表示新生代内存

-XX:SurvivorRatio=4表示新生代的Eden是4/10,S1和S2各占3/10

因此Eden的内存大小为:0.435010241024字节, 为14010241024**字节

程序

/**
 * @date : 2020-03-22 09:48
 **/
public class JavaHeapTest {

  public final static int OUTOFMEMORY = 500 * 1024 * 1024;

  private String oom;

  StringBuffer tempOOM = new StringBuffer();

  public JavaHeapTest(int leng) {
    int i = 0;
    while (i < leng) {
      i++;
      try {
        tempOOM.append("a");
      } catch (OutOfMemoryError e) {
        e.printStackTrace();
        break;
      }
    }
    this.oom = tempOOM.toString();
  }

  public String getOom() {
    return oom;
  }

  public static void main(String[] args) {
    for(int i=0;i<50;i++) {
      JavaHeapTest javaHeapTest = new JavaHeapTest(OUTOFMEMORY);
      System.out.println(javaHeapTest.getOom().length());
    }
  }
}

原因

年轻代分为1个Eden和2个Survivor区(一个是from,另一个是to)。新创建的对象一般都会被分配到Eden区,如果经过第一次GC后仍然存活,就会被移到Survivor区。Survivor区中的对象每经过一次Minor
GC,年龄+1,当年龄增加到一定程度时,会被移动到年老代。

OUTOFMEMORY = 500 * 1024 * 1024,大于Eden内存的大小。新生代分配内存小,导致YoungGC的频繁触发。

初始化堆内存没有和最大堆内存一致,在每次GC后进行内存可能重新分配。

解决方法

提升新生代大小

将初始化堆内存设置为最大内存

将SurvivorRatio由4修改为8,让垃圾在新生代时尽可能的多被回收掉

-Xmn350M -> -Xmn800M
-XX:SurvivorRatio=4 -> -XX:SurvivorRatio=8
-Xms1000m ->-Xms1800m

效果

YoungGC次数明显减少
在这里插入图片描述

对象从出生到回收的全过程

我是一个普通的java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。

参考链接

https://blog.csdn.net/wy5612087/article/details/52369677/
https://blog.csdn.net/cml_blog/article/details/81057966

展开阅读全文
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值