Java Servlet + jsp 環境で実運用した結果、日に日にヒープ使用量が増え、fullGCしても減らない、
という場合は、web.xml の JspServlet の設定の見直しをおすすめします。
JspServlet のパラメータ development はデフォルトが true になっています。
これは jasper (JSPエンジン)を開発モードにするか否か、というパラメータになっており、
詳しくは調べていないですがこれを true にすると、
なんらかのエラーが起きた時に詳細情報を出力するためにヒープ上に情報を保持しておくらしいです。
Tomcat をインストール直後の web.xml を見てみると以下の様な設定になっています。
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
development パラメータがないので、値としては true が設定されているものとして動作します。
development パラメータのことを知らないと、このまま実運用してしまいそうで怖いです。
必須パラメータにしてくれればいいのに・・・。
これを以下の様に書き換えると、ヒープがどんどん増えていく現象は解消されます。
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>development</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>checkInterval</param-name>
<param-value>60</param-value>
</init-param>
</servlet>
checkInterval というパラメータが増えていますが、
development を false に設定した場合は、jsp の逐次コンパイルをしてくれません。
そのため checkInterval で、jsp のコンパイル間隔を設定する必要があります。
(development = false と checkInterval はセットです)
上記の設定だと、jsp ファイルのリコンパイルを60秒間隔でおこなう、という設定になります。