Direct answer
Folia’s FAQ distinguishes concurrent GC threads from parallel stop-the-world GC workers: -XX:ConcGCThreads uses CPU concurrently with normal server work, while -XX:ParallelGCThreads primarily runs during pauses.
How to check it
- Record Java version, GC type and actual JVM flags before trying to override automatic thread sizing.
- Check how many physical cores the server can use and how much capacity chunk workers, Netty, plugins and operating system work require.
- Profile GC pauses and CPU pressure separately; high MSPT does not automatically mean the garbage collector needs more threads.
What to change
-XX:ConcGCThreads=2 # example for a measured test, not a universal preset- Reserve headroom for the concurrent GC work when planning Folia
threaded-regions.threads. Start with JVM defaults unless evidence supports changing GC sizing. - If testing
-XX:ConcGCThreads, use a staging server with the same heap, Java version and load. Change one flag and compare before retaining it.
Software and version notes
Compatibility and safety
Folia’s historical “80%” thread-budget recommendation is a rough allocation estimate, not a CPU-utilization target. JVM flag behavior depends on collector and version; do not assume every GC accepts identical tuning.
Verify the result
Compare pause times, concurrent CPU load, region health and memory after representative player activity; revert any JVM flag that makes tail latency worse.