Question: Could someone explain to a C++ programmer most important differences between Java (and C# as well) references and shared\_ptr (from Boost or from C++0x).

I more or less aware how shared\_ptr is implemented. I am curious about differences in the following ares:

1) Performance.
2) Cycling. shared\_ptr can be cycled (A and B hold pointers to each other). Is cycling possible in Java?
3) Anything else?

Thank you.

Answer: 
The key difference is that when the shared pointer's use count goes to zero, the object it points to is destroyed (destructor is called and object is deallocated), immediately. In Java and C# the deallocation of the object is postponed until the Garbage Collector chooses to deallocate the object (i.e., it is non-deterministic). 

With regard to cycles, I am not sure I understand what you mean. It is quite common in Java and C# to have two objects that contain member fields that refer to each other, thus creating a cycle. For example a car and an engine - the car refers to the engine via an engine field and the engine can refer to its car via a car field.
First of all, Java/C# have only pointers, not references, though they call them that way. Reference is a unique C++ feature. Garbage collection in Java/C# basically means infinite life-time. `shared_ptr` on the other hand provides sharing and deterministic destruction, when the count goes to zero. Therefore, `shared_ptr` can be used to automatically manage any resources, not just memory allocation. In a sense (just like any RAII design) it turns pointer semantics into more powerful value semantics.