使用jTDS的Java web应用程序内存不足错误和100%CPU使用率

使用jTDS的Java web应用程序内存不足错误和100%CPU使用率,java,jdbc,memory-leaks,jtds,thread-dump,Java,Jdbc,Memory Leaks,Jtds,Thread Dump,我的web应用程序中出现了OutOfMemoryError。 当我分析线程转储时,我发现一个阻止线程,堆栈跟踪是: Finalizer Stack Trace is: java.lang.Thread.State: BLOCKED at net.sourceforge.jtds.jdbc.JtdsConnection.releaseTds(JtdsConnection.java:2024) - waiting to lock <662301fc> (a net.sourcefor

我的web应用程序中出现了
OutOfMemoryError
。 当我分析线程转储时,我发现一个阻止线程,堆栈跟踪是:

Finalizer 
Stack Trace is: 
java.lang.Thread.State: BLOCKED
at net.sourceforge.jtds.jdbc.JtdsConnection.releaseTds(JtdsConnection.java:2024)
- waiting to lock <662301fc> (a net.sourceforge.jtds.jdbc.JtdsConnection) owned by "default task-204" t@896
at net.sourceforge.jtds.jdbc.JtdsStatement.close(JtdsStatement.java:972)
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.close(JtdsPreparedStatement.java:707)
at net.sourceforge.jtds.jdbc.JtdsStatement.finalize(JtdsStatement.java:219)
at java.lang.System$2.invokeFinalize(System.java:1270)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:98)
at java.lang.ref.Finalizer.access$100(Finalizer.java:34)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:210)
Locked ownable synchronizers:
- None
终结器
堆栈跟踪是:
java.lang.Thread.State:已阻止
位于net.sourceforge.jtds.jdbc.JtdsConnection.releaseTds(JtdsConnection.java:2024)
-正在等待“default task-204”拥有的锁(net.sourceforge.jtds.jdbc.JtdsConnection)t@896
位于net.sourceforge.jtds.jdbc.jtdstatement.close(jtdstatement.java:972)
位于net.sourceforge.jtds.jdbc.jtdsprearedstatement.close(jtdsprearedstatement.java:707)
位于net.sourceforge.jtds.jdbc.jtdstatement.finalize(jtdstatement.java:219)
位于java.lang.System$2.invokeFinalize(System.java:1270)
位于java.lang.ref.Finalizer.runFinalizer(Finalizer.java:98)
位于java.lang.ref.Finalizer.access$100(Finalizer.java:34)
位于java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:210)
锁定可拥有的同步器:
-没有
堆栈跟踪的详细信息:

default task-204 
Stack Trace is: 
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.DataInputStream.readFully(DataInputStream.java:195)
at java.io.DataInputStream.readFully(DataInputStream.java:169)
at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:850)
at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:731)
- locked <5bc15901> (a java.util.concurrent.ConcurrentHashMap)
at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:477)
at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:114)
at net.sourceforge.jtds.jdbc.ResponseStream.peek(ResponseStream.java:99)
at net.sourceforge.jtds.jdbc.TdsCore.wait(TdsCore.java:4127)
at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1086)
- locked <51eb98a0> (a net.sourceforge.jtds.jdbc.TdsCore)
at net.sourceforge.jtds.jdbc.JtdsCallableStatement.executeMSBatch(JtdsCallableStatement.java:165)
at net.sourceforge.jtds.jdbc.JtdsStatement.executeBatch(JtdsStatement.java:1051)
- locked <662301fc> (a net.sourceforge.jtds.jdbc.JtdsConnection)
at org.jboss.jca.adapters.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:1077)
at com.XXX.MyDao.myMethod(MyDao.java:102)
默认任务-204
堆栈跟踪是:
java.lang.Thread.State:可运行
位于java.net.SocketInputStream.socketRead0(本机方法)
位于java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
位于java.net.SocketInputStream.read(SocketInputStream.java:170)
位于java.net.SocketInputStream.read(SocketInputStream.java:141)
在java.io.DataInputStream.readFully(DataInputStream.java:195)中
在java.io.DataInputStream.readFully(DataInputStream.java:169)处
位于net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:850)
位于net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:731)
-锁定(java.util.concurrent.ConcurrentHashMap)
位于net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:477)
位于net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:114)
net.sourceforge.jtds.jdbc.ResponseStream.peek(ResponseStream.java:99)
net.sourceforge.jtds.jdbc.TdsCore.wait(TdsCore.java:4127)
位于net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1086)
-锁定(net.sourceforge.jtds.jdbc.TdsCore)
位于net.sourceforge.jtds.jdbc.JtdsCallableStatement.executeMSBatch(JtdsCallableStatement.java:165)
位于net.sourceforge.jtds.jdbc.jtdstatement.executeBatch(jtdstatement.java:1051)
-锁定(一个net.sourceforge.jtds.jdbc.jtds连接)
位于org.jboss.jca.adapters.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:1077)
在com.XXX.MyDao.myMethod上(MyDao.java:102)
MyDao.java
的第102行,我正在执行
callableStatement.executeBatch()

我正在使用
jtds-1.3.1
连接到数据库

我使用

相同的图像:

重新启动应用程序后,它工作正常

您可以从中阅读有关终结器线程的信息