Friday, March 28, 2014

Microsoft visio for UML

Microsoft visio supports UML diagrams.

  • Class diagram
  • Sequence diagram
  • Use Case diagram
  • Activity diagram
  • State diagram

Download trial version @ http://office.microsoft.com/en-in/visio/

You can download UML2.5 stencils @ http://www.softwarestencils.com/uml/index.html

Friday, March 14, 2014

Eclipse plugins debug tracing facility

Debugging eclipse dropins

If you are attempting to use dropins, but your bundles are not being found, first ensure org.eclipse.equinox.ds and org.eclipse.equinox.p2.reconciler.dropins are marked to auto-start.

You can check these in bundles.info file in eclipse "eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info"

Search for an entries of org.eclipse.equinox.ds and org.eclipse.equinox.p2.reconciler.dropins

Example:
org.eclipse.equinox.ds,1.4.1.v20120926-201320,plugins/org.eclipse.equinox.ds_1.4.1.v20120926-201320.jar,2,true

org.eclipse.equinox.p2.reconciler.dropins,1.1.200.v20120301-2145,plugins/org.eclipse.equinox.p2.reconciler.dropins_1.1.200.v20120301-2145.jar,4,true

Mark both of them to true, if it's not set already.

Resolution errors with dropins are silently ignored. To enable useful logging messages, place the following tracing options in your .options file:

org.eclipse.equinox.p2.core/debug=true
org.eclipse.equinox.p2.core/reconciler=true

We can create this file in eclipse root directory with name .options and add above 2 lines in it.
eclipse/.options

And now run your eclipse in -debug -console mode.


Resources:
https://wiki.eclipse.org/Equinox/p2/Getting_Started

Eclipse bundles.info

What is bundles.info file in eclipse ?

The file bundles.info contains a list of all the plug-ins installed in the current system. On startup, all the plug-ins listed in this file are given to OSGi as the exact set of plug-ins to run with.

Where can i find this file in eclipse ?

You can find in eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info

eclipse/
   configuration/
     config.ini
     org.eclipse.equinox.simpleconfigurator/
       bundles.info
   dropins/
   features/
   p2/
   plugins/
   eclipse.exe
   eclipse.ini
   ...



Resources:
https://wiki.eclipse.org/Equinox/p2/Getting_Started

Wednesday, February 19, 2014

Identifying a deadlock in your application using JConsole

It's very simple!!  You need not setup anything for this. JPS and JConsole comes with JDK toolkit.

Step 1:
Got to command prompt and type 'jps' command. This will tell you the currently running java process id's.

Example:
C:\Users\kh1205>jps

7620 org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
7048 Main
5740 Jps


Step 2:
Open jconsole using your application process id, in my case 7048 is my eclipse application process id.

Example:
C:\Users\kh1205>jconsole 7048

This will launch jconsole window with various sections.

Step 3:
Navigate to Threads section in jconsole window, and navigate through main thread(ex:main) and worker threads(ex: worker-1, worker-2). In one of these threads, your application is in waiting state.





Tuesday, February 11, 2014

Ellipses (...) conventions in Eclipse

There are lot of discussions on this topic, but there is no official eclipse wiki page which described ellipses standards and conventions which has to be used while developing eclipse products.

Below are the resources which helps us to understand how to use ellipses in eclipse.


As per my understanding, eclipse is mostly following Windows User interface guidelines for ellipses usage conventions.

Below points which helps us to understand in summary.

1. Display an ellipsis if a dialog box is displayed to the user to change/enter information. Omit the ellipses for "show properties", "help" and "about" which are essentially "show" dialogs anyway. No more info is needed for them.

2. While command buttons are used for immediate actions, more information might be needed to perform the action. Indicate a command that needs additional information by adding an ellipsis at the end of the button label
Screen shot of Print command button with ellipses

In this example, the Print... command displays a Print dialog box to gather more information.
Screen shot of Print command button, no ellipses
By contrast, in this example the Print command prints a single copy of a document to the default printer without any further user interaction.

3. Proper use of ellipses is important to indicate that users can make further choices before performing the action, or even cancel the action entirely.

This doesn't mean you should use an ellipsis whenever an action displays another window—only when additional information is required to perform the action. Consequently, any command button whose implicit verb is to "show another window" doesn't take an ellipsis, such as with the commands About, Advanced, Help (or any other command linking to a Help topic), Options, Properties, or Settings.

