JBoss EAP 6.0运行2天后CPU占用达100%,寻求技术解决方案
Hey there, let’s dig into that 100% CPU issue you’re facing with your JBoss EAP 6.0 stack. I’ve troubleshooted similar setups before, so here’s a practical, step-by-step guide to help you track down the root cause and fix it:
When CPU hits 100%, the first thing you need is visibility into what your JVM threads are doing. Grab multiple thread dumps (3-5, spaced 10 seconds apart) and a heap dump:
- Use
jstack <jboss_pid> > thread_dump_<timestamp>.txt(replace<jboss_pid>with your JBoss process ID) — this works for any Java 7 setup. - For JBoss-specific tools, run
jboss-cli.sh(or.baton Windows), connect to your server, and execute/:dump-threads --file=thread_dump.txt. - Capture a heap dump with
jmap -dump:format=b,file=heap_dump.hprof <jboss_pid>— this helps if memory leaks are triggering frequent GC (a common CPU hog).
Open those thread dumps and look for patterns:
- Focus on threads stuck in the RUNNABLE state across multiple dumps — these are almost always the ones chewing up CPU. Check their stack traces: are they stuck in your Struts 1.3 action code? A business logic loop? Or JBoss internal classes?
- Watch for GC-related threads (names like
GC task threadorParNew GC). If these threads are consistently using high CPU, your app is probably suffering from frequent full garbage collections.
If GC seems suspect, enable detailed GC logging in JBoss’s startup parameters (add these to your standalone.conf or domain.conf):
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/var/log/jboss/gc.log
Analyze the log:
- Are full GCs happening every few minutes? That’s a sign of a memory leak or insufficient heap size.
- Look for high promotion rates from young to old generation — this can indicate short-lived objects aren’t being collected properly.
Slow or inefficient database calls often translate to high CPU on the app server:
- Use SQL Server Profiler or Extended Events to capture long-running queries. Even if a query doesn’t time out, fetching a massive result set and processing it in your Struts action can eat up CPU.
- Check your code: are you doing heavy in-memory sorting/filtering that should be handled by SQL Server? Are you leaving database connections open unnecessarily?
Older versions can have known bugs or misconfigurations:
- Verify your Java 7 update level — use at least Update 80 (the last public update for Java 7) to avoid known JVM bugs that cause CPU spikes.
- Check JBoss thread pool settings in
standalone.xml/domain.xml. If the web connector thread pool is too large (e.g., more than 200 threads), excessive context switching can drive up CPU. Look for<thread-pool>under<subsystem xmlns="urn:jboss:domain:web:1.4">. - Apply any critical patches for JBoss EAP 6.0 — Red Hat released fixes for thread management and GC issues in later patches.
Struts 1.3 has a few common pitfalls that cause CPU issues:
- Look for infinite loops in custom interceptors or action classes. A redirect loop between actions, or a business logic loop that doesn’t terminate, will immediately max out CPU.
- Check static variables — if they’re holding onto large objects (like cached data that never gets cleared), this can cause memory leaks and trigger frequent GC.
- Ensure action forms are properly scoped — creating new form instances for every request unnecessarily adds overhead.
- Restart JBoss to get back to a working state, but don’t stop here — this just masks the problem.
- Temporarily increase the JVM heap size (e.g.,
-Xmx2ginstead of-Xmx1g) — if the CPU spike is delayed, that confirms a memory leak is involved. - Disable any non-essential plugins or subsystems in JBoss (like unused EJB or messaging features) to rule out third-party components.
Once you’ve analyzed the thread dumps and GC logs, you’ll have a clear picture of what’s causing the CPU to spike. Thread dumps are usually the fastest way to find the "smoking gun" — don’t skip that step!
内容的提问来源于stack exchange,提问作者Swamy

