<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>OutOfMemory</title>
	<atom:link href="http://www.gregheidorn.com/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gregheidorn.com/wordpress</link>
	<description>Writing helps me remember!</description>
	<pubDate>Fri, 14 Nov 2008 17:02:39 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Ganymede JSP Validation Issue</title>
		<link>http://www.gregheidorn.com/wordpress/2008/11/14/ganymede-jsp-validation-issue/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/11/14/ganymede-jsp-validation-issue/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 17:01:57 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Spring Framework]]></category>

		<category><![CDATA[Web Development]]></category>

		<category><![CDATA[Ganymede]]></category>

		<category><![CDATA[JSP]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=74</guid>
		<description><![CDATA[Yesterday I had a heck of a time trying to figure out my my JSPs weren&#8217;t passing validation since I upgraded Ganymede from 3.4.0 to 3.4.1.  There was a consistent issue where the JSP Validation did not like my scriptlet code, even when I dumbed it down to try even the simplest scriptlet.  [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I had a heck of a time trying to figure out my my JSPs weren&#8217;t passing validation since I upgraded Ganymede from 3.4.0 to 3.4.1.  There was a consistent issue where the JSP Validation did not like my scriptlet code, even when I dumbed it down to try even the simplest scriptlet.  The validation errors looked like:</p>

<div class="wp_syntax"><div class="code"><pre class="text text" style="font-family:monospace;">Syntax error on token &quot;}&quot;, delete this token
Syntax error on token &quot;catch&quot;, Identifier expected
Syntax error, insert &quot;Finally&quot; to complete TryStatement</pre></div></div>

<p>I actually found out what my problem was through the <a href="http://www.eclipse.org/newsportal/article.php?id=17447&#038;group=eclipse.webtools#17447">Eclipse Web Tools usergroup</a>.  The issue for me was the use of the Spring form custom tag library.  If you self-close the tag&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>form<span style="color: #339933;">:</span>errors path<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;*&quot;</span> <span style="color: #339933;">/&gt;</span></pre></div></div>

<p>&#8230;then you get the goofy JSP validation error.  If you close the tag as if there was body content&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>form<span style="color: #339933;">:</span>errors path<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;*&quot;</span><span style="color: #339933;">&gt;&lt;/</span>form<span style="color: #339933;">:</span>errors<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Then the error goes away.  I need to follow-up with a bug for the Ganymede team.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/11/14/ganymede-jsp-validation-issue/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Subclipse Tip on svn:keywords</title>
		<link>http://www.gregheidorn.com/wordpress/2008/11/06/subclipse-tip-on-svnkeywords/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/11/06/subclipse-tip-on-svnkeywords/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 16:56:23 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Eclipse]]></category>

		<category><![CDATA[Subclipse]]></category>

		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=72</guid>
		<description><![CDATA[Keywords in SVN are used to insert dynamic information about a file, into the file, presumably in a comment header.  The SVN manual discusses keywords, however when I was configuring my repository and eclipse projects, I had trouble getting them to update on commit.  I found a blog entry that discussed the keywords property in [...]]]></description>
			<content:encoded><![CDATA[<p>Keywords in SVN are used to insert dynamic information about a file, into the file, presumably in a comment header.  The <a href="http://svnbook.red-bean.com/en/1.0/svn-book.html#svn-ch-7-sect-2.3.4">SVN manual discusses keywords</a>, however when I was configuring my repository and eclipse projects, I had trouble getting them to update on commit.  I found a <a href="http://ajmoore.blogspot.com/2007/12/enabling-cvs-id-tag-for-svn.html">blog entry</a> that discussed the keywords property in the server configuration, so I hopped on my server and set up the configuration accordingly.  I restarted the service and commited a file with the following header:</p>

<div class="wp_syntax"><div class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * @version svn:$Id$
 */</span></pre></div></div>

<p>After the commit, the file did not update as expected.  I did some further digging and found a <a href="http://www.symfony-project.org/forum/index.php/t/15525/">forum post</a> that discussed another option where you set the property on the file.  So I experimented with that using the <em>Team > Set Property &#8230;</em> command in eclipse on a single file.  Setting the property name to <strong>svn:keywords</strong> and value to <strong>Id</strong>.  I made a simple change to my file and committed it again.  Voila!  It worked.</p>
<p>The last step was to apply this keyword to all of my files&#8230;and preferably not manually.  The answer was to go to the root of my project and set the property there, noting to check the <em>Set property recursively</em> check box.  If I want to add more keywords later on, I can by going to the root, modifying the <strong>svn:keywords</strong> property by adding other keywords (refer to the <a href="http://svnbook.red-bean.com/en/1.0/svn-book.html#svn-ch-7-sect-2.3.4">manual</a> again) separated by a single space.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/11/06/subclipse-tip-on-svnkeywords/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cubs Medicine:  Soraino (or Lee) for Ichiro</title>
		<link>http://www.gregheidorn.com/wordpress/2008/10/07/cubs-medicine-soraino-or-lee-for-ichiro/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/10/07/cubs-medicine-soraino-or-lee-for-ichiro/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 17:17:07 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Cubs]]></category>

		<category><![CDATA[Hot Stove]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=68</guid>
		<description><![CDATA[When you get around to talking about the Hot Stove for the Cubs, consider a deal for Ichiro leveraging either Soriano or Lee.  This move works on the following levels:
- Seattle&#8217;s players hate Ichiro.
- Seattle won&#8217;t want to lose their marquee player without getting a marquee-level player in return.
- Seattle is in flux and [...]]]></description>
			<content:encoded><![CDATA[<p>When you get around to talking about the Hot Stove for the Cubs, consider a deal for Ichiro leveraging either Soriano or Lee.  This move works on the following levels:</p>
<p>- Seattle&#8217;s players hate Ichiro.<br />
- Seattle won&#8217;t want to lose their marquee player without getting a marquee-level player in return.<br />
- Seattle is in flux and would be interested in making a deal.<br />
- Their contracts are similar:  Ichiro&#8217;s is 09:$17M, 10:$17M, 11:$17M, 12:$17M and Soriano&#8217;s is 09:$16M, 10-14:$18M.  This is where the Cubs might have to add value to a deal since Ichiro is cheaper, albeit older by 2 years, than Soriano.  Throw in Guzman or Samardzija.  Neither projects to more than relief or 4th/5th starter roles.<br />
- Cubs would get their lead-off hitter (career .377 OBP)<br />
- Cubs would break-up the Soriano-Ramirez-Lee righty tri-fecta which has two years of post-season stank on them.<br />
- Hoffpauir could play LF and platoon with DeRosa &#038; Fontenot (cycling DeRosa back and forth from 2B to LF).<br />
- Fukudome would have a countryman to play with in the OF.  He seemed overwhelmed and lost in the second half and getting a fellow Japanese player could do wonders for his play in &#8216;09.</p>
<p>Or&#8230;trade Lee instead of Soriano&#8230;you still get all the same benefits and Seattle might even like this more as Lee is more of a team guy and costs less than Soriano.  Talk this up&#8230;I think this is a realistic move that could actually give Cub fans hope in 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/10/07/cubs-medicine-soraino-or-lee-for-ichiro/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cubs Roster Check</title>
		<link>http://www.gregheidorn.com/wordpress/2008/10/07/cubs-roster-check/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/10/07/cubs-roster-check/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 14:58:37 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Cubs]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=64</guid>
		<description><![CDATA[Here&#8217;s my quick take on what to do with the Cubs roster.  There&#8217;s not much to do unless we can make a deal or score a high OBP lefty free-agent CF:  
Cotts - contract up - re-sign
Fox - contract up - let go
Gaudin - contract up - re-sign
Guzman - contract up - re-sign
Howry [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s my quick take on what to do with the Cubs roster.  There&#8217;s not much to do unless we can make a deal or score a high OBP lefty free-agent CF:  </p>
<p>Cotts - contract up - re-sign<br />
Fox - contract up - let go<br />
Gaudin - contract up - re-sign<br />
Guzman - contract up - re-sign<br />
Howry - contract up - let go<br />
Lieber - contract up - let go<br />
Marmol - contract up - re-sign<br />
Marshall - no data available - re-sign &#8230; take Harden&#8217;s spot in rotation<br />
Samardzija - 5y/10m til 2011<br />
Wood - contract up - re-sign<br />
Dempster - contract up - re-sign<br />
Harden - contract up - 2009 option @ 7m - decline<br />
Lilly - 4y/40m til 2010<br />
Marquis - 3y/21m through 2009<br />
Weurtz - contract up<br />
Zambrano - 5y/91.5m til 2012</p>
<p>Blanco - 2009 option @ 3m - accept<br />
K.Hill - contract up - let go<br />
Soto - contract up - re-sign</p>
<p>Cedeno - contract up - re-sign<br />
DeRosa - 3y/13m through 2009<br />
Fontenot - contract up - re-sign<br />
Hoffpauir - contract up - re-sign<br />
Lee - 5y/65m til 2010<br />
Ramirez - 5y/75m til 2011<br />
Theriot - contract up - re-sign</p>
<p>Edmonds - contract up &#8230; replace with FA or Pie &#8230; keep if can&#8217;t find good lefty replacement<br />
Fukudome - 4yr/48m til 2011<br />
Johnson - contract up - re-sign<br />
Pie - contract up - re-sign<br />
Soriano - 8y/136m til 2014<br />
Ward - contract is up &#8230; replace with Hoffpauir</p>
<p>Contract data courtesy of <a href="http://mlbcontracts.blogspot.com/2005/01/chicago-cubs_112114177768677294.html">Cot&#8217;s Contracts</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/10/07/cubs-roster-check/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Synchronization Locks in Standard Taglibs Earlier Than v1.0.6</title>
		<link>http://www.gregheidorn.com/wordpress/2008/10/01/synchronization-locks-in-standard-taglibs-earlier-than-v106/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/10/01/synchronization-locks-in-standard-taglibs-earlier-than-v106/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 14:08:20 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[JSTL]]></category>

		<category><![CDATA[synchronization]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=58</guid>
		<description><![CDATA[Sometimes an oversight can lead to interesting results.  We were testing a servlet-based application and in our test scripts, we had a hitch where if the script encountered an error, the re-try cycle didn&#8217;t have think time included.  Which means anytime the script encountered an application error, it would then send re-try requests [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes an oversight can lead to interesting results.  We were testing a servlet-based application and in our test scripts, we had a hitch where if the script encountered an error, the re-try cycle didn&#8217;t have think time included.  Which means anytime the script encountered an application error, it would then send re-try requests at a sub-second (inhuman) rate.</p>
<p>This increased our load from 10 pages per second to over 100 &#8230; our first indicator that something was wrong.  We saw a corresponding spike in CPU from 8% to over 90% as the single JVM system tried to handle this new load.  The application seized and thread dumps uncovered an interesting side effect.  <span id="more-58"></span>Forty-eight of the 65 allocated web container threads were waiting to lock on the synchronized method getEvaluatorByName() in ExpressionEvaluatorManager, a class provided by the Java Standard Tag Library.  Here&#8217;s a sample from the thread dump:</p>

<div class="wp_syntax"><div class="code"><pre class="text text" style="font-family:monospace;">&quot;WebContainer : 49&quot; daemon prio=5 tid=0x04a86830 nid=0xa1 waiting for monitor entry [0x59a7d000..0x59a7fc28]
    at org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager.getEvaluatorByName(Unknown Source)
    - waiting to lock &lt;0xeb30d958&gt; (a java.lang.Class)
    at org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager.evaluate(Unknown Source)</pre></div></div>

<p>Looking at the source code, you can see the Evaluator retrieval and lazy instantiation of the Evaluator cache is done within this synchronized method.  The intent was to prevent duplicate Evaluators from entering the cache, but the side effect of this approach is that every &#8220;get&#8221; is synchronized.</p>
<h5>Synchronization Blocking – standard-1.0.3.jar</h5>

<div class="wp_syntax"><div class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">synchronized</span> ExpressionEvaluator getEvaluatorByName<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> JspException <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">Object</span> oEvaluator <span style="color: #339933;">=</span> nameMap.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span>;
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>oEvaluator <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				ExpressionEvaluator e <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ExpressionEvaluator<span style="color: #009900;">&#41;</span>
				<span style="color: #000000; font-weight: bold;">Class</span>.<span style="color: #006633;">forName</span><span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
				nameMap.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>name, e<span style="color: #009900;">&#41;</span>;
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span>;
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ExpressionEvaluator<span style="color: #009900;">&#41;</span> oEvaluator<span style="color: #009900;">&#41;</span>;
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">ClassCastException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// just to display a better error message</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> JspException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;invalid ExpressionEvaluator: &quot;</span> <span style="color: #339933;">+</span>
			ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, ex<span style="color: #009900;">&#41;</span>;
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">ClassNotFoundException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> JspException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;couldn't find ExpressionEvaluator: &quot;</span> <span style="color: #339933;">+</span>
			ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, ex<span style="color: #009900;">&#41;</span>;
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IllegalAccessException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> JspException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;couldn't access ExpressionEvaluator: &quot;</span> <span style="color: #339933;">+</span>
			ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, ex<span style="color: #009900;">&#41;</span>;
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InstantiationException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> JspException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;couldn't instantiate ExpressionEvaluator: &quot;</span> <span style="color: #339933;">+</span> ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, ex<span style="color: #009900;">&#41;</span>;
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A better approach would be to move the synchronization &#8220;lower&#8221; in the chain by removing the lock at the method level and creating a static block around the lazy instantiation of the cache.  The project owners recognized this as a bottleneck in 1.0.6 and released the following revised version of the same method.</p>
<h5>Fixed – standard-1.0.6.jar</h5>

<div class="wp_syntax"><div class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> ExpressionEvaluator getEvaluatorByName<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> JspException <span style="color: #009900;">&#123;</span>
	<span style="color: #003399;">Object</span> oEvaluator <span style="color: #339933;">=</span> nameMap.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>oEvaluator <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ExpressionEvaluator<span style="color: #009900;">&#41;</span> oEvaluator<span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">synchronized</span> <span style="color: #009900;">&#40;</span>nameMap<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			oEvaluator <span style="color: #339933;">=</span> nameMap.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span>;
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>oEvaluator <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ExpressionEvaluator<span style="color: #009900;">&#41;</span> oEvaluator<span style="color: #009900;">&#41;</span>;
			<span style="color: #009900;">&#125;</span>
			ExpressionEvaluator e <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ExpressionEvaluator<span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">Class</span>.<span style="color: #006633;">forName</span><span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
			nameMap.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>name, e<span style="color: #009900;">&#41;</span>;
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span>;
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">ClassCastException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// just to display a better error message</span>
		<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> JspException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;invalid ExpressionEvaluator: &quot;</span> <span style="color: #339933;">+</span> ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, ex<span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">ClassNotFoundException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> JspException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;couldn't find ExpressionEvaluator: &quot;</span> <span style="color: #339933;">+</span> ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, ex<span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IllegalAccessException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> JspException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;couldn't access ExpressionEvaluator: &quot;</span> <span style="color: #339933;">+</span> ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, ex<span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InstantiationException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> JspException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;couldn't instantiate ExpressionEvaluator: &quot;</span> <span style="color: #339933;">+</span> ex.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, ex<span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>This code solution reduces contention to almost nothing, as there is only one Evaluator defined (hard-coded, acutally) in the out-of-the-box version of the standard tag libraries.  In conclusion, it&#8217;s always a good idea to absorb updates in the thirty party libraries you are using!  Most Java applications won&#8217;t see this issue unless they have extremely heavy traffic or are using automated load or procedures to churn through their site.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/10/01/synchronization-locks-in-standard-taglibs-earlier-than-v106/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Frack the Vote?</title>
		<link>http://www.gregheidorn.com/wordpress/2008/09/12/frack-the-vote/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/09/12/frack-the-vote/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 17:55:46 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<category><![CDATA[BSG]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=55</guid>
		<description><![CDATA[If you are a Battlestar Galactica fan, you&#8217;ll appreciate this campaign parody to McCain and Palin.  Good for a chuckle on a Friday.
]]></description>
			<content:encoded><![CDATA[<p>If you are a Battlestar Galactica fan, you&#8217;ll appreciate this <a href="http://tighroslin2008.com/">campaign parody</a> to McCain and Palin.  Good for a chuckle on a Friday.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/09/12/frack-the-vote/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google Chrome Beta</title>
		<link>http://www.gregheidorn.com/wordpress/2008/09/02/google-chrome-beta/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/09/02/google-chrome-beta/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 16:08:40 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<category><![CDATA[Google Chrome]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=55</guid>
		<description><![CDATA[I really like the process manager aspect of Google&#8217;s new browser Chrome.  Check out their compelling comic explanation and pick up the Beta after 1pm CST today.
I also enjoyed John Resig&#8217;s take on where this takes browsers and the web in general.
]]></description>
			<content:encoded><![CDATA[<p>I really like the process manager aspect of Google&#8217;s new browser Chrome.  Check out their <a href="http://www.google.com/googlebooks/chrome/index.html">compelling comic explanation</a> and pick up the Beta after 1pm CST today.</p>
<p>I also enjoyed <a href="http://ejohn.org/blog/google-chrome-process-manager/">John Resig&#8217;s take</a> on where this takes browsers and the web in general.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/09/02/google-chrome-beta/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Operation MacBook Recon</title>
		<link>http://www.gregheidorn.com/wordpress/2008/09/01/operation-macbook-recon/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/09/01/operation-macbook-recon/#comments</comments>
		<pubDate>Mon, 01 Sep 2008 14:37:02 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Mac]]></category>

		<category><![CDATA[XCode]]></category>

		<category><![CDATA[ADC]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=54</guid>
		<description><![CDATA[My mom was kind enough to let me borrow her MacBook this weekend so I could get a feel for OS X and maybe tackle some HelloWorld initiatives in Cocoa.  Unfortunately, I didn&#8217;t get a chance to fire it up until this morning due to two days of BBQs (my stomach is not complaining).  I [...]]]></description>
			<content:encoded><![CDATA[<p>My mom was kind enough to let me borrow her MacBook this weekend so I could get a feel for OS X and maybe tackle some HelloWorld initiatives in Cocoa.  Unfortunately, I didn&#8217;t get a chance to fire it up until this morning due to two days of BBQs (my stomach is not complaining).  I hopped out to Dunkin Donuts, got my large cream &amp; sugar, and returned home eager to start coding in this new, strange world.</p>
<p>Alas, my first task was to find XCode, the free IDE from Apple for developing anything Mac-related.  My Mac-savy uncle told me that XCode comes with OS X so there&#8217;s nothing to buy.  True words, though, after combing through the Finder list, I was unsuccessful in finding the darn thing.  Then it dawned on me that XCode may not be a default installation option and after a quick trip to the Apple Developer Center (ADC) I found out why.  XCode is a weighty 1+ GB depending on the version.</p>
<p>Version.  Hmm &#8230; the <a href="http://developer.apple.com/technology/xcode.html">download page for XCode 3.1</a> mentioned that its built for &#8220;Intel or PowerPC Mac running Leopard.&#8221;  Well nuts.  Even being a Mac newbie, I remember that my Mom told me that her MacBook is on Tiger and not running Leopard yet because she&#8217;s in the middle of an iMovie/iPhoto project and heard there were changes moving from 10.4 to 10.5 in that software.  Thwarted in my first attempt, I would not be denied.  I quickly googled for <a href="http://www.google.com/search?client=safari&amp;rls=en&amp;q=xcode+on+10.4&amp;ie=UTF-8&amp;oe=UTF-8">&#8220;XCode on 10.4&#8243;</a> and learned that the ideal version of XCode for Tiger is 2.4.  Googling for XCode 2.4 came up with a couple links to XCode (I ignored these, the URIs seemed generic and they just pointed to the latest XCode downloads) and <a href="https://connect.apple.com/cgi-bin/ WebObjects/MemberSite.woa/wa/getSoftware?bundleID=19681">a legacy link to the XCode 2.4 download</a>.  Huzzah!</p>
<p>I downloaded the disk image (entertained by the DMG extension; pronouncing it as &#8220;damage&#8221;) and when its done I&#8217;ll install and finally get to work!  I only have an hour this morning, so I&#8217;ll be installing and starting my development poking and prodding later today.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/09/01/operation-macbook-recon/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OutOfMemory Errors During Deployment</title>
		<link>http://www.gregheidorn.com/wordpress/2008/08/25/outofmemory-errors-during-deployment/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/08/25/outofmemory-errors-during-deployment/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 13:21:48 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Web Development]]></category>

		<category><![CDATA[WebSphere]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=43</guid>
		<description><![CDATA[Some development teams I work with have been reporting an issue where the JVM runs out of memory during deployment of an application using our standard heap size settings (initial 2 GB and maximum 2 GB). When they changed the initial heap size from 2 GB to 512 MB, the no longer receive the OutOfMemory [...]]]></description>
			<content:encoded><![CDATA[<p>Some development teams I work with have been reporting an issue where the JVM runs out of memory during deployment of an application using our standard heap size settings (initial 2 GB and maximum 2 GB). When they changed the initial heap size from 2 GB to 512 MB, the no longer receive the OutOfMemory error. To understand what&#8217;s happening, continue on.<span id="more-46"></span></p>
<p><strong>Issue Details</strong><br />
The garbage collection logs tell the story.</p>

<div class="wp_syntax"><div class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #339933;">&amp;</span>lt;AF<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span> Allocation Failure. <span style="color: #006633;">need</span> <span style="color: #cc66cc;">67108880</span> bytes, <span style="color: #cc66cc;">297</span> ms since last AF<span style="color: #339933;">&amp;</span>gt;
<span style="color: #339933;">&amp;</span>lt;AF<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span> managing allocation failure, action<span style="color: #339933;">=</span><span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1727452832</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2147482112</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>gt;
<span style="color: #cc66cc;">19</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">41</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">58.409</span> 0x80e573c 0046F0   <span style="color: #339933;">-</span>   GC<span style="color: #009900;">&#40;</span>VFY<span style="color: #339933;">-</span>SUM<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> pinned<span style="color: #339933;">=</span><span style="color: #cc66cc;">33731</span><span style="color: #009900;">&#40;</span>classes<span style="color: #339933;">=</span><span style="color: #cc66cc;">32384</span><span style="color: #339933;">/</span>freeclasses<span style="color: #339933;">=</span>0<span style="color: #009900;">&#41;</span> dosed<span style="color: #339933;">=</span><span style="color: #cc66cc;">5180</span> movable<span style="color: #339933;">=</span><span style="color: #cc66cc;">6205831</span> free<span style="color: #339933;">=</span><span style="color: #cc66cc;">3549</span>
<span style="color: #cc66cc;">19</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">41</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">58.409</span> 0x80e573c 0046F1   <span style="color: #339933;">-</span>   GC<span style="color: #009900;">&#40;</span>VFY<span style="color: #339933;">-</span>SUM<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> freeblocks<span style="color: #339933;">:</span> max<span style="color: #339933;">=</span><span style="color: #cc66cc;">34664504</span> ave<span style="color: #339933;">=</span><span style="color: #cc66cc;">491688</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1745002528</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">3549</span><span style="color: #009900;">&#41;</span>
<span style="color: #cc66cc;">19</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">42</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">00.241</span> 0x80e573c 0046F7   <span style="color: #339933;">-</span>   GC<span style="color: #009900;">&#40;</span>VFYAC<span style="color: #339933;">-</span>SUM<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> freeblocks<span style="color: #339933;">:</span> max<span style="color: #339933;">=</span><span style="color: #cc66cc;">53984992</span> ave<span style="color: #339933;">=</span><span style="color: #cc66cc;">1500426</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1744996176</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">1163</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">&amp;</span>lt;GC<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">36</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> mark stack overflow<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">72</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&amp;</span>gt;
<span style="color: #339933;">&amp;</span>lt;GC<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">36</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> GC cycle started Wed Jun <span style="color: #cc66cc;">25</span> <span style="color: #cc66cc;">19</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">42</span><span style="color: #339933;">:</span>00 <span style="color: #cc66cc;">2008</span>
<span style="color: #339933;">&amp;</span>lt;GC<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">36</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> freed <span style="color: #cc66cc;">17541296</span> bytes, <span style="color: #cc66cc;">81</span><span style="color: #339933;">%</span> free <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1744994128</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2147482112</span><span style="color: #009900;">&#41;</span>, in <span style="color: #cc66cc;">2620</span> ms<span style="color: #339933;">&amp;</span>gt;
<span style="color: #339933;">&amp;</span>lt;GC<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">36</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> mark<span style="color: #339933;">:</span> <span style="color: #cc66cc;">399</span> ms, sweep<span style="color: #339933;">:</span> <span style="color: #cc66cc;">25</span> ms, compact<span style="color: #339933;">:</span> <span style="color: #cc66cc;">2196</span> ms<span style="color: #339933;">&amp;</span>gt;
<span style="color: #339933;">&amp;</span>lt;GC<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">36</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> refs<span style="color: #339933;">:</span> soft <span style="color: #cc66cc;">309</span> <span style="color: #009900;">&#40;</span>age <span style="color: #339933;">&amp;</span>gt;= <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span>, weak 0, <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #cc66cc;">9</span>, phantom 0<span style="color: #339933;">&amp;</span>gt;
<span style="color: #339933;">&amp;</span>lt;GC<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">36</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> moved <span style="color: #cc66cc;">1180447</span> objects, <span style="color: #cc66cc;">67685368</span> bytes, reason<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">&amp;</span>gt;
<span style="color: #339933;">&amp;</span>lt;AF<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span> managing allocation failure, action<span style="color: #339933;">=</span><span style="color: #cc66cc;">3</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1744994128</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2147482112</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>gt;
<span style="color: #339933;">&amp;</span>lt;AF<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span> managing allocation failure, action<span style="color: #339933;">=</span><span style="color: #cc66cc;">4</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1744994128</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2147482112</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>gt;
<span style="color: #339933;">&amp;</span>lt;AF<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">32</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span> clearing all remaining soft refs<span style="color: #339933;">&amp;</span>gt;</pre></div></div>

<p>The JVM requests a block of 67,108,880 bytes and the heap reports that it&#8217;s largest contiguous block of free memory is 53,984,992 bytes. This allocation failure forces the JVM to report that the heap is out of memory, even though the total space indicates 81% free.</p>
<p><a href='http://www.gregheidorn.com/wordpress/wp-content/uploads/2008/08/figure1.png'><img src="http://www.gregheidorn.com/wordpress/wp-content/uploads/2008/08/figure1.png" alt="Figure 1" title="figure1" width="500" height="221" class="alignnone size-full wp-image-52" style="border:1px solid #cacaca" /></a></p>
<p>Generally the scenario of the deployment is that the JVM has been up for a period of time (days, weeks) and during the time, data is written all over the 2 GB allocated. After this period of time, logic tells us that the heap&#8217;s largest free, contiguous block of memory is at it&#8217;s smallest size. Knowing this, it makes it a less than desirable time to try to write large blocks of memory to the heap. Chances are the blocks aren&#8217;t large enough after being chopped and used over and over.</p>
<p><strong>Solution</strong></p>
<p>The change in heap settings is a valid work-around for this issue.</p>
<p><a href='http://www.gregheidorn.com/wordpress/wp-content/uploads/2008/08/figure2.png'><img src="http://www.gregheidorn.com/wordpress/wp-content/uploads/2008/08/figure2.png" alt="Figure 2" title="figure2" class="alignnone size-full wp-image-49" style="border:1px solid #cacaca" /></a></p>
<p>By reducing the initial heap size, we are keeping a chunk of memory pristine and unused. This JVM has an action it can take when it encounters the allocation failure scenario we described in figure 2. Rather than declare the heap out of memory, the JVM can try to expand the heap in order to write the requested block of 67 MB.</p>
<p><a href='http://www.gregheidorn.com/wordpress/wp-content/uploads/2008/08/figure3.png'><img src="http://www.gregheidorn.com/wordpress/wp-content/uploads/2008/08/figure3.png" alt="Figure 3" title="figure3" class="alignnone size-full wp-image-50" style="border:1px solid #cacaca" /></a></p>
<p>The total amount expanded depends on an algorithm, so the example 100 MB here is for illustration purposes only. The allocation failure may even trigger multiple expansions, should the algorithm produce an expansion number less than required by the size of the requested block. Once the expansion can handle the requested size, the allocation can occur.</p>
<p><a href='http://www.gregheidorn.com/wordpress/wp-content/uploads/2008/08/figure4.png'><img src="http://www.gregheidorn.com/wordpress/wp-content/uploads/2008/08/figure4.png" alt="Figure 4" title="figure4" class="alignnone size-full wp-image-51" style="border:1px solid #cacaca" /></a></p>
<p><strong>Summary</strong></p>
<p>The deployment team has two options to potentially avoid this issue:</p>
<ol>
<li>Change the initial heap size from 2 GB to 512 MB or 1 GB and restart the JVM.</li>
<li>Restart the JVM prior to deploying, in order to clear the heap (not guaranteed since the JVM could use a funky allocation strategy for the objects generated during server start-up and application allocation).</li>
</ol>
<p>The application team should analyze the contents of their deployment files to ensure only the bare minimum amount of files are deployed in order to keep the deployment file sizes as low as possible. Common file clutter includes source control files (.pj files from MKS), source code (.java files) in .jar files and project documentation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/08/25/outofmemory-errors-during-deployment/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Understanding Sorting Algorithms</title>
		<link>http://www.gregheidorn.com/wordpress/2008/08/13/understanding-sorting-algorithms/</link>
		<comments>http://www.gregheidorn.com/wordpress/2008/08/13/understanding-sorting-algorithms/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 14:26:23 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.gregheidorn.com/wordpress/?p=41</guid>
		<description><![CDATA[Chris Coyier found a great visualization of sorting algorithms created by David R. Martin, an Assistant Professor at Boston College.  If you&#8217;re new to sorting algorithms and Big O notation, check out the textbooks he references in addition to enjoying the fantastic visual representation.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.css-tricks.com">Chris Coyier</a> found <a href="http://vision.bc.edu/~dmartin/teaching/sorting/anim-html/all.html">a great visualization of sorting algorithms</a> created by <a href="http://vision.bc.edu/~dmartin/">David R. Martin</a>, an Assistant Professor at Boston College.  If you&#8217;re new to sorting algorithms and Big O notation, check out the textbooks he references in addition to enjoying the fantastic visual representation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gregheidorn.com/wordpress/2008/08/13/understanding-sorting-algorithms/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
