Symbol table scan is the most time consuming part of some pauses, particularly the G1 remark phase. Measurements show that over a large range of applications it takes ~50% of the pause time.
At the same time, with the current G1 implementation of concurrent marking there does not seem to be any actual freeing of symbols since it does not do class unloading.
Consider not doing symbol table scan at all in this case, i.e. when there is no class unloading during G1 remark. Investigate whether it is true that there is no symbol freeing (or almost none) in this case, and possibly investigate other applications of this method. (i.e. turn of symbol table scan when no class unloading is done)
This is sort of a short-term "solution" for the issue as long as G1 does not support class unloading during G1 concurrent mark.
There is a related JDK-8027455 that is about improving the actual scan if it needs to be done