Tomcat内存越来越大

cod*_*441 11 java apache tomcat

导致tomcat内存增长和下降的原因

Ren*_*ink 6

它是jconsole本身导致锯齿形图案.

要查看的效果jconsole或者jvisualvm你可以写一个简单的Java程序只有一个主循环.例如

public static void main(String[] args) {
    while (true) {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只用一点堆就可以执行它java -Xmx20m ....这将有助于您更好地查看堆利用率,因为jstat我将使用的工具以百分比形式打印利用率.

现在打开一个命令行窗口并执行jstat.您将需要java进程的PID并可以使用它找到它jps -l.

jstat -gcutil <PID>
Run Code Online (Sandbox Code Playgroud)

它会打印出这样的东西

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00   0,00  69,34   0,00  14,48  17,19      0    0,000     0    0,000    0,000
Run Code Online (Sandbox Code Playgroud)

专注于伊甸园空间E.该值是空间当前容量的百分比.有关详细信息,请查看jstat.

如果您反复执行该命令,您将看到伊甸园空间利用率不会增长.它保持在例如69,34.我在Windows上使用类似linux的命令来以特定间隔重新运行命令.见watch.bat

现在打开 jconsole

jconsole <PID>
Run Code Online (Sandbox Code Playgroud)

jstat一次又一次地执行命令.您将看到伊甸园空间不断增长,直到达到最大值并且它被垃圾收集.

这是我输出jstat --gcutil <PID>的间隔为1秒.专注于伊甸园空间E.

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00   0,00  67,42   0,00  14,48  17,19      0    0,000     0    0,000    0,000
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00   0,00  67,42   0,00  14,48  17,19      0    0,000     0    0,000    0,000
# jconsole connected
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  96,88  81,64   7,57  92,26  84,87      1    0,001     0    0,000    0,001
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  96,88  84,66   7,57  92,26  84,87      1    0,001     0    0,000    0,001
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  96,88  89,70   7,57  92,26  84,87      1    0,001     0    0,000    0,001
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  96,88  91,70   7,57  92,26  84,87      1    0,001     0    0,000    0,001
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  96,88  93,70   7,57  92,26  84,87      1    0,001     0    0,000    0,001
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  96,88  95,70   7,57  92,26  84,87      1    0,001     0    0,000    0,001
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  96,88  96,70   7,57  92,26  84,87      1    0,001     0    0,000    0,001
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  96,88  98,71   7,57  92,26  84,87      1    0,001     0    0,000    0,001
# Garbage collected
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
100,00   0,00   1,13  14,06  94,75  89,26      2    0,003     0    0,000    0,003
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
100,00   0,00   3,00  14,06  94,75  89,26      2    0,003     0    0,000    0,003
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
100,00   0,00   5,75  14,06  94,75  89,26      2    0,003     0    0,000    0,003
Run Code Online (Sandbox Code Playgroud)

正如你所看到的......在连接到进程的jconsole之后,eden空间会逐渐增长并生长,直到它被垃圾收集.这导致锯齿形图案.这是一张快照jvisualvm.

在此输入图像描述

当您对tomcat进程执行相同操作时,您将发现类似的行为.唯一不同的是,即使没有连接jconsole,伊甸园空间也会略微增长.但这种轻微的增长并不是你所看到的锯齿形图案的原因.

这是jstat我的tomcat 的输出.

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  99,80  70,33   4,81  96,85  90,10      5    0,037     0    0,000    0,037
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  99,80  70,33   4,81  96,85  90,10      5    0,037     0    0,000    0,037
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  99,80  70,43   4,81  96,85  90,10      5    0,037     0    0,000    0,037
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  99,80  70,43   4,81  96,85  90,10      5    0,037     0    0,000    0,037
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  99,80  70,43   4,81  96,85  90,10      5    0,037     0    0,000    0,037
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
Run Code Online (Sandbox Code Playgroud)

此输出持续36秒,直到您可以看到小内存更改.从70,4370,53.

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  99,80  70,43   4,81  96,85  90,10      5    0,037     0    0,000    0,037
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  99,80  70,53   4,81  96,85  90,10      5    0,037     0    0,000    0,037
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0,00  99,80  70,53   4,81  96,85  90,10      5    0,037     0    0,000    0,037
Run Code Online (Sandbox Code Playgroud)

因此,这个小小的改变是tomcat的后台进程唯一负责的事情.

PS:您还可以使用Memory Analyzer并不时获取堆转储,您会看到byte[]由于RMI网络流量,阵列使用的内存量会增加.