|
In the context of memory profile analsysis we are documenting the current bahavior of some caches in UserIstance class. Abstract:A cache is a repository used to store previously fetched resources, also known as objects. Caching provides two main benefits to a web application
Caching Strategy:To implement a successful caching mechanism a very well planned caching strategy is a key factor. The key issues that needs to be resolved are as follows
UserInstance Cache:Two member variables of UserInstance class are used to maintain this cache implementation (a home grown cache implementation).
If caching is enabled and character caching is NOT enabled then the SAX that represents the user's layout for the folder (tab) they are requesting will be attempted to be cached in the systemCache. If character caching is enabled, the serialized form of that layout will be stored in systemCharacterCache. Both indexed by the cacheKey from constructCacheKey(), which incidentally, has a bad side effect. If you look in processUserLayoutParameters() it manually binds the username to the theme preferences. This guarantees that no two users can share any cache entries. If the character cache is enabled, the system cache is not used. Both of these caches are tied to the user session. That means the cached objects are only good for one particular user session and nothing will be shared with the other users. Is it really the intent of the design? I don't know but the fact is the current caching strategy is probably not the optimal. Following scenario will explain it. Imagine user's layout has three tabs (tab 1, tab 2 and tab 3). Tab 1 is the default tab.
Above scenario proves that this cache implementation is not very optimal you are keeping lots of data in the memory making a user session fat than it really need to be. One might argue that user might do lots of actions on one tab if it has cached data then cache is serving its purpose.
Cache key dissectionThe following is a dissection of the cache key. An example of a cache key 399820,userLayoutRootNode,system1activeTab=1userLayoutRoot=rootnewNodeID=authenticated=true(folder:s10087: 50%,)(folder:s10057:50%,)(folder:s10083:50%,)(folder:s10101:50%,)(folder:s10080:50%,)(folder:s10075:50%,)( folder:s10099:50%,)(folder:s10097:50%,)(folder:s10070:50%,)(folder:s10095:50%,)(folder:s10064:50%,)(folder: s10091:50%,)userName=JohnDoeskin=spring(channel:n10077:false,)(channel:n10058:false,)7885417921252830597 Cache Key, made up of 4 top-level components <person-id><comma><req-method-node-id><comma><upref-cache-key><ulayout-mgr-cache-key>
How each value is obtained:1. <person-id>: 399820
2. <req-method-node-id>: userLayoutRootNode
where the req is the HttpServletRequest. For example: https://my.rutgers.edu/portal/tag.a0f28b48b5675695.render.userLayoutRootNode.target.n10062.uP? 3. <upref-cache-key>: system1activeTab=1userLayoutRoot=rootnewNodeID=authenticated=true(folder:s10087:50%,)(folder:s10057:50%,)(fold
defined as follows: For the example above: <profile-id>: 1 <structure-upref>: activeTab=1userLayoutRoot=rootnewNodeID=authenticated=true(folder:s10087:50%,)(folder:s10057:50%,)(folder: <theme-upref>: userName=JohnDoeskin=spring(channel:n10077:false,)(channel:n10058:false,) a. [UPC:system] an optional String value ("system") prepended to System profiles b. <profile-id>
c. <structure-upref>
<str-stylesh-upref><str-theme-stylesh-upref><str-struct-stylesh-upref> i. <str-stylesh-upref>: activeTab=1userLayoutRoot=rootnewNodeID=authenticated=true
ii. <str-theme-stylesh-upref>: (None found in example: otherwise, would look like (channel:nnnnn:false,)
iii. <str-struct-stylesh-upref>:
d. <theme-upref>
<thm-stylesh-upref><thm-theme-stylesh-upref> i. <thm-stylesh-upref>: userName=John Doeskin=spring
ii. <thm-theme-stylesh-upref>: (channel:n10077:false,)(channel:n10058:false,)
4. <ulayout-mgr-cache-key>: 7885417921252830597
NotesI believe there are thread contention issues with these two variables (systemCache UP-1145 and systemCharacterCache) since both are not synchronized and reads and updates are not made within the synchronized blocks either. Example systemCharacterCache markup <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html lang="en" xml:lang="en"><head><title>myRutgers</title><meta content="text/html; charset=iso-8859-1" http-equiv="content-type" /><link type="image/x-icon" href="favicon.ico" rel="Shortcut Icon" /><link type="text/css" href="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/skin/myrutgers1.css" rel="stylesheet" /></head><body><div id="portal-page-header"><div id="logo"><img alt="myRutgers Logo" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/institutional/uportal_logo_grid.gif" height="60" width="255" /></div> <div id="tabs"><ul><li><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=root&uP_sparam=activeTab&activeTab=1"><span>Everyday</span></a></li><li><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=root&uP_sparam=activeTab&activeTab=2"><span>Libraries</span></a></li><li id="active-tab"><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=root&uP_sparam=activeTab&activeTab=3"><span>Campus Life</span></a></li><li><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=root&uP_sparam=activeTab&activeTab=4"><span>Administration</span></a></li><li><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=root&uP_sparam=activeTab&activeTab=5"><span>Reporting Tools</span></a></li><li><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=root&uP_sparam=activeTab&activeTab=6"><span>myTab</span></a></li></ul></div></div><div id="portal-page-body"><table width="100%" cellspacing="15" cellpadding="0"><tr><td valign="top" width="50%"><div class="portlet-toolbar"><div><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_tcattr=minimized&minimized_channelId=n10081&minimized_n10081_value=true#n10081"><img title="shade" alt="shade" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/max.gif" /></a><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=n10081"><img title="maximize" alt="maximize" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/focus.gif" /></a><a onclick="return confirm('Are you sure you want to remove this channel?')" href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_remove_target=n10081"><img title="remove" alt="remove" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/remove.gif" /></a></div><a name="n10081"><h2 id="n10081">Maps and Buildings</h2></a></div><div class="portlet clearfix"> </div><div class="portlet-toolbar"><div><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_tcattr=minimized&minimized_channelId=n10082&minimized_n10082_value=true#n10082"><img title="shade" alt="shade" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/max.gif" /></a><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=n10082"><img title="maximize" alt="maximize" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/focus.gif" /></a><a onclick="return confirm('Are you sure you want to remove this channel?')" href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_remove_target=n10082"><img title="remove" alt="remove" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/remove.gif" /></a></div><a name="n10082"><h2 id="n10082">Athletics</h2></a></div><div class="portlet clearfix"> </div></td><td valign="top" width="50%"><div class="portlet-toolbar"><div><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_tcattr=minimized&minimized_channelId=n10084&minimized_n10084_value=true#n10084"><img title="shade" alt="shade" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/max.gif" /></a><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=n10084"><img title="maximize" alt="maximize" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/focus.gif" /></a><a onclick="return confirm('Are you sure you want to remove this channel?')" href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_remove_target=n10084"><img title="remove" alt="remove" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/remove.gif" /></a></div><a name="n10084"><h2 id="n10084">Parking/Transportation</h2></a></div><div class="portlet clearfix"> </div><div class="portlet-toolbar"><div><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_tcattr=minimized&minimized_channelId=n10085&minimized_n10085_value=true#n10085"><img title="shade" alt="shade" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/max.gif" /></a><a href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_root=n10085"><img title="maximize" alt="maximize" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/focus.gif" /></a><a onclick="return confirm('Are you sure you want to remove this channel?')" href="tag.90299c0feb91b440.render.userLayoutRootNode.uP?uP_remove_target=n10085"><img title="remove" alt="remove" height="19" width="19" src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers1/controls/remove.gif" /></a></div><a name="n10085"><h2 id="n10085">Buses/Shuttles</h2></a></div><div class="portlet clearfix"> </div></td></tr></table></div><div id="portal-page-footer"><div><a href="http://www.rutgers.edu/" target="_blank"><img src="media/edu/rutgers/acs/portal/layout/tab-column/rutgers-theme/myrutgers/institutional/rutgers_footer_logo.gif" title="Go to Rutgers home page" alt="Rutgers Logo" height="30" width="99" /></a></div><p> Links to campus web sites: <a href="http://camden-www.rutgers.edu/" target="_blank">Camden</a>, <a href="http://rutgers-newark.rutgers.edu/" target="_blank">Newark</a>, <a href="http://nbp.rutgers.edu/" target="_blank">New Brunswick/Piscataway</a>, <a href="http://www.rutgers.edu/" target="_blank">Rutgers University</a>. <br /> For assistance, contact the Help Desks in: <a href="http://rucs.camden.rutgers.edu/" target="_blank">Camden</a>, <a href="http://www.ncs.rutgers.edu/helpdesk/" target="_blank">Newark</a>, or <a href="http://www.nbcs.rutgers.edu/helpdesk/hdnew/" target="_blank">New Brunswick/Piscataway</a>. </p></div></body></html> |