标签: garbage-collection

正确使用IDisposable接口

我从阅读MSDN文档中了解到,IDisposable接口的"主要"用途是清理非托管资源.

对我来说,"非托管"意味着数据库连接,套接字,窗口句柄等等.但是,我已经看到了Dispose()实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该照顾那对你而言.

例如:

public class MyCollection : IDisposable
{
    private List<String> _theList = new List<String>();
    private Dictionary<String, Point> _theDict = new Dictionary<String, Point>();

    // Die, clear it up! (free unmanaged resources)
    public void Dispose()
    {
        _theList.clear();
        _theDict.clear();
        _theList = null;
        _theDict = null;
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是否使得垃圾收集器可以使用的内存MyCollection比通常更快?

编辑:到目前为止,人们已经发布了一些使用IDisposable清理非托管资源(例如数据库连接和位图)的好例子.但是假设_theList在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?

.net c# garbage-collection idisposable

1586
推荐指数
12
解决办法
31万
查看次数

如何使用Java逐行读取大型文本文件?

我需要使用Java逐行读取大约5-6 GB的大文本文件.

我该怎么办?

java io performance file-io garbage-collection

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

错误java.lang.OutOfMemoryError:超出了GC开销限制

我在执行JUnit测试时收到此错误消息:

java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)

我知道它OutOfMemoryError是什么,但GC开销限制意味着什么?我怎么解决这个问题?

java garbage-collection heap-memory out-of-memory

766
推荐指数
13
解决办法
85万
查看次数

是否有Java的析构函数?

是否有Java的析构函数?我似乎无法找到任何关于此的文档.如果没有,我怎样才能达到同样的效果?

为了使我的问题更具体,我正在编写一个处理数据的应用程序,并且规范说应该有一个"重置"按钮,使应用程序恢复到其原始的刚启动状态.但是,除非关闭应用程序或按下重置按钮,否则所有数据都必须为"实时".

作为一名C/C++程序员,我认为实现这一点非常简单.(因此我计划最后实现它.)我构建了我的程序,使得所有'可重置'对象都在同一个类中,这样我就可以在按下重置按钮时销毁所有'实时'对象.

我在想如果我所做的只是取消引用数据并等待垃圾收集器收集它们,如果我的用户反复输入数据并按下重置按钮,是否会出现内存泄漏?我也在想,因为Java作为一种语言非常成熟,应该有办法防止这种情况发生或优雅地解决这个问题.

java garbage-collection destructor

569
推荐指数
11
解决办法
55万
查看次数

Machine.Config在哪里?

我想应用一个更改,以便我可以为我的C#3.5应用程序使用服务器GC设置 - 我可以通过编辑machine.config文件来实现.

唯一的问题是我不知道那是哪里.

如何在多个不同的计算机上以可重复的方式找到此文件的路径

.net garbage-collection

430
推荐指数
4
解决办法
37万
查看次数

在JavaScript中删除对象

我对JavaScript的delete运算符有点困惑.采取以下代码:

var obj = {
    helloText: "Hello World!"
};

var foo = obj;

delete obj;
Run Code Online (Sandbox Code Playgroud)

在执行了这段代码之后,objnull,但foo仍然指的是一个完全相同的对象obj.我猜这个对象是foo指向的同一个对象.

这让我很困惑,因为我期望写作delete obj删除了obj指向内存的对象- 而不仅仅是变量obj.

这是因为JavaScript的垃圾回收工作在保留/释放的基础,所以,如果我没有指向对象的任何其他变量,它从内存中清除?

(顺便说一句,我的测试是在Safari 4中完成的.)

javascript garbage-collection pointers memory-management object

354
推荐指数
5
解决办法
36万
查看次数

什么时候在Java中调用finalize()方法?

我需要知道何时finalize()调用该方法JVM.我创建了一个测试类,当finalize()通过覆盖它来调用方法时,该测试类会写入文件.它没有被执行.谁能告诉我它没有执行的原因?

java methods garbage-collection finalize call

320
推荐指数
8
解决办法
47万
查看次数

为什么调用System.gc()是不好的做法?

回答了关于如何用Java强制释放对象的问题(这个人正在清除一个1.5GB的HashMap)后System.gc(),我被告知System.gc()手动调用是不好的做法,但这些评论并不完全令人信服.此外,似乎没有人敢投票,也没有人回答我的回答.

我被告知这是不好的做法,但后来我也被告知垃圾收集器运行不再系统地停止世界,并且它也可以有效地被JVM用作提示,所以我有点像茫然

我知道JVM在需要回收内存时通常比你知道的要好.我也明白,担心几千字节的数据是愚蠢的.我也明白,甚至数兆字节的数据也不是几年前的数据.但仍然,1.5千兆字节?而且你知道内存中有1.5 GB的数据; 它不像是在黑暗中拍摄.是System.gc()系统性的坏,还是有一点它变得好吗?

所以问题实际上是双重的:

  • 打电话为什么或不是不好的做法System.gc()?它是否仅仅是某些实现中JVM的提示,还是一个完整的收集周期?真的有垃圾收集器实现可以在不停止世界的情况下完成工作吗?请详细说明人们在评论中对我的回答所做的各种断言.
  • 门槛在哪里?打电话是不是一个好主意System.gc(),或者有时候可以接受?如果是这样,那些时候是什么时候?

java garbage-collection

317
推荐指数
7
解决办法
12万
查看次数

Java堆术语:年轻,古老和永久的世代?

我试图理解Java堆术语中年轻,一代永久世代的概念,更具体地说是三代之间的相互作用.

我的问题是:

  • 什么是年轻一代?
  • 什么是老一代?
  • 什么是永久世代?
  • 三代人如何相互作用/相互联系?

java garbage-collection jvm heap-memory

304
推荐指数
4
解决办法
22万
查看次数

你需要处理对象并将它们设置为null吗?

您是否需要处理对象并将它们设置为null,或者当垃圾收集器超出范围时它们是否会将它们清理干净?

.net c# garbage-collection dispose

300
推荐指数
9
解决办法
27万
查看次数