Daniel Niklas schrieb:
Hi,

i am using server-side state saving (because the environment is a portal). I
noticed a high memory consumption for the view state, or exacting for the
history of old view states. Now i have some questions on this:

1)
Is view state history *only* for "back-Button" of the browser?
It is also needed to support multiple windows for the same webapp. Actually, this doesn't really work properly but having some old view states at least makes it work some of the time.

The idea is that by setting NUMBER_OF_VIEWS_IN_SESSION, a webapp can guarantee to support a certain number of back-button clicks - at the JSF level at least.

Or that when two windows are open on the same webapp, that the user can perform NUMBER_OF_VIEWS_IN_SESSION clicks in one window before the other window starts to misbehave.

In practice, neither of these are very useful if the application uses session-scoped beans of any type as these are not "versioned" like the view, and so trying to go "back" to a previous view (or use a separate window) while having just one copy of the session-scoped beans is usually a problem. An app needs to use only request-scoped beans, or Orchestra conversation-scoped beans for this to function correctly.

The "weak" map stuff then tries to make life nice for the user; when there is memory to spare then it tries to keep as many old views as possible, so that even more than NUMBER_OF_VIEWS_IN_SESSION clicks will work. But when memory is low, only NUMBER_OF_VIEWS_IN_SESSION clicks are guaranteed to work.
2)
There is a (Weak/Soft) ReferenceMap for old view states. Theses instances
comes into old generation memory. I think, the garbage collector must often
clean up these objects. Is this an optimal behavior?

I'm using myfaces 1.1.5. Here the old views are hold with soft references.
Is this working? I found an issue
https://issues.apache.org/jira/browse/MYFACES-1658.

In 1.1.6 the ReferenceMap holds only weak values and keys. Why that?
I'm not sure what you're asking here. Why do you think that something is not working?

The original code used the default constructor for ReferenceMap, which uses strong refs to keys but weak refs to values. The key object here is not large; it is the value (which is the whole UIViewRoot) that is held weakly. However nothing *ever* clears the keys for this map. So as the profiling tests referenced in the original email thread show, there is a leak: when a single user makes a large number of requests in the same session then eventually the number of key objects in the map builds up to unreasonably large number. They are small, but enough of them add up.

The fix was to use weak refs for the keys as well. And the profiling tests showed that this solved the issue.

I suspect that there is a *slight* leak here. Suppose a user performs a lot of requests, then stops. The garbage-collector will eventually reclaim both the key and value objects from the "old" map. But it won't reclaim the Map.Entry objects used by the ReferenceMap itself. I presume that these get collected when any method is called on ReferenceMap, but as the user is inactive that doesn't happen. So some memory is held by the user until the session expires. Probably not a problem in practice though.

Is that what you wanted to know?

Regards,
Simon

Reply via email to