we are facing the same issue in our seam application. I noticed that the heap size grows after every view; even if I jump between the same two views. On debbuging I found out that AjaxStateHolder caches the shown view in its LRUMap attribute. But the same view can occur several time in this "cache"; the views from this "cache" are not reused and just fill the session. If an application has many large views and deals with many concurrent sessions, the heap can easily grow up to Gigabytes(!)
As workaround you can define the size of the LRUMap in the web.xml:
<context-param> <description> </description> <param-name>com.sun.faces.numberOfViewsInSession</param-name> <param-value>1</param-value> </context-param> <context-param> <description> </description> <param-name>com.sun.faces.numberOfLogicalViews</param-name> <param-value>1</param-value> </context-param>
But it's just a workaround.
From my point of view this is an issue and should reported in JIRA.