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 .我错了吗?
我正在开发一款游戏,我的扫描仪遇到了一些问题.我的资源泄漏扫描程序从未关闭过.
但我以为我的扫描仪在没有关闭它之前就已经工作了.但现在不是.有人可以帮帮我吗?
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) 我在遗留应用程序中使用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 Threading,并正在研究一些使用ManualResetEvent的代码.我在互联网上找到了很多代码示例.但是,在阅读WaitHandle的文档时,我看到以下内容:
WaitHandle实现了Dispose模式.请参阅实现Finalize和Dispose以清理非托管资源.
没有任何样本似乎在他们创建的ManualResetEvent对象上调用.Close(),甚至是来自pfxteam博客的好的Recursion and Concurrency文章(编辑 - 这有一个我错过的使用块).这只是示例疏忽,还是不需要?我很好奇,因为WaitHandle"封装了特定于操作系统的对象",因此很容易出现资源泄漏.
在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的问题?
有一个GDI泄漏的应用程序最终将达到10,000个分配的GDI对象并崩溃.我尝试将GDIProcessHandleQuota增加到20,000,但程序在达到10,000个对象时仍然崩溃.我们目前正在努力修补此漏洞,但出于好奇 - 是否有办法增加单个流程的GDI限制?或者10k个人应用程序的硬限制?
有几种方法可以让开发人员在.NET中无意中泄漏资源.我认为将它们集中在一个地方会很有用.
请为每个项目添加一个答案,以便最好的投票:)
该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
我有一个带有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) 我的.net服务通过在Main()循环退出之前调用finally块中的resourceName.Dispose()来清除所有非托管资源.
我真的必须这样做吗?
我是否认为我不能泄漏任何资源,因为这个过程正在结束?Windows将关闭任何不再使用的句柄,对吧?
resource-leak ×10
.net ×3
c# ×3
java ×3
dispose ×2
gdi ×2
.net-1.1 ×1
ado.net ×1
bitmap ×1
cancellation ×1
eclipse ×1
handle ×1
java-8 ×1
java-stream ×1
memory ×1
memory-leaks ×1
python ×1
stream ×1
waithandle ×1
windows-7 ×1
wpf ×1