Let me try..
The heap is an area of pre-reserved memory that a program process can use to store data. In
Java, all the new()'ed objects are on the heap, including new()'ed
String and StringBuffer. The process manages its allocated heap by requesting a "chunk" of the heap (called a heap block) when needed, returning the blocks when no longer needed, and doing occasional "garbage collecting," which makes blocks available that are no longer being used and also reorganizes the available space in the heap so that it isn't being wasted in small unused pieces. In Java, objects that have no active references are garbage collected.
A pool is an area in the memory too, but it is less dynamic compared to the heap since objects live longer in the pool, and are subjected to garbage collection only when the class is unloaded. A pool is where JVM stores and manages constant Strings. Java optimizes memory utilization by NOT creating identical strings, but reusing the ones in the pool. Any String object created and initialized using the = operator is added to the pool, instead of the heap.
Other than String objects, no other kind of objects live in the pool. This includes StringBuffer and any other Java object.
Hope this helps, if not please be more specific as to what exactly you don't understand
Ajith