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

  1. Record Java version, GC type and actual JVM flags before trying to override automatic thread sizing.
  2. Check how many physical cores the server can use and how much capacity chunk workers, Netty, plugins and operating system work require.
  3. 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
  1. Reserve headroom for the concurrent GC work when planning Folia threaded-regions.threads. Start with JVM defaults unless evidence supports changing GC sizing.
  2. 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.

References