标签: resource-leak

为什么Files.lines(和类似的Streams)不会自动关闭?

Stream的javadoc说明:

Streams有一个BaseStream.close()方法并实现AutoCloseable,但几乎所有的流实例实际上都不需要在使用后关闭.通常,只有源为IO通道的流(例如Files.lines(Path,Charset)返回的流)才需要关闭.大多数流都由集合,数组或生成函数支持,不需要特殊的资源管理.(如果流确实需要关闭,则可以在try-with-resources语句中将其声明为资源.)

因此,绝大多数情况下,人们可以在单行中使用Streams,collection.stream().forEach(System.out::println);但是对于Files.lines和其他资源支持的流,必须使用try-with-resources语句或泄漏资源.

这让我觉得容易出错并且不必要.因为Streams只能迭代一次,所以在我看来,没有一个迭代后Files.lines不应该关闭输出的情况,因此实现应该只是在任何终端操作结束时隐式调用close .我错了吗?

java stream resource-leak java-8 java-stream

48
推荐指数
3
解决办法
9075
查看次数

扫描仪永远不会关闭

我正在开发一款游戏,我的扫描仪遇到了一些问题.我的资源泄漏扫描程序从未关闭过.

但我以为我的扫描仪在没有关闭它之前就已经工作了.但现在不是.有人可以帮帮我吗?

import java.util.Scanner;

public class Main {

    public static final boolean CHEAT = true;

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int amountOfPlayers;
        do {
            System.out.print("Select the amount of players (1/2): ");
            while (!scanner.hasNextInt()) {
                System.out.println("That's not a number!");
                scanner.next(); // this is important!
        }

        amountOfPlayers = scanner.nextInt();
        while ((amountOfPlayers <= 0) || (amountOfPlayers > 2));
        System.out.println("You've selected " + amountOfPlayers+" player(s)."); 
    }
}
Run Code Online (Sandbox Code Playgroud)

java resource-leak java.util.scanner

26
推荐指数
2
解决办法
16万
查看次数

抛出异常时,DataAdapter.Fill()是否会关闭其连接?

我在遗留应用程序中使用ADO.NET(.NET 1.1).我知道DataAdapter.Fill()如果在给DataAdapter之前没有手动打开连接,则会打开和关闭连接.

我的问题:如果.Fill()导致异常,它是否也会关闭连接?(由于无法访问SQL Server,或者其他).它是否泄漏连接或是否具有内置的Finally子句以确保连接正在关闭.

代码示例:

Dim cmd As New SqlCommand
Dim da As New SqlDataAdapter
Dim ds As New DataSet
cmd.Connection = New SqlConnection(strConnection)
cmd.CommandText = strSQL
da.SelectCommand = cmd
da.Fill(ds)
Run Code Online (Sandbox Code Playgroud)

.net .net-1.1 ado.net sqlconnection resource-leak

17
推荐指数
1
解决办法
2万
查看次数

我需要在ManualResetEvent上调用Close()吗?

我一直在阅读.NET Threading,并正在研究一些使用ManualResetEvent的代码.我在互联网上找到了很多代码示例.但是,在阅读WaitHandle的文档时,我看到以下内容:

WaitHandle实现了Dispose模式.请参阅实现Finalize和Dispose以清理非托管资源.

没有任何样本似乎在他们创建的ManualResetEvent对象上调用.Close(),甚至是来自pfxteam博客的好的Recursion and Concurrency文章(编辑 - 这有一个我错过的使用块).这只是示例疏忽,还是不需要?我很好奇,因为WaitHandle"封装了特定于操作系统的对象",因此很容易出现资源泄漏.

c# multithreading dispose resource-leak waithandle

15
推荐指数
2
解决办法
9659
查看次数

eclipse中的资源泄漏警告

Eclipse我收到警告Resource leak: 'ps' is not closed at this location,我不明白.

在我的Java代码中,我将"ps"声明为Prepared Statement,并且我多次使用(并关闭)它.然后我有以下顺序:

try {
    if(condition) {
        ps = c.prepareStatement("UPDATE 1 ...");
    } else {
        ps = c.prepareStatement("UPDATE 2 ...");
    }
    ps.executeUpdate();
} catch (SQLException e) {
    // exception handling
} finally {
    if (null != ps) 
        try { 
            ps.close(); 
        } catch (SQLException e) { 
            // exception handling
        };
}
Run Code Online (Sandbox Code Playgroud)

"资源泄漏" - 警告来自其他部分的"更新" - 声明.如果我ps = null在启动try块之前设置,则没有警告.

