I track my Java application (written in JDK 1.7 ) with VisualVM . The following is a graph showing heap memory usage for the duration of this application.

Looking at this graph, you will see that it has a lot of spikes. These spikes indicate the creation of objects by the application. When an application runs with them, it destroys them using gc (implicitly called in this case).
Also, here is a screenshot of the memory profiler when the application is still running

For me, the upper and lower nature of the graph indicates the efficient use of Java objects. Is this conclusion correct?
What is the ideal nature of the heap usage schedule to strive for?
Are there other ways to improve heap memory usage in an application?
source share