我有如下代码片段的套接字应用程序。我已确保套接字在 finally 块中关闭。我猜我昨天或前一天刚刚有一个完整的 GC。然后我在这个 FGC 之前通过 jmap 比较套接字的实例和今天在 FGC 之后但实例没有减少而是继续增加?可能是什么原因或引用 jmap 是错误的?另一件事是,在完全 GC 之后,老年代不会变成 0?
BoneCP connectionPool = null;
class ConnectionHandler implements Runnable {
Connection dbconn = null;
public void run() { // etc
BufferedWriter writeBuffer = null;
BufferedReader readBuffer = null;
String capturedMessage="";
try{
dbconn = connectionPool.getConnection();
dbconn.setAutoCommit(false);
while ((nextChar=readBuffer.read()) != -1){
capturedMessage += (char) nextChar;
if (nextChar == '*'){
try{
///For select we do this
Statement stmt2 = null;
stmt2 = dbconn.createStatement();
String selectQuery2= .........
ResultSet rs2 = stmt2.executeQuery(selectQuery2);
if(rs2.next()){
}
try{
if ( rs2!= null ){
rs2.close();
} else{
System.out.println("No rs2 exist");
}
if ( stmt2!= null ){
stmt2.close();
} else{
System.out.println("No stm2 exist");
}
}catch(SQLException ex)
{
System.out.println("SQLException has been caught for stmt2");
ex.printStackTrace(System.out);
}
funct1();
funct2();
dbconn.commit
}
catch (SQLException ex){
ex.printStackTrace(System.out);
try{
dbconn.rollback();
}
catch (Exception rollback){
rollback.printStackTrace(System.out);
}
}
catch (Exception e){
e.printStackTrace(System.out);
try{
dbconn.rollback();
}
catch (Exception rollback){
rollback.printStackTrace(System.out);
}
}
finally{
}
}
catch (SocketTimeoutException ex){
ex.printStackTrace();
}
catch (IOException ex){
ex.printStackTrace();
}
catch (Exception ex){
ex.printStackTrace(System.out);
}
finally{
try{
if ( dbconn != null ){
dbconn.close();
}
else{
System.out.println("dbConn is null in finally close");
}
}
catch(SQLException ex){
ex.printStackTrace();
}
try{
if ( writeBuffer != null ){
writeBuffer.close();
}
else{
System.out.println("writeBuffer is null in finally close");
}
}
catch(IOException ex){
ex.printStackTrace(System.out);
}
}
}