a.
Compaction
is used to reduce heap fragmentation, i.e., move objects to form contiguous
‘live regions’ of the heap space. Note when a full compaction is run the
stopping of a concurrently running application is inevitable. We can say that
compaction is one of the worst garbage collection bottlenecks. If anything is
known about fragmentation and object sizes it might be beneficial to tune
compaction.
b.
The
compaction algorithm divides the heap into a number of equally large parts.
Each of these is subject to separate compaction that can stop the world. The
default is 4096 parts. When compaction is too disruptive it might help to
increase the number of heap parts. When compaction fails to keep up with
fragmentation it might help to decrease the number of heap parts. Note that,
for strategies other than throughput the compaction areas are sized dynamically
c.
The proper
tuning of compaction involves two parameters:
i.
Compaction
ratio (-XX:compaction:percentage:<percentage> or
-XX:compaction:internalPercentage=<percentage>,externalPercentage=<percentage>)
– the percentage of the heap that the garbage collector compacts at each
garbage collection. While the JVM is compacting the heap, all threads that want
to access objects need to wait because the JVM is moving the objects around.
ii.
Maximum
references (-XX:compaction:maxReferences:<value>) – the maximum number of
references to objects in the compaction area. If the number of references
exceeds this limit, the compaction is canceled. When compaction has moved objects,
the references to these objects must be updated. The pause time introduced by
this updating is proprotional to the number of references that have been
updated
d.
steps to
tune compaction are as follows:
i.
Set the
compaction ratio to 1 and gradually increase the ratio until the pause time
becomes too long.
ii.
If the
garbage collection time is too long when the compaction ration is 1, the
maximum number of references must be adjusted:
iii.
Set the
maximum references to 10000 and gradually increase the references until the
pause time becomes too long. To monitor compaction behavior, we can add the
option -Xverbose:compaction to the command-line. If many compactions are
skipped, the maximum references must be increased; if, on the other hand, the
compaction pause times are too long the maximum references must be decreased.
iv.
As we are
using a dynamic garbage collection that optimizes the pause time
(-Xgc:pausetime), we do not need to tune the compaction manually in this case
setting the -XpauseTarget is sufficient.
e.
Each thread
allocates objects in a TLA that is promoted to the heap when full. The TLA size
can be adjusted by using
-XXtlaSize:min=<size>,preferred=<size>,wasteLimit=<size>, in
which,
i.
min – sets
the minimum size of a TLA.
ii.
preferred –
sets the preferred size of a TLA. The system will try to get TLAs of the
preferred size if possible, but accepts TLAs of minimum size as well.
iii.
wasteLimit
– sets the waste limit for TLAs. This is the maximum amount of free memory that
a TLA is allowed to have when a thread requires a new TLA