Hi All,
I've been having a problem for several days now when debugging Tomcat 5.5.26
on my development machine. Only when debugging, Tomcat runs very slow with
high CPU usage. The same does not happen when running Tomcat without
debugging. There is no noticeable difference in memory usage between
debugging and not debugging. I'm working with other developers who have
similar (if not identical) setups, and they haven't experienced these
issues. I am relatively new to Java development, Tomcat, and Eclipse, so
please let me know of any more helpful information I can provide.
When not in debug mode:
- CPU spike at Tomcat startup, which goes all the way back down after a few
seconds.
- Each call in a series of JUnit tests which hit my local instance of Tomcat
takes below 0.15 seconds, most of the time taking below 0.1 seconds. Pages
in the browser load very quickly.
- When I run these tests, there is only a brief (and not as severe) increase
in the CPU usage of the java process, then it immediately goes back down.
When in debug mode, starting Tomcat through Eclipse:
- CPU spikes at startup and stays high for several minutes. During this time
any attempt to stop Tomcat throws a "Connection refused" error.
- The same unit tests that took fractions of a second to run now take around
30 seconds apiece. During this time CPU again seems to go through the roof.
- When I pause the debugger and look at the stack trace (startup and while
hitting code), I see lots of threads with Object.wait. Stack trace while
running a test:
org.apache.catalina.startup.Bootstrap at localhost:50076 (Suspended)
Daemon System Thread [Finalizer] (Suspended)
Object.wait(long) line: not available [native method]
ReferenceQueue<T>.remove(long) line: 116
ReferenceQueue<T>.remove() line: 132
Finalizer$FinalizerThread.run() line: 159
Daemon System Thread [Reference Handler] (Suspended)
Object.wait(long) line: not available [native method]
Reference$Lock(Object).wait() line: 474
Reference$ReferenceHandler.run() line: 116
Thread [main] (Suspended)
PlainSocketImpl.socketAccept(SocketImpl) line: not available [native
method]
SocksSocketImpl(PlainSocketImpl).accept(SocketImpl) line: 384
ServerSocket.implAccept(Socket) line: 450
ServerSocket.accept() line: 421
StandardServer.await() line: 379
Catalina.await() line: 616
Catalina.start() line: 576
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not
available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 585
Bootstrap.start() line: 295
Bootstrap.main(String[]) line: 433
Daemon System Thread [Signal Dispatcher] (Suspended)
Daemon Thread [Thread-1] (Suspended)
Thread.sleep(long) line: not available [native method]
XMLWatchdog(FileWatchdog).run() line: 104
Daemon Thread [Timer-0] (Suspended)
Object.wait(long) line: not available [native method]
TaskQueue(Object).wait() line: 474
TimerThread.mainLoop() line: 483
TimerThread.run() line: 462
Daemon Thread [MySQL Statement Cancellation Timer] (Suspended)
Object.wait(long) line: not available [native method]
TaskQueue(Object).wait() line: 474
TimerThread.mainLoop() line: 483
TimerThread.run() line: 462
Daemon Thread [Thread-4] (Suspended)
Thread.sleep(long) line: not available [native method]
SockIOPool$MaintThread.run() line: 1316
Daemon Thread [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
(Suspended)
Thread.sleep(long) line: not available [native method]
ContainerBase$ContainerBackgroundProcessor.run() line: 1548
Thread.run() line: 613
Daemon Thread [http-8080-Processor1] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor2] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor3] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor4] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor5] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor6] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor7] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor9] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor8] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor10] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor11] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor12] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor13] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor14] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor15] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor16] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor17] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor18] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor19] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor20] (Suspended)
LinkedHashMap$EntryIterator.next() line: 383
IdentityMap.entryList() line: 194
IdentityMap.entries(Map) line: 71
DefaultFlushEventListener(AbstractFlushingEventListener).flushCollections(EventSource)
line: 226
DefaultFlushEventListener(AbstractFlushingEventListener).flushEverythingToExecutions(FlushEvent)
line: 77
DefaultFlushEventListener.onFlush(FlushEvent) line: 26
SessionImpl.flush() line: 1004
SessionImpl.managedFlush() line: 342
JDBCTransaction.commit() line: 136
HibernateTransactionManager.doCommit(DefaultTransactionStatus) line:
655
HibernateTransactionManager(AbstractPlatformTransactionManager).processCommit(DefaultTransactionStatus)
line: 709
HibernateTransactionManager(AbstractPlatformTransactionManager).commit(TransactionStatus)
line: 678
TransactionInterceptor(TransactionAspectSupport).commitTransactionAfterReturning(TransactionAspectSupport$TransactionInfo)
line: 321
TransactionInterceptor.invoke(MethodInvocation) line: 116
Cglib2AopProxy$CglibMethodInvocation(ReflectiveMethodInvocation).proceed()
line: 171
Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Object, Method,
Object[], MethodProxy) line: 635
InterestGroupManager$$EnhancerByCGLIB$$157e5129.fetchInterest(Long)
line: not available
InterestService.fetchInterest(Long, List<String>) line: 531
InterestService.fetchSuggestedInterests(Long, int, Locale,
List<String>) line: 583
UserController.addtopics(HttpServletRequest, HttpServletResponse)
line: 197
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not
available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 585
UserController(MultiActionController).invokeNamedMethod(String,
HttpServletRequest, HttpServletResponse) line: 473
UserController(MultiActionController).handleRequestInternal(HttpServletRequest,
HttpServletResponse) line: 410
UserController(RestfulApiController).handleRequestInternal(HttpServletRequest,
HttpServletResponse) line: 175
UserController(AbstractController).handleRequest(HttpServletRequest,
HttpServletResponse) line: 153
SimpleControllerHandlerAdapter.handle(HttpServletRequest,
HttpServletResponse, Object) line: 48
DispatcherServlet.doDispatch(HttpServletRequest,
HttpServletResponse) line: 875
DispatcherServlet.doService(HttpServletRequest, HttpServletResponse)
line: 809
DispatcherServlet(FrameworkServlet).processRequest(HttpServletRequest,
HttpServletResponse) line: 571
DispatcherServlet(FrameworkServlet).doGet(HttpServletRequest,
HttpServletResponse) line: 501
DispatcherServlet(HttpServlet).service(HttpServletRequest,
HttpServletResponse) line: 690
DispatcherServlet(HttpServlet).service(ServletRequest,
ServletResponse) line: 803
ApplicationFilterChain.internalDoFilter(ServletRequest,
ServletResponse) line: 269
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse)
line: 188
ParameterizedPathFilter.doFilter(ServletRequest, ServletResponse,
FilterChain) line: 57
ApplicationFilterChain.internalDoFilter(ServletRequest,
ServletResponse) line: 215
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse)
line: 188
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest,
ServletResponse) line: 359
FilterSecurityInterceptor.invoke(FilterInvocation) line: 109
FilterSecurityInterceptor.doFilter(ServletRequest, ServletResponse,
FilterChain) line: 83
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest,
ServletResponse) line: 371
SessionFixationProtectionFilter.doFilterHttp(HttpServletRequest,
HttpServletResponse, FilterChain) line: 52
SessionFixationProtectionFilter(SpringSecurityFilter).doFilter(ServletRequest,
ServletResponse, FilterChain) line: 53
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest,
ServletResponse) line: 371
ExceptionTranslationFilter.doFilterHttp(HttpServletRequest,
HttpServletResponse, FilterChain) line: 101
ExceptionTranslationFilter(SpringSecurityFilter).doFilter(ServletRequest,
ServletResponse, FilterChain) line: 53
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest,
ServletResponse) line: 371
AnonymousProcessingFilter.doFilterHttp(HttpServletRequest,
HttpServletResponse, FilterChain) line: 105
AnonymousProcessingFilter(SpringSecurityFilter).doFilter(ServletRequest,
ServletResponse, FilterChain) line: 53
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest,
ServletResponse) line: 371
SecurityContextHolderAwareRequestFilter.doFilterHttp(HttpServletRequest,
HttpServletResponse, FilterChain) line: 91
SecurityContextHolderAwareRequestFilter(SpringSecurityFilter).doFilter(ServletRequest,
ServletResponse, FilterChain) line: 53
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest,
ServletResponse) line: 371
AuthenticationProcessingFilter(BasicProcessingFilter).doFilterHttp(HttpServletRequest,
HttpServletResponse, FilterChain) line: 173
AuthenticationProcessingFilter.doFilterHttp(HttpServletRequest,
HttpServletResponse, FilterChain) line: 61
AuthenticationProcessingFilter(SpringSecurityFilter).doFilter(ServletRequest,
ServletResponse, FilterChain) line: 53
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest,
ServletResponse) line: 371
HttpSessionContextIntegrationFilter.doFilterHttp(HttpServletRequest,
HttpServletResponse, FilterChain) line: 235
HttpSessionContextIntegrationFilter(SpringSecurityFilter).doFilter(ServletRequest,
ServletResponse, FilterChain) line: 53
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest,
ServletResponse) line: 371
FilterChainProxy.doFilter(ServletRequest, ServletResponse,
FilterChain) line: 174
DelegatingFilterProxy.invokeDelegate(Filter, ServletRequest,
ServletResponse, FilterChain) line: 236
DelegatingFilterProxy.doFilter(ServletRequest, ServletResponse,
FilterChain) line: 167
ApplicationFilterChain.internalDoFilter(ServletRequest,
ServletResponse) line: 215
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse)
line: 188
CharEncodingFilter.doFilter(ServletRequest, ServletResponse,
FilterChain) line: 17
DelegatingFilterProxy.invokeDelegate(Filter, ServletRequest,
ServletResponse, FilterChain) line: 236
DelegatingFilterProxy.doFilter(ServletRequest, ServletResponse,
FilterChain) line: 167
ApplicationFilterChain.internalDoFilter(ServletRequest,
ServletResponse) line: 215
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse)
line: 188
DisableUrlSessionFilter.doFilter(ServletRequest, ServletResponse,
FilterChain) line: 44
ApplicationFilterChain.internalDoFilter(ServletRequest,
ServletResponse) line: 215
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse)
line: 188
StandardWrapperValve.invoke(Request, Response) line: 213
StandardContextValve.invoke(Request, Response) line: 174
StandardHostValve.invoke(Request, Response) line: 127
ErrorReportValve.invoke(Request, Response) line: 117
StandardEngineValve.invoke(Request, Response) line: 108
CoyoteAdapter.service(Request, Response) line: 174
Http11Processor.process(InputStream, OutputStream) line: 874
Http11Protocol$JmxHttp11ConnectionHandler(Http11BaseProtocol$Http11ConnectionHandler).processConnection(TcpConnection,
Object[]) line: 665
PoolTcpEndpoint.processSocket(Socket, TcpConnection, Object[]) line:
528
LeaderFollowerWorkerThread.runIt(Object[]) line: 81
ThreadPool$ControlRunnable.run() line: 689
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor21] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor22] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor23] (Suspended)
PlainSocketImpl.socketAccept(SocketImpl) line: not available [native
method]
SocksSocketImpl(PlainSocketImpl).accept(SocketImpl) line: 384
ServerSocket.implAccept(Socket) line: 450
ServerSocket.accept() line: 421
DefaultServerSocketFactory.acceptSocket(ServerSocket) line: 61
PoolTcpEndpoint.acceptSocket() line: 408
LeaderFollowerWorkerThread.runIt(Object[]) line: 71
ThreadPool$ControlRunnable.run() line: 689
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor24] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [http-8080-Processor25] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Thread [http-8080-Monitor] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$MonitorRunnable.run() line: 564
Thread.run() line: 613
Daemon Thread [TP-Processor1] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [TP-Processor2] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [TP-Processor3] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$ControlRunnable(Object).wait() line: 474
ThreadPool$ControlRunnable.run() line: 661
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [TP-Processor4] (Suspended)
PlainSocketImpl.socketAccept(SocketImpl) line: not available [native
method]
SocksSocketImpl(PlainSocketImpl).accept(SocketImpl) line: 384
ServerSocket.implAccept(Socket) line: 450
ServerSocket.accept() line: 421
ChannelSocket.accept(MsgContext) line: 312
ChannelSocket.acceptConnections() line: 666
ChannelSocket$SocketAcceptor.runIt(Object[]) line: 876
ThreadPool$ControlRunnable.run() line: 689
ThreadWithAttributes(Thread).run() line: 613
Daemon Thread [TP-Monitor] (Suspended)
Object.wait(long) line: not available [native method]
ThreadPool$MonitorRunnable.run() line: 564
Thread.run() line: 613
At first I thought it was a problem with starting Tomcat through Eclipse
using Sysdeo's plugin, but if I check the box for "Don't run Tomcat in debug
mode," everything runs fine again. When configuring Tomcat to support remote
debugging and running from the command line, as described here:
http://wiki.apache.org/tomcat/FAQ/Developing, it runs fine but chokes again
when I attach the Eclipse debugger to the VM that Tomcat is running under.
Logs appear to reveal nothing out of the ordinary.
Other info:
JDK 1.5.0 on a Mac
Eclipse 3.4.0
Tomcat 5.5.26
Any help or at least a point in the right direction for diagnosing this
problem would be greatly appreciated.
Kelly