如果第二个UPDATE-Statement被注释掉,则不会显示警告.

这是理解还是java/eclipse的问题?

java eclipse resource-leak

15
推荐指数
2
解决办法
2万
查看次数

Windows 7中一个进程的GDI对象的上限是多少?

有一个GDI泄漏的应用程序最终将达到10,000个分配的GDI对象并崩溃.我尝试将GDIProcessHandleQuota增加到20,000,但程序在达到10,000个对象时仍然崩溃.我们目前正在努力修补此漏洞,但出于好奇 - 是否有办法增加单个流程的GDI限制?或者10k个人应用程序的硬限制?

gdi resource-leak windows-7

14
推荐指数
2
解决办法
3万
查看次数

.NET资源漏洞陷入困境

有几种方法可以让开发人员在.NET中无意中泄漏资源.我认为将它们集中在一个地方会很有用.

请为每个项目添加一个答案,以便最好的投票:)

.net memory memory-leaks resource-leak

13
推荐指数
4
解决办法
923
查看次数

异步上下文管理器是否需要保护它们的清理代码不被取消?

问题(我认为)

contextlib.asynccontextmanager文档给出了这样的例子:

@asynccontextmanager
async def get_connection():
    conn = await acquire_db_connection()
    try:
        yield conn
    finally:
        await release_db_connection(conn)
Run Code Online (Sandbox Code Playgroud)

在我看来,这可能会泄漏资源。如果此代码的任务在此代码在其行上时被取消await release_db_connection(conn),则发布可能会中断。在asyncio.CancelledError将从某处内向上传播finally块,从而防止随后的清理代码运行。

因此,实际上,如果您正在实现一个处理超时请求的 Web 服务器,则在完全错误的时间触发超时可能会导致数据库连接泄漏。

完整的可运行示例

import asyncio
from contextlib import asynccontextmanager

async def acquire_db_connection():
    await asyncio.sleep(1)
    print("Acquired database connection.")
    return "<fake connection object>"

async def release_db_connection(conn):
    await asyncio.sleep(1)
    print("Released database connection.")

@asynccontextmanager
async def get_connection():
    conn = await acquire_db_connection()
    try:
        yield conn
    finally:
        await release_db_connection(conn)

async def do_stuff_with_connection():
    async with get_connection() as conn:
        await …
Run Code Online (Sandbox Code Playgroud)

python resource-cleanup resource-leak cancellation python-asyncio

13
推荐指数
1
解决办法
231
查看次数

RenderTargetBitmap GDI在Master-Details视图中处理泄漏

我有一个带有Master-Details视图的应用程序.当您从"主"列表中选择一个项目时,它会使用一些图像(通过RenderTargetBitmap创建)填充"详细信息"区域.

每次我从列表中选择一个不同的主项目时,我的应用程序使用的GDI句柄数量(在Process Explorer中报告)会上升 - 并且最终会在使用的10,000个GDI句柄中翻倒(或有时会锁定).

我对如何解决这个问题感到茫然,所以对于我做错了什么建议(或者只是提供如何获取更多信息的建议)将不胜感激.

我在一个名为"DoesThisLeak"的新WPF应用程序(.NET 4.0)中将我的应用程序简化为以下内容:

在MainWindow.xaml.cs中

public partial class MainWindow : Window
{
    public MainWindow()
    {
        ViewModel = new MasterViewModel();
        InitializeComponent();
    }

    public MasterViewModel ViewModel { get; set; }
}

public class MasterViewModel : INotifyPropertyChanged
{
    private MasterItem selectedMasterItem;

    public IEnumerable<MasterItem> MasterItems
    {
        get
        {
            for (int i = 0; i < 100; i++)
            {
                yield return new MasterItem(i);
            }
        }
    }

    public MasterItem SelectedMasterItem
    {
        get { return selectedMasterItem; }
        set
        {
            if (selectedMasterItem != value) …
Run Code Online (Sandbox Code Playgroud)

c# wpf gdi bitmap resource-leak

12
推荐指数
1
解决办法
5419
查看次数

为什么在main()退出之前调用Dispose()?

我的.net服务通过在Main()循环退出之前调用finally块中的resourceName.Dispose()来清除所有非托管资源.

我真的必须这样做吗?

我是否认为我不能泄漏任何资源,因为这个过程正在结束?Windows将关闭任何不再使用的句柄,对吧?

.net c# dispose handle resource-leak

11
推荐指数
2
解决办法
2397
查看次数