When JVM needs to increase heap at reserves (mallocs) more memory. But how much?
You shouldn't really care. It just works. Many advice using equal Xmx
and Xms
so that JVM allocates all the memory at startup. This is reasonable, read further.
How this "step size" could be configured?
It can't, it is completely implementation and probably OS dependant.
When JVM starts GC? Not when it comes to xmx, but when it comes to reserved heap size (top of this pool)?
GC is a bit more complicated than you think. Minor GC is executed when young generation is filled up. Major GC is called there is no more space left in old generation.
And all that happens until {{xmx}} is reached and OOM is thrown, right?
No, when Xmx
is reached, JVM stabilizes and nothing wrong happens. OutOfMemoryError
is thrown when, immediately after GC, JVM is unable to find enough space for new object (this is a major simplification).
If so, it is much better to set xms close to xmx to prevent many useless GCs.
Once again, you must learn how GC works. Using Xmx
equal to Xms
is a good choice because it avoids unnecessary allocations when application runs (everything happens on startup, no further overhead). GC has nothing to do with that.
instead of many little ones, bug every GC freezes my JVM, so it is better to have one, right?
Nope. Minor GC usualy takes tens of milliseconds and is almost invisible, unless you are working on a real-time system. Major (stop-the-world) GC might take few seconds and is certainly noticeable for end users. In a correctly tuned JVM major GC should occur very rarely.