Tuesday, August 17, 2010

Eclipse Apps Performance Tips

Lets explore some of the tricks to monitor and improve performance of apps running in Eclipse and also how we can write better API.

1. VisualVM is a great tool to monitor the performance of any eclipse application. Once the plugin is installed, any eclipse app can be launched in the VisualVM Runtime instead of a Java Runtime so that the health of the app can be monitored in real-time.

2. If we enable "Show Heap Status" under 'General Preferences', we can periodically enforce GC, which is very important for heap analysis.

3. Now we can really enable in-depth monitoring by turning on Runtime Spy through an .options file e.g. eclipse -debug c:\spy\.options
Here is the Update site for core tools
platform-core - http://eclipse.org/eclipse/platform-core/updates


References :
http://www.jdg2e.com/ch32.performance/doc/index.html#refs
Google Book
http://www.eclipse.org/eclipse/platform-core/downloads/tools/readme.html


Sample settings of the Runtime Spy .options file
#### Monitoring settings
# monitor class loading
org.eclipse.osgi/monitor/classes=true
# monitor bundle activation
org.eclipse.osgi/monitor/activation=true
# monitor resource bundle (*.properties) loading
org.eclipse.osgi/monitor/resources=true
#### Trace settings
# trace class loading - snapshot the execution stack when a class is loaded
org.eclipse.osgi/trace/classLoading=true
# trace location - file in which execution traces are written
org.eclipse.osgi/trace/filename=runtime.traces
# trace filters - Java properties file defining which classes should
# be traced (if trace/classLoading is true)
etc........


4. Well even after enabling all types of monitoring, we still sometimes can not find out why certain apps leads to OutOfMemory Error !
Then the only way out is to generate the Heap Dumps and Thread Dumps.
We can add this vmarg in eclipse.ini -
-Xdump:java+heap+system:events=user,opts=CLASSIC+PHD so that whenever SendSignal is executed corresponding dumps will be generated.


Otherwise we can start eclipse in command prompt as follows and then do Ctrl+break to signal the vm.


eclipse -vm \bin\java.exe -console -consoleLog -vmargs -verbose:class -verbose:dynload -Xms1024m -Xmx1536m -XX:MaxPermSize=128m -Xdump:heap+java:events=user,opts=CLASSIC+PHD -Xgcpolicy:optavgpaus.


Another way to send stop signal to vm - cdb -p -c ".dump /ma java.dmp;q" - Where  is the integer process Id of the java process.


5.  Time to highlight the importance of designing API and SPI using eclipse codebase. 
     This is an invaluable source of knowledge about evolving Eclipse API and proper usage of annotations like 
     @noimplement, @noextend etc.
Its a classic : http://www.eclipse.org/eclipse/development/java-api-evolution.html


6. In order to enforce API Analysis we should refer to - http://www.eclipse-tips.com/tutorials/26-api-tooling-tutorial. After all Eclipse is meant for coding clean interfaces and abstract classes that communicates to users through simple annotations and robust patterns.


7. Its not a bad idea to enforce internationalization – using the setting - org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error in .settings file.


Fixing Int issues at the early stage prevents from wasting a good amount of time and introducing unsolicited bugs at the time of product delivery phase.


8. we should flag 'unused imports' as errors in preference to make it a daily habit getting rid of unnecessary evils.


9. Templating try / catch to actually catch and log an exception is a MUST ! Eclipse should fix this by default providing a exception.printStackTrace() statement. Empty catch blocks are silent killers that remain hidden inside deeply nested api !



10. Remote Debugging Options :
-vmargs
-Xdebug
-Xnoagent
-Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9000

11. How to enforce annotations for api ?
http://www.eclipse-tips.com/tutorials/26-api-tooling-tutorial
--  enforce usage of @since, @noimplement annotations

12. How to view OSGi dependency and search plugin dependency ?



13. The last but not the least FindBug (http://findbugs.cs.umd.edu/eclipse) should be part of development environment and be actively used.


Well ... a bonus tip for hackers :-) ... don't forget the decompiler plugin -http://java.decompiler.free.fr/jd-eclipse/update-  using which you can even debug any class that essentially do not have source base shipped with its tool !  

1 comment:

Kaniska said...

Sysdao is a great Productivity Tool for Web App Development :
#1 http://www.eclipsetotale.com/tomcatPlugin.html#A3

#2 http://keyboardsamurais.de/2004/01/15/tomcat_tutorial_helloworld_for_complete_fools_-_english/


Sysdeo Tips & Tricks
Configure Project
-----------------
> Right click on your project and select Properties
> Select Tomcat from the properties list
Configure the General tab:
--------------------------
> Check the "Is a Tomcat Project" box
> Enter the context name
> Ensure checkboxes match the image
Enter your web application root (where your web.xml is located)

Configure the DevLoader Classpath
---------------------------------

> Check the "Activate DevLoader" box
> Check all libraries needed by your application, even if they are referenced via the MANIFEST file

> Click OK
> Start Tomcat using the plugin buttons
> Browse to your application