When I studied the behavior of my application in VisualVM, I came across this and was puzzled, I thought that the JMX call to execute the garbage collection would have the same functions as the call System.gc(), however, in all environments I tried it on, the JMX call always leads to lesser use of the heap and then to a call System.gc(), which is functionally the difference?

You can see the final drop - I manually clicked on the “Run GC” button, my usage decreased slightly than in regular collections of the system. Thoughts on why this might be?
I tried this in several environments, leaving collections to the system and manually calling System.gc(), and every time a JMX call will clear much more.
, , JMX , , ?