gpt4 book ai didi

java - 使用 JDBC 的内存泄漏应用程序

转载 作者:可可西里 更新时间:2023-11-01 08:52:08 25 4
gpt4 key购买 nike

我正在使用 mysql-connector-java-5.1.21 并且我遇到了内存泄漏,内存分析器怀疑是 java.lang.Class 和最大的实例 mysql。 jdbc 出现了。我已经检查了代码并确保所有连接、结果和语句都已正确关闭,但我仍然遇到泄漏。

1,529 instances of "java.lang.Class", loaded by "<system class loader>" occupy 711,632 (41.68%) bytes. 

Biggest instances:
•class com.mysql.jdbc.NonRegisteringDriver @ 0x381323f8 - 97,400 (5.70%) bytes.
•class java.io.ObjectStreamClass$Caches @ 0x3d070568 - 91,872 (5.38%) bytes.
•class java.lang.System @ 0x3d03da20 - 67,224 (3.94%) bytes.
•class com.mysql.jdbc.SingleByteCharsetConverter @ 0x382a7438 - 66,032 (3.87%) bytes.
•class java.lang.ref.Finalizer @ 0x3d03e260 - 65,888 (3.86%) bytes.
•class com.sun.org.apache.xerces.internal.util.XMLChar @ 0x380bc528 - 65,592 (3.84%) bytes.
•class com.mysql.jdbc.ConnectionPropertiesImpl @ 0x381ab5f8 - 32,456 (1.90%) bytes.

代码在一个有延迟的循环中运行。目前代码在每个时间间隔打开一个连接。我应该只打开一个连接并将其传递给我的方法吗?无论哪种方式,我都不确定为什么会导致泄漏。感谢您的帮助。

这是一些代码,它应该能让您很好地了解我是如何使用 jdbc 和 mysql 的。

    try {


url+=database+"?zeroDateTimeBehavior=convertToNull";
// LatestTime in SQL table defaults 0000-00-00 00:00:00 which java can't handle. zeroDateTimeBehaviour=convertToNull cause JDBC to null for a zero date.

Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(url,user,password);
System.out.println(CurrentTime()+": "+"Connected to "+database);
}
catch (Exception e)
{

System.err.println(CurrentTime()+": "+e.getMessage());
System.err.println(CurrentTime()+": "+"Unable to Connect");
}
finally
{
if (conn!=null)
{
try {
// Create Statements for SQL queries
Statement query= conn.createStatement();

// Get all records from phonelog which have yet to be processed
query.executeQuery("SELECT * from phonelog where Recordnum>"+Recordnum);
ResultSet rs = query.getResultSet();

// Process each row from query result
while (rs.next()) {
}
JDBCHelper.close(rs);

String plupdate="update Counters set value='"+Recordnum+"' where name='plposition'";
submit.executeUpdate(plupdate);
JDBCHelper.close(query);
}
catch (SQLException SQLe) {
System.err.println(CurrentTime()+": "+SQLe.getMessage());
}

JDBCHelper.close(conn);

System.out.println (CurrentTime()+": "+"Disconnected");
}
}

最佳答案

Java 将创建对象并增加内存直到它接近 -Xmx 最大堆大小设置,然后它将运行垃圾收集以释放空间。您应该使用 -Xmx 设置启动以控制 JVM 可以使用多少内存。您还应该知道,默认情况下,Connector/J JDBC 驱动程序会将整个结果缓冲到内存中。

关于java - 使用 JDBC 的内存泄漏应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12240899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com