4. Generally, ellipses are used in user interfaces to indicate incompleteness. Commands that show other windows aren't incomplete—they must display another window and additional information isn't needed to perform their action. 

    Some actions in Eclipse:
    Restart -> it will just restart without asking. It might ask if any unsaved changes, for confirmation ellipses not required.
    Exit -> It will just exit from the eclipse. No ellipse required

    Import...  -user has to select what has to imported. We should use ellipse here
    Export...  -user has to select what has to exported. We should use ellipse here



    




Thursday, February 6, 2014

Run time data areas - JVM Memory model

I love to share an excellent article from Point software, It's just a brilliant composition and easy to understand with diagrams.

Every developer gets once confronted by Java memory questions like: What size should I define for the Heap space? An OutOfMemoryError covers which part of the runtime data area? In the Heap, PermGen, or Thread? And how do I solve it?

Java Memory Model

The Java memory model is specified in the latest JVM specification, Java SE 7 Edition, and mainly in the chapters “2.5 Runtime Data Areas” and “2.6 Frames”. In a nutshell primitive, object and class data are stored in 3 different memory areas: heap space, method area and native are.
The heap space holds object data, the method area holds class code, and the native area holds references to the code and object data.
The method area is also known as the permanent generation space (PermGen). All class data are loaded into this memory space. This includes the field and method data and the code for the methods and constructors.
[UPDATE]
Oracle has planned in JDK 7 to completely remove the PermGen space from the JVM. Reason is the consolidation of HotSpot and JRockit. As a result the method area will be part of the operating system’s native heap.
All objects being instantiated during runtime are stored in the heap space. The heap space again is divided into several parts: eden, survivor, and old generation Space.
Method executions are within a thread. Local variables of primitive types and references are stored here. The references for example points to Objects like String stored in the Heap space. Here is a video demonstrating the interaction between a stack and the heap.
For a better understanding let’s have a look at another example code:
The data are then stored like this:
With the JConsole tool it is possible to view the memory allocations in the heap, the number of threads and loaded classes of a running Java application (e.g. Eclipse):

Java Memory Architecture

There is an excellent white paper about Memory Management in the Java
HotSpot™ Virtual Machine
. It describes about the automatic memory management handle using garbage collection.
The Java memory architecture consists of the following parts:

Heap memory

Since objects are stored in the heap part it is worth to have a closer look. The heap space itself is again separated into several spaces:
  • Young generation with eden and survivor space
  • Old Generation with tenured space
Each space harbors objects with different life cycles:
  • New/short-term objects are instantiated in the eden space.
  • Survived/mid-term objects are copied from the eden space to the survivor space.
  • Tenured/long-term objects are copied from the survivor to the old generation space.
By separating objects by their life time allows a shorter time consumption of the minor garbage collection and in return there is more cpu time for the application.
The reason is that in Java – unlike C – memory is freed (by destroying objects) automatically by two different garbage collectors: a minor and major garbage collection.
Instead of validating all objects in the heap – whether it can be destroyed or not – the minor garbage collector marks undestroyed objects with a garbage count. After a certain count the object is move to the old generation space.
A more detailed blog of the garbage collection will be discussed in another blog. For now it is sufficient to know that there are two garbage collectors.

OutOfMemoryError – but where?

Having this memory architecture in mind also helps to understand the different OutOfMemoryErrors like:
  1. Exception in thread “main”: java.lang.OutOfMemoryError: Java heap space
    Reason: an object could not be allocated into the heap space.

  2. Exception in thread “main”: java.lang.OutOfMemoryError: PermGen space
    Reason: classes and methods could not be loaded into the PermGen space. This occurs when an application requires a lot of classes e.g. in various 3rd party libraries.

  3. Exception in thread “main”: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    Reason: this occurs when an arrays is created larger than the heap size.

  4. Exception in thread “main”: java.lang.OutOfMemoryError: request bytes for . Out of swap space?
    Reason: this occurs when an allocation from the native heap failed and might be close to its limit. The indicates the source of the module where this error occurs.

  5. Exception in thread “main”: java.lang.OutOfMemoryError: (Native method)
    Reason: this error indicates that the problem originates from a native call rather than in the JVM.

Useful Links

Resources: