<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7444824863795696972</id><updated>2011-08-18T00:47:21.046-07:00</updated><category term='Analyzing Threads'/><category term='Garbage Collection'/><category term='LoadRunner'/><category term='IBM ISA'/><title type='text'>Website Performance Testing</title><subtitle type='html'>with LoadRunner, SiteScope, Solaris, WebSphere, JSWS/IPlanet and Java</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wperf.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wperf.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>T</name><uri>http://www.blogger.com/profile/01330035697440138900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7444824863795696972.post-6383881270668198896</id><published>2008-10-04T16:36:00.000-07:00</published><updated>2008-10-04T17:51:58.303-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LoadRunner'/><title type='text'>Using SQL Server 2008 Express with LoadRunner Analysis</title><content type='html'>After trying several methods to avoid having LoadRunner's Analysis run out of memory with large files, which I will share in another post, I finally broke down and decided to install SQL Server. I saw a post on the internet that said not to use the SQL version 7 that came with the LoadRunner CD for version 7.8 and use MSDE 2000. That was obviously a very old article. :) I found other articles in which people failed to get LoasRunner to work with the latest SQL server version with no solution. Hopefully, this article helps resolve some of the issues people ran into. I, for one, wouldn't have figured out some of the obstacles without the help of a SQL guru. For the installation I used the latest LoadRunner 9.1 and SQL Server Express 2008.  &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Why should you use SQL Server?&lt;/h2&gt;&lt;br /&gt;From HP's help:&lt;br /&gt;"If your Analysis result data exceeds two gigabytes, it is recommended that you store it on an SQL server or MSDE machine."&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Installing SQL Server&lt;/h2&gt;&lt;br /&gt;Before you install SQL Server Express, you must first install the following:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=AB99342F-5D1A-413D-8319-81DA479AB0D7&amp;displaylang=en"&gt;.Net Framework 3.5 SP1&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://support.microsoft.com/kb/942288"&gt;Windows Installer 4.5&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx"&gt;PowerShell 1.0&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Once installed, you should install &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B5D1B8C3-FDA5-4508-B0D0-1311D670E336&amp;displaylang=en"&gt;SQL Server 2008 Express with Advanced Services&lt;/a&gt;. This comes with Management Studio which we will make use of.&lt;br /&gt;&lt;br /&gt;When installing SQL Server make sure to install the two items highlighted in red:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SOgCCLY3aqI/AAAAAAAAAFk/LyQ0dTJkF3E/s1600-h/Sql_server_express2.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SOgCCLY3aqI/AAAAAAAAAFk/LyQ0dTJkF3E/s320/Sql_server_express2.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253451201767762594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once installed to see if your installation is working, open up a command window and type the following (assuming you names your instance SQLEXPRESS):&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\blah&gt;sqlcmd -S (local)\SQLEXPRESS&lt;br /&gt;1&gt;&lt;br /&gt;&lt;br /&gt;If you see the 1&gt;, this means that your instance is working. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Configuring Analysis&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Go into Analysis and go to Tools &gt; Options &gt; Database&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SOgDReE66jI/AAAAAAAAAFs/LrhDW-VJ2aQ/s1600-h/Sql_server_express8.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SOgDReE66jI/AAAAAAAAAFs/LrhDW-VJ2aQ/s320/Sql_server_express8.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253452563994044978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; Select "SQL Server/MSDE".&lt;br /&gt;&lt;li&gt; For a server name, enter: [machine name]\[DB instance name]. (This isn't fully detailed in the HP help. It might be obvious to those who have installed SQL Server before, but it took me awhile to figure this out. You instance name will most likely be SQLEXPRESS. I appended a 2 when installing since I had a previous version of SQL installed which had taken that name.)&lt;br /&gt;&lt;li&gt; Select "Use Windows Integrated Security"&lt;br /&gt;&lt;li&gt; Click "Test Parameters," you should be able to see the following: &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SOgD36F3FHI/AAAAAAAAAF0/cEjptMckRlc/s1600-h/Sql_server_express7.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SOgD36F3FHI/AAAAAAAAAF0/cEjptMckRlc/s320/Sql_server_express7.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253453224349209714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hopefully, "Connection parameters" now works. We'll now tackle the "Shared server directory exists on server.", "Write permissions on shared server directory." and the "Synchronizing shared and physical server directories."&lt;br /&gt;&lt;br /&gt;Whether the above works or not, go to the Windows Start button &gt; Programs &gt; Microsoft SQL Server 2008 &gt; SQL Server Management Studio. You'll be presented with a screen which should look like: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_iNp-a60zjXU/SOgFLrQy-xI/AAAAAAAAAF8/YAcYuO1nCac/s1600-h/Sql_server_express9.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_iNp-a60zjXU/SOgFLrQy-xI/AAAAAAAAAF8/YAcYuO1nCac/s320/Sql_server_express9.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253454663477558034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If your Server name in the config didn't work above and doesn't match the one shown when you see the screen above, try using that one. If it did work, hit connect. Expand out the databases and highlight master. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgF9Z7MIEI/AAAAAAAAAGE/cifM_nXBf20/s1600-h/Sql_server_express10.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgF9Z7MIEI/AAAAAAAAAGE/cifM_nXBf20/s320/Sql_server_express10.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253455517816987714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Right-click and go to properties. Select files and copy the path name: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgGK2Nm3jI/AAAAAAAAAGM/ovgVc1OM5Oc/s1600-h/Sql_server_express11.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgGK2Nm3jI/AAAAAAAAAGM/ovgVc1OM5Oc/s320/Sql_server_express11.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253455748748729906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Go to the path in Explorer and share the Data directory. Do this by right-clicking on the folder and going to properties then Sharing. Input a name, then click Permissions. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgGzNipWDI/AAAAAAAAAGU/50xxqrJD64Y/s1600-h/Sql_server_express12.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgGzNipWDI/AAAAAAAAAGU/50xxqrJD64Y/s320/Sql_server_express12.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253456442205755442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In permissions, give everyone full access. I do this just in case. I hate nitpicking with permissions to things.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgHR_TecgI/AAAAAAAAAGc/ZJBFDYVU4Rw/s1600-h/Sql_server_express13.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgHR_TecgI/AAAAAAAAAGc/ZJBFDYVU4Rw/s320/Sql_server_express13.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253456970959974914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Your directory should have a little hand on it now: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SOgHiFNmjsI/AAAAAAAAAGk/8kjL2rUywXQ/s1600-h/Sql_server_express14.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SOgHiFNmjsI/AAAAAAAAAGk/8kjL2rUywXQ/s320/Sql_server_express14.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253457247423860418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Double check to see if it is shared by going to \\[machine name]\[share name]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SOgHtN33OGI/AAAAAAAAAGs/g99YznlFV4Q/s1600-h/Sql_server_express15.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SOgHtN33OGI/AAAAAAAAAGs/g99YznlFV4Q/s320/Sql_server_express15.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253457438727157858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Go back to Analysis and input the shared directory we just set up for "Logical Storage Location" along with the original directory for the physical storage location. Test the parameters again. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgJTnrrxRI/AAAAAAAAAG0/qWMq5jM17DU/s1600-h/Sql_server_express6.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgJTnrrxRI/AAAAAAAAAG0/qWMq5jM17DU/s320/Sql_server_express6.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253459198002054418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you get an error on "Synchronizing shared and physical server directories." . Right-click on "My Computer" and select manage. under System Tools &gt; Event Viewer &gt; Application. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SOgJtLarhhI/AAAAAAAAAG8/nwP-pGamHPk/s1600-h/Sql_server_express18.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SOgJtLarhhI/AAAAAAAAAG8/nwP-pGamHPk/s320/Sql_server_express18.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253459637091141138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Look for any MSSQL messages. If you see the following: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgMRRvov0I/AAAAAAAAAHE/PMDJEmIlTp0/s1600-h/Sql_server_express17.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgMRRvov0I/AAAAAAAAAHE/PMDJEmIlTp0/s320/Sql_server_express17.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253462456288198466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This issue is described on &lt;a href="http://msdn.microsoft.com/en-us/library/ms190693.aspx"&gt;Microsoft's site&lt;/a&gt;. Go back to Management Studio, click "New Query" and enter in the following:&lt;br /&gt;&lt;br /&gt;-- To allow advanced options to be changed.&lt;br /&gt;EXEC sp_configure 'show advanced options', 1&lt;br /&gt;GO&lt;br /&gt;-- To update the currently configured value for advanced options.&lt;br /&gt;RECONFIGURE&lt;br /&gt;GO&lt;br /&gt;-- To enable the feature.&lt;br /&gt;EXEC sp_configure 'xp_cmdshell', 1&lt;br /&gt;GO&lt;br /&gt;-- To update the currently configured value for this feature.&lt;br /&gt;RECONFIGURE&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SOgM3it4sQI/AAAAAAAAAHM/a-vDq1HOt4k/s1600-h/Sql_server_express19.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SOgM3it4sQI/AAAAAAAAAHM/a-vDq1HOt4k/s320/Sql_server_express19.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253463113679286530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hit the "! Execute" button.&lt;br /&gt;&lt;br /&gt;Hopefully, this fixes the issue and you are able to save the Analysis configuration. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Opening a file&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;When opening a file, you may run into an issue where after opening results half way through, it hangs.&lt;br /&gt;&lt;br /&gt;Check the Event Viewer again:&lt;br /&gt;&lt;br /&gt;If you see the following: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgN-3HOgjI/AAAAAAAAAHU/XSjjap5tBBM/s1600-h/Sql_server_express16.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgN-3HOgjI/AAAAAAAAAHU/XSjjap5tBBM/s320/Sql_server_express16.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253464338924995122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Create a new query in Management Studio with the following (changing 'user' to your login) and hit the "! Execute" button.:&lt;br /&gt;&lt;br /&gt;EXEC sp_grantlogin 'Domain\user'&lt;br /&gt;&lt;br /&gt;Then change it to the following (changing 'user' to your login) and hit the "! Execute" button.:&lt;br /&gt;&lt;br /&gt;EXEC sp_grantdbaccess 'Domain\user', user&lt;br /&gt;&lt;br /&gt;Hopefully this allows you to open up the file now. This will now allow Analysis to be a bit more stable.&lt;br /&gt;&lt;br /&gt;However, it still won't totally solve Analysis's out of memory issues if you set the granularity to really low (1 second) for a long run.: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgOl57OcAI/AAAAAAAAAHc/fAftOoYYjqU/s1600-h/Sql_server_express5.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SOgOl57OcAI/AAAAAAAAAHc/fAftOoYYjqU/s320/Sql_server_express5.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5253465009694863362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Deleting the results&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;When Analysis closes, it will delete the table from the database. If not, you can delete the table from the management studio by right-clicking on the table and selecting Delete. I do not recommend deleting the physical file from Explorer directly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444824863795696972-6383881270668198896?l=wperf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wperf.blogspot.com/feeds/6383881270668198896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444824863795696972&amp;postID=6383881270668198896' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/6383881270668198896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/6383881270668198896'/><link rel='alternate' type='text/html' href='http://wperf.blogspot.com/2008/10/using-sql-server-2008-express-with.html' title='Using SQL Server 2008 Express with LoadRunner Analysis'/><author><name>T</name><uri>http://www.blogger.com/profile/01330035697440138900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_iNp-a60zjXU/SOgCCLY3aqI/AAAAAAAAAFk/LyQ0dTJkF3E/s72-c/Sql_server_express2.PNG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444824863795696972.post-7066777624839981453</id><published>2008-09-20T05:32:00.000-07:00</published><updated>2008-09-20T06:55:12.318-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analyzing Threads'/><title type='text'>Analyzing Java Thread Dumps with Thread Analyzer</title><content type='html'>&lt;h2&gt;What is the purpose of a thread dump?&lt;/h2&gt;&lt;br /&gt;A thread dump will log what the current process' threads are working on at the time of the dump. If your  application is hung or behaving improperly, it will allow you to diagnose the issue.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How do I do a thread dump?&lt;/h2&gt;&lt;br /&gt;To execute a thread dump, do a "kill -3" on the pid. The information will get dumped to the native_stdout.log file just like the garbage collection data. It's good to to several heap dumps over a couple of minutes. The more data you can collect, the easier it will be to diagnose. The thread data in the native_stdout.log will look something like this:&lt;br /&gt;&lt;br /&gt;"WebContainer : 2" daemon prio=10 tid=0x01def5e8 nid=0xc7 runnable [0x879fe000..0x879ff8f0]&lt;br /&gt; at java.util.regex.Pattern$BnM.match(Pattern.java:5447) &lt;br /&gt; at java.util.regex.Matcher.search(Matcher.java:1092)&lt;br /&gt; at java.util.regex.Matcher.find(Matcher.java:528)&lt;br /&gt;"Thread-58" daemon prio=10 tid=0x0041bd28 nid=0x93 waiting on condition [0x880ff000..0x880ffaf0]&lt;br /&gt; at java.lang.Thread.sleep(Native Method)&lt;br /&gt; at org.apache.commons.pool.impl.GenericObjectPool$Evictor.run(GenericObjectPool.java:1080)&lt;br /&gt; at java.lang.Thread.run(Thread.java:595)&lt;br /&gt;"Thread-56" daemon prio=10 tid=0x03dbfcc0 nid=0x91 waiting on condition [0x87cff000..0x87cff9f0]&lt;br /&gt; at java.lang.Thread.sleep(Native Method)&lt;br /&gt; at org.apache.commons.pool.impl.GenericObjectPool$Evictor.run(GenericObjectPool.java:1080)&lt;br /&gt; at java.lang.Thread.run(Thread.java:595)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Since your process can contain hundreds of threads, looking at the result can be a mess. In walks "Thread Analyzer" ...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;IBM's Thread Analyzer&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Thread Analyzer is another add-on just like the &lt;a href="http://wperf.blogspot.com/2008/09/graphing-garbage-collection-part-2.html"&gt;memory visualizer&lt;/a&gt; which will organize and graphically display the thread information. To see how to install it, go to &lt;a href="http://wperf.blogspot.com/2008/08/installing-ibms-isa-and-performance.html"&gt;Installing IBM Support Assistant and performance tools&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Once installed ...&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Open Thread Analyzer&lt;/h3&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SNTxA50c8BI/AAAAAAAAAEc/2lKApfJKkdA/s1600-h/ISA_Analyze1.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SNTxA50c8BI/AAAAAAAAAEc/2lKApfJKkdA/s320/ISA_Analyze1.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5248084463616585746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click "Analyze Problem"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SNTxj-3b0qI/AAAAAAAAAEk/zKIdFHpSeFU/s1600-h/ISA_Tool_Add-ons4.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SNTxj-3b0qI/AAAAAAAAAEk/zKIdFHpSeFU/s320/ISA_Tool_Add-ons4.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5248085066266694306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next, select the Tools tab, highlight the Thread Analyzer Tool and click Launch &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SNT0Kn25WXI/AAAAAAAAAE0/mVMjGXBziSs/s1600-h/ISA_Tool_Add-ons12.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SNT0Kn25WXI/AAAAAAAAAE0/mVMjGXBziSs/s320/ISA_Tool_Add-ons12.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5248087929128573298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you did multiple thread dumps, you will see several dumps to chose from. The most interesting ones are the ones where "Monitor" is something other than "No Info."&lt;br /&gt;&lt;br /&gt;To see what the application was doing over time, go to: "Analysis" &gt; "Compare Threads" &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_iNp-a60zjXU/SNT1WZjbtnI/AAAAAAAAAE8/R4PM-U3if3g/s1600-h/ISA_Tool_Add-ons11.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_iNp-a60zjXU/SNT1WZjbtnI/AAAAAAAAAE8/R4PM-U3if3g/s320/ISA_Tool_Add-ons11.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5248089230958900850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here you can see that objects in wait like "DefaultQuartzScheduler_Worker-4" will sit waiting for an event to occur, execute then go back to waiting. You'll understand what the icons mean when we take a look at ...&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Diagnosing an issue&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Let's go back to the "Thread Dump List" and select a thread dump with a monitor other than "No Info" then click the first sprocket after the red X. You'll see something like:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SNT3ixn0L-I/AAAAAAAAAFE/kcDtNT_Nl74/s1600-h/ISA_Tool_Add-ons6.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SNT3ixn0L-I/AAAAAAAAAFE/kcDtNT_Nl74/s320/ISA_Tool_Add-ons6.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5248091642601418722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On the right, you can see a break down of the icons we saw in the previous image. If a application is healthy, you'll normally see items in Object.wait, "Waiting on condition" and Runnable. If you at some of the threads with a "Waiting on Condition," you will most likely see things are either sleeping (thread.sleep), waiting (object.wait) or parking a lock to a non-busy state (Unsafe.park). I'm not sure why they don't get categorized into any of the other states.&lt;br /&gt;&lt;br /&gt;I've yet to run into an example where the application was deadlocked or blocked, most of the issues I've seen have been like the one above where the app was caught up waiting on a monitor like the one above.&lt;br /&gt;&lt;br /&gt;To see what the monitors are waiting on, highlight on of the Waiting stated on the left:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SNT7GgygyII/AAAAAAAAAFM/z955UpQRbbg/s1600-h/ISA_Tool_Add-ons7_1.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SNT7GgygyII/AAAAAAAAAFM/z955UpQRbbg/s320/ISA_Tool_Add-ons7_1.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5248095555093055618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here you can see it is being blocked by container 14. If we go look at 14:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_iNp-a60zjXU/SNT7eD88siI/AAAAAAAAAFU/_CJr_zf7VM8/s1600-h/ISA_Tool_Add-ons8.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_iNp-a60zjXU/SNT7eD88siI/AAAAAAAAAFU/_CJr_zf7VM8/s320/ISA_Tool_Add-ons8.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5248095959669060130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can see that 14 is blocking all the monitors and is stuck trying to read an item from a socket. As a performance tester, I can't take you to the next step of looking at the Java code to figure out what is wrong since it is a slightly gray box to me. However, if you present development with this information, it should make it easier for them to diagnose the issue.&lt;br /&gt;&lt;br /&gt;As a side note, we could have also gotten to this point a little quicker by going to "Analysis" &gt; "Monitor Detail":&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SNT9NDyD3CI/AAAAAAAAAFc/zbhK5Te_LQ0/s1600-h/ISA_Tool_Add-ons13_1.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SNT9NDyD3CI/AAAAAAAAAFc/zbhK5Te_LQ0/s320/ISA_Tool_Add-ons13_1.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5248097866588871714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Things of note&lt;/h2&gt;&lt;br /&gt;Myself as well as &lt;a href="http://www.alphaworks.ibm.com/tech/jca/forum"&gt;others&lt;/a&gt; have been unable to get the output report function of the tool which has to be done from the command line to work (see the help pull down in the tool). To give development a report, we usually copy and paste the Thread Summary into Word or take snapshots of notable items. If anyone figures this out, let me know. :)&lt;br /&gt;&lt;br /&gt;There is another way to do heap dumps using jmap, but I've yet to try this out and heard it might work so good with jvms prior to 1.6.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Reference Links&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://www.alphaworks.ibm.com/tech/jca"&gt;IBM's site for Thread and Monitor Dump Analyzer for Java&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www-1.ibm.com/support/docview.wss?uid=swg27011855&amp;aid=1"&gt;PDF document on Thread Analyzer&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444824863795696972-7066777624839981453?l=wperf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wperf.blogspot.com/feeds/7066777624839981453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444824863795696972&amp;postID=7066777624839981453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/7066777624839981453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/7066777624839981453'/><link rel='alternate' type='text/html' href='http://wperf.blogspot.com/2008/09/analyzing-java-thread-dumps-with-thread.html' title='Analyzing Java Thread Dumps with Thread Analyzer'/><author><name>T</name><uri>http://www.blogger.com/profile/01330035697440138900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_iNp-a60zjXU/SNTxA50c8BI/AAAAAAAAAEc/2lKApfJKkdA/s72-c/ISA_Analyze1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444824863795696972.post-428446640388573176</id><published>2008-09-16T06:16:00.000-07:00</published><updated>2008-09-20T07:11:15.475-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM ISA'/><category scheme='http://www.blogger.com/atom/ns#' term='Garbage Collection'/><title type='text'>Graphing Java Garbage Collection part 2: Making and analyzing graphs</title><content type='html'>&lt;a href="http://wperf.blogspot.com/2008/08/graphing-garbage-collection-part-1.html"&gt;Graphing Garbage Collection part 1 - using IBM's Memory Visualizer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What to look for&lt;/h2&gt;&lt;br /&gt;There are a few basic things to look for in the GC data.:&lt;br /&gt;1)Does the graph look weird? Your memory should look like our first graph below: moving up and down as GC takes place. The moving of the total heap is a new thing with WebSphere 6.1.&lt;br /&gt;2)Durations should never be more than 2.5 seconds. If they are, you should look at selecting a different type of GC or adding more threads to the current GC.&lt;br /&gt;3)After heap collection should not trend up. With the latest version of the tool (as of last week), they have added a "Used Heap (after global collection)" option under "VGC Heap Data" to make this more clear.&lt;br /&gt;4)Frequency of Full GCs and tuning. These are the big drops in the before and after heap. Since they take the longest time to happen, they should not happen several times a minute. Also if you are running a 24 hour longevity, you should have several GCs occur, otherwise the heap size it too high. Below you will also see other indications.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Standard Graphs &lt;/h2&gt;&lt;br /&gt;When analyzing Garbage Collection, there are two main graphs I like to do. The overall heap and duration. &lt;br /&gt;&lt;br /&gt;Once you've &lt;a href="http://wperf.blogspot.com/2008/08/graphing-garbage-collection-part-1.html"&gt;opened&lt;/a&gt; up your GC file. Go under "VGC Heap Data" and select: "Heap size" and both "Used heap" options:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SM-y6McTQbI/AAAAAAAAAA4/ZvEmE12_Wk0/s1600-h/ISA_heap_options.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SM-y6McTQbI/AAAAAAAAAA4/ZvEmE12_Wk0/s320/ISA_heap_options.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5246608803752001970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For the duration graph, clear out the selections and select "Pause times" under "VGC Pause Data":&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SM-zlT23jBI/AAAAAAAAABA/h-jVIFINO2s/s1600-h/ISA_duration.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SM-zlT23jBI/AAAAAAAAABA/h-jVIFINO2s/s320/ISA_duration.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5246609544476855314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;More detailed graphs&lt;/h2&gt;&lt;br /&gt;The standard graphs are pretty good for identifying basic issues but the real power of the tool is the ability to show all three types of memory.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Overall:&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SM-0uTU3_JI/AAAAAAAAABI/874s7_dEDNo/s1600-h/Heap_nosize.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SM-0uTU3_JI/AAAAAAAAABI/874s7_dEDNo/s320/Heap_nosize.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5246610798464728210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Nursery or Young (I've kept the total heap in the graph so the scales are comparable):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SM-1VVU6itI/AAAAAAAAABQ/CrDUCL9JDYs/s1600-h/Heap_nosize2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SM-1VVU6itI/AAAAAAAAABQ/CrDUCL9JDYs/s320/Heap_nosize2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5246611469016664786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tenured (I've kept the total heap in the graph so the scales are comparable):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SM-1jrP0FKI/AAAAAAAAABY/yt1t641Gyf4/s1600-h/Heap_nosize3.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SM-1jrP0FKI/AAAAAAAAABY/yt1t641Gyf4/s320/Heap_nosize3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5246611715419018402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Permanent(I've kept the total heap in the graph so the scales are comparable):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SM-1u1QQRqI/AAAAAAAAABg/bTzVywrce5I/s1600-h/Heap_nosize4.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SM-1u1QQRqI/AAAAAAAAABg/bTzVywrce5I/s320/Heap_nosize4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5246611907083781794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From the graphs, you can see there is no leak happening but it still looks kind of strange. This is due to the compaction going on in the JVM. It is actually tuning itself with WebSphere 6.1. If you look at the graphs, you can see that permanent memory never grows but its total size was set many times above what its actual usage was. This could easily be tuned to use less. The tenured is also set much higher and could also be trimmed.&lt;br /&gt;&lt;br /&gt;Now that you've seen some graphs with no or minor issue, we'll see what a bad one looks like. Here you can see the Tenured heap rise until it hits its max after several hours, then you can see the durations jump up to over 18 seconds! If you look at the logs, you should also see an Out Of Memory message.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SM--k2JEibI/AAAAAAAAABw/XGhL0cYY-MA/s1600-h/GC_outofmemory_heap.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SM--k2JEibI/AAAAAAAAABw/XGhL0cYY-MA/s320/GC_outofmemory_heap.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5246621631128046002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Reports&lt;/h2&gt;&lt;br /&gt;Another nice thing about this tool is the reports and analysis that is does. If you go to the report tab, you can see a report of all the options you have selected from "VGC Pause Data", "VGC Data", "VGC Heap Data." This is a good report to hand out since it is east to generate, but doesn't show the overlapping of any of the graphs like we did above. So if you are trying to illustrate a point, I would output the images from above by right clicking the graph and saving them as an image. To output the report, right click on it and select save. This will be saved as an HTML files with images. Make sure to put it in a new folder or the files will clutter which ever folder you pick. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_iNp-a60zjXU/SM-8xRz87gI/AAAAAAAAABo/_C3ZN1xWKAA/s1600-h/GC_report.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_iNp-a60zjXU/SM-8xRz87gI/AAAAAAAAABo/_C3ZN1xWKAA/s320/GC_report.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5246619645690834434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Tips&lt;/h2&gt;&lt;br /&gt;* Clear the nativestdout files before running your test or you will need to adjust the time scale&lt;br /&gt;* To zoom in, time in times on the right (do not try to zoom since it will most likely show a blank graph and might freeze up)&lt;br /&gt;* The time won't be clock time, it will be based on the time the server started. You can only adjust the scale such as ms, seconds or days. &lt;br /&gt;* If you see a funny graph with crisscross lines like the following:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SM_AGM98U8I/AAAAAAAAAB4/MQQa_RnTgKA/s1600-h/GC_restart.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SM_AGM98U8I/AAAAAAAAAB4/MQQa_RnTgKA/s320/GC_restart.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5246623303702696898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is most likely due to the app being recycled. Turn on "JVM Restarts" under "VGCData." You will be able to see when or if the app was recycled. Also, if you do thread dumps during the run, this can cause issues. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iNp-a60zjXU/SM_AqO6cejI/AAAAAAAAACA/H5i_1Bxhs1s/s1600-h/GC_restart2.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_iNp-a60zjXU/SM_AqO6cejI/AAAAAAAAACA/H5i_1Bxhs1s/s320/GC_restart2.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5246623922700188210" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444824863795696972-428446640388573176?l=wperf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wperf.blogspot.com/feeds/428446640388573176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444824863795696972&amp;postID=428446640388573176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/428446640388573176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/428446640388573176'/><link rel='alternate' type='text/html' href='http://wperf.blogspot.com/2008/09/graphing-garbage-collection-part-2.html' title='Graphing Java Garbage Collection part 2: Making and analyzing graphs'/><author><name>T</name><uri>http://www.blogger.com/profile/01330035697440138900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_iNp-a60zjXU/SM-y6McTQbI/AAAAAAAAAA4/ZvEmE12_Wk0/s72-c/ISA_heap_options.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444824863795696972.post-5063220388274477856</id><published>2008-08-24T04:33:00.000-07:00</published><updated>2008-09-20T07:11:27.280-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM ISA'/><category scheme='http://www.blogger.com/atom/ns#' term='Garbage Collection'/><title type='text'>Graphing Java Garbage Collection part 1 - using IBM's Memory Visualizer</title><content type='html'>Graphing Garbage Collection (GC) has always been tough. Since you need to see each entry, SiteScope is useless do to its periodic collection method. In fact, there are very few tools which will analyze it and even fewer which will graph it out. For the past few years, myself as well as many others have come up with custom tools to do this parsing and report generation. However, it is difficult to find the time to maintain the scripts. When the transition to WebSphere 6.1 broke all our automation ... again, it was time to look around again to see if there was another tool.&lt;br /&gt;&lt;br /&gt;It had been awhile since I had looked at IBM's tool. I think the initial version (it might have even been a different tool) only parsed IBM's JVM and didn't parse Sun's (IBM's version of Java on Solaris is just Sun's with an additional library vs. a totally different version for Z/OS). A few years and versions later I remember having to load a library depending on what version of WebSphere I had (this could have also been a different tool). This was again cumbersome and since my automation worked well, I didn't pay much attention to it.&lt;br /&gt;&lt;br /&gt;Now we have IBM's ISA version 4 and MV version 2. The tool is still quirky (after all it is written in Java), but it is by far the best (only?) tool I've seen that can parse and graph GC data for Sun's JVM. Hopefully this post will help navigate you through its quirkiness so you can overlook its obvious design faults.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you've never analyzed GC Data before:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make sure the JVM has the following arguments set: -XX:+PrintGCTimeStamp -XX:+PrintGCDetails. This prints out a timestamp for each GC based off of when the server was started (yeah, I know this is weird, but there is no option to do system time) and the details of the three generations of memory&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Download the nativestdout.log from your app server. This is where all the data from the settings will be dumped out to.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;First &lt;a href="http://wperf.blogspot.com/2008/08/installing-ibms-isa-and-performance.html"&gt;Install IBM's ISA Tool&lt;/a&gt; and the accompanying Add-on for the Memory Visualizer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Open up ISA:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_iNp-a60zjXU/SLFNNu3RKXI/AAAAAAAAAAg/9wtSM1m1PB8/s1600-h/ISA_Analyze1.PNG"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_iNp-a60zjXU/SLFNNu3RKXI/AAAAAAAAAAg/9wtSM1m1PB8/s320/ISA_Analyze1.PNG" alt="" id="BLOGGER_PHOTO_ID_5238052739922078066" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Click: Analyze Problem&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SLFQo5SFx0I/AAAAAAAAAAo/CJbLMnbL5N0/s1600-h/ISA_Analyze2.PNG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SLFQo5SFx0I/AAAAAAAAAAo/CJbLMnbL5N0/s320/ISA_Analyze2.PNG" alt="" id="BLOGGER_PHOTO_ID_5238056505110284098" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Click browse, Select "Remote Artifact Browse" and find the log file. (More quirkiness. It may take several minutes - not exaggerating - for you to navigate to your folder so make sure it isn't too deep or copy the path into the textbox which might not work.)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_iNp-a60zjXU/SLFTPYyqVcI/AAAAAAAAAAw/mIwOhkqWvcE/s1600-h/ISA_Analyze3.PNG"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_iNp-a60zjXU/SLFTPYyqVcI/AAAAAAAAAAw/mIwOhkqWvcE/s320/ISA_Analyze3.PNG" alt="" id="BLOGGER_PHOTO_ID_5238059365426681282" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Now you can begin analyzing the log - see next post!&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444824863795696972-5063220388274477856?l=wperf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wperf.blogspot.com/feeds/5063220388274477856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444824863795696972&amp;postID=5063220388274477856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/5063220388274477856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/5063220388274477856'/><link rel='alternate' type='text/html' href='http://wperf.blogspot.com/2008/08/graphing-garbage-collection-part-1.html' title='Graphing Java Garbage Collection part 1 - using IBM&apos;s Memory Visualizer'/><author><name>T</name><uri>http://www.blogger.com/profile/01330035697440138900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_iNp-a60zjXU/SLFNNu3RKXI/AAAAAAAAAAg/9wtSM1m1PB8/s72-c/ISA_Analyze1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444824863795696972.post-5508301375901341232</id><published>2008-08-21T16:15:00.000-07:00</published><updated>2008-09-16T17:25:30.111-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM ISA'/><title type='text'>Installing IBM Support Assistant and performance tools</title><content type='html'>&lt;ol&gt;&lt;li&gt;Download and install &lt;a href="http://www-01.ibm.com/software/support/isa/download.html"&gt;IBM's ISA framework&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Open up ISA and go to Update &gt; "Find New.." &gt; Tools Add-ons&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iNp-a60zjXU/SK4ChIizI7I/AAAAAAAAAAQ/MqlXV1Yn59U/s1600-h/ISA_Tool_Add-ons.PNG"&gt;&lt;img style="" src="http://4.bp.blogspot.com/_iNp-a60zjXU/SK4ChIizI7I/AAAAAAAAAAQ/MqlXV1Yn59U/s320/ISA_Tool_Add-ons.PNG" alt="" id="BLOGGER_PHOTO_ID_5237126184930845618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Select "IBM Monitoring and Diagnostic Tools for Java - Garbage Collection and Memory Visualizer" and "IBM Thread and Monitor Dump Analyzer for Java (Tech Preview)." Click Next through the remaining screens. It will ask you to restart itself.&lt;/li&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iNp-a60zjXU/SK4D7orWzKI/AAAAAAAAAAY/5JPm5200iik/s1600-h/ISA_Tool_Add-ons2.PNG"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_iNp-a60zjXU/SK4D7orWzKI/AAAAAAAAAAY/5JPm5200iik/s320/ISA_Tool_Add-ons2.PNG" alt="" id="BLOGGER_PHOTO_ID_5237127739744898210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444824863795696972-5508301375901341232?l=wperf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wperf.blogspot.com/feeds/5508301375901341232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7444824863795696972&amp;postID=5508301375901341232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/5508301375901341232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444824863795696972/posts/default/5508301375901341232'/><link rel='alternate' type='text/html' href='http://wperf.blogspot.com/2008/08/installing-ibms-isa-and-performance.html' title='Installing IBM Support Assistant and performance tools'/><author><name>T</name><uri>http://www.blogger.com/profile/01330035697440138900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_iNp-a60zjXU/SK4ChIizI7I/AAAAAAAAAAQ/MqlXV1Yn59U/s72-c/ISA_Tool_Add-ons.PNG' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
