Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java deque/prepared语句内存泄漏_Java_Database_Memory_Memory Leaks_Prepared Statement - Fatal编程技术网

Java deque/prepared语句内存泄漏

Java deque/prepared语句内存泄漏,java,database,memory,memory-leaks,prepared-statement,Java,Database,Memory,Memory Leaks,Prepared Statement,下面的一段代码会产生内存泄漏,知道是哪一部分吗 (一) 根据实现的不同,从迭代器中断,可能会导致迭代器自身无法完成,并阻止自身释放绑定的资源,从而导致内存泄漏。您也可能从不清理数据块,这会导致数据块随时间呈线性增长。根据实现情况,从迭代器中断可能会导致迭代器自身无法完成,并阻止其释放绑定的资源,从而导致内存泄漏。也有可能您从未清理过数据,这会导致数据大小随着时间的推移呈线性增长。我猜是Instance.getWorld().getDB().getConnection()在这里,您获得了一个连接,

下面的一段代码会产生内存泄漏,知道是哪一部分吗

(一)


根据实现的不同,
从迭代器中断
,可能会导致迭代器自身无法完成,并阻止自身释放绑定的资源,从而导致内存泄漏。您也可能从不清理数据块,这会导致数据块随时间呈线性增长。

根据实现情况,从迭代器中断
可能会导致迭代器自身无法完成,并阻止其释放绑定的资源,从而导致内存泄漏。也有可能您从未清理过数据,这会导致数据大小随着时间的推移呈线性增长。

我猜是
Instance.getWorld().getDB().getConnection()
在这里,您获得了一个连接,并且只存储了对它创建的准备好的语句的引用。
这意味着当代码使用准备好的语句完成时,您不会释放连接,并且(假设它来自连接池)连接池不会回收连接,但它会在其映射中保留对它的引用。

我猜它是
实例。getWorld().getDB().getConnection()
在这里,您可以获得一个连接,并且只存储对它创建的准备好的语句的引用。

这意味着,当代码使用准备好的语句完成时,并且(假设它来自连接池)连接池不回收连接时,您不会释放连接,但它会在地图中保留对它的引用。

仅仅看问题中的一个小片段,就有太多的未知数,而这些片段甚至都不是完整的代码。也许你可以提供更多的信息。我把这些片段删减到只包含所需内容的最低限度。快照类:public snapshot(Player owner){this.owner=owner;this.eventTime=System.currentTimeMillis();}public long getTimestamp(){return eventTime;}如果有任何内容仍然模糊,提问,这样我就可以解释。仅仅看问题中的一个小片段,就有太多的未知数,而这些片段甚至都不是完整的代码。也许你可以提供更多的信息。我把这些片段删减到只包含所需内容的最低限度。快照类:publicsnashot(playerowner){this.owner=owner;this.eventTime=System.currentTimeMillis();}public long getTimestamp(){returneventtime;}如果还有什么不清楚的地方,请询问,这样我就可以解释了。我会试试看。但是,deque被正确地清理了。旁白,我如何实现一个必须打破的下降循环?Esko,你能提供一个来源吗?我从没听说过。当然,我很想听到Peeter关于干净地中断的问题的答案。CPerkins:是和否,Java的默认迭代器工作正常,但是我知道一个事实,一些定制迭代器如果没有正确地“完成”,就会导致这类问题。我(我的一个朋友)遇到的实际情况是使用一些流行的ORM映射工具,但我记不起是哪一个,所以此时无法提供链接作为可靠的证据。如果彻底打破,假设迭代器期望完全迭代,这将是一种资源浪费,我所能想到的就是有一个单独的布尔值来控制实际的读取操作,如果发生“中断”,布尔值将被翻转,迭代器的其余部分将被读取,而不做任何其他操作。我将尝试这样做。但是,deque被正确地清理了。旁白,我如何实现一个必须打破的下降循环?Esko,你能提供一个来源吗?我从没听说过。当然,我很想听到Peeter关于干净地中断的问题的答案。CPerkins:是和否,Java的默认迭代器工作正常,但是我知道一个事实,一些定制迭代器如果没有正确地“完成”,就会导致这类问题。我(我的一个朋友)遇到的实际情况是使用一些流行的ORM映射工具,但我记不起是哪一个,所以此时无法提供链接作为可靠的证据。如果彻底打破,假设迭代器期望完全迭代,这将是一种资源浪费,我所能想到的就是有一个单独的布尔值来控制实际的读取操作,如果发生“中断”,布尔值将被翻转,迭代器的其余部分将被读取,而不做任何其他操作。代码从来没有使用过预处理语句,每次发送新报告时,它都会被重复使用。对准备好的语句执行executeUpdate()后,它是否准备好立即重新使用?或者我应该以某种方式清理它吗?我的意思是使用.getConnection()检索的连接对象永远不会被释放。当准备好的语句不再使用时,应该释放连接。由于这些方法是静态的,因此这可能是过程的结束。如果这是web应用程序的一部分,并且连接来自应用程序服务器的连接池,则表明存在泄漏。谢谢,这似乎是问题所在。代码从未使用准备好的语句,每次发送新报告时,它都会被重复使用。对准备好的语句执行executeUpdate()后,它是否准备好立即重新使用?或者我应该以某种方式清理它吗?我的意思是使用.getConnection()检索的连接对象永远不会被释放。当准备好的语句不再使用时,应该释放连接。由于这些方法是静态的,因此这可能是过程的结束。如果这是web应用程序的一部分,并且连接来自应用程序服务器的连接池,那么您就泄漏了。谢谢,这似乎就是问题所在。
private Deque<Snapshot> snapshots = new LinkedList<Snapshot>();

Iterator<Snapshot> i = world.getSnapshots().descendingIterator();
    while (i.hasNext()) {
        Snapshot s = i.next();
        if (curTime - s.getTimestamp() > 60000) {
            i.remove();
        } else {
            break;
        }
    }
public static void initilizePreparedStatements() {
        try {
            insertNewReportRow = Instance.getWorld().getDB().getConnection().prepareStatement("INSERT INTO `rsca2_reports` (`from`, `about`, `time`, `reason`, `snapshot_from`,`snapshot_about`,`chatlogs`, `from_x`, `from_y`, `about_x`, `about_y`) VALUES(?,?,?,?,?,?,?,?,?,?,?)");
        } catch (SQLException e) {
            e.printStackTrace();
            Logger.error(e);
        }
    }
    public synchronized static void submitReport() {
        /*removed*/
            try {
                    insertNewReportRow.setLong(1, from);
                    insertNewReportRow.setLong(2, about); 
                    insertNewReportRow.setLong(3, time); 
                    insertNewReportRow.setInt(4, reason);
                    insertNewReportRow.setString(5, snapshot_from);
                    insertNewReportRow.setString(6, snapshot_about);
                    insertNewReportRow.setString(7, chatlog);
                    insertNewReportRow.setInt(8, f.getX());
                    insertNewReportRow.setInt(9, f.getY());
                    insertNewReportRow.setInt(10, a.getX());
                    insertNewReportRow.setInt(11, a.getY());
                    insertNewReportRow.executeUpdate();
                } catch (SQLException e) {
                    e.printStackTrace();
                    Logger.error(e);
                } 
            }