在用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逐行读取大约5-6 GB的大文本文件。 我怎样才能快速做到这一点?
我执行我的JUnittesting时遇到此错误消息: java.lang.OutOfMemoryError: GC overhead limit exceeded 我知道什么是OutOfMemoryError ,但GC开销限制是什么意思? 我该如何解决这个问题?
通过阅读MSDN文档 ,我知道IDisposable接口的“主要”使用是清理非托pipe资源。 对我来说,“非托pipe”意味着像数据库连接,套接字,窗口句柄等东西。但是,我已经看到代码实施Dispose()方法释放托pipe资源,这似乎对我来说是多余的,因为垃圾收集器应该照顾你的。 例如: 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; } 我的问题是,这是否使得由MyCollection使用的垃圾回收器可用内存比MyCollection更快? 编辑 :到目前为止,人们已经发布了一些使用IDisposable清理非托pipe资源(如数据库连接和位图)的好例子。 但是,假设上面的代码中的_theList包含了一百万个string,并且您现在想要释放该内存,而不是等待垃圾收集器。 上面的代码会完成这个吗?
给定一个仅在程序设置中使用的假设实用程序类: class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params… params) { // do stuff with myObject and params… } } myObject会在不再使用的时候被垃圾回收,还是会在程序的整个生命周期中继续使用?
我搜索了,但是我还没有很好地理解这三个概念。 何时必须使用动态分配(在堆中)以及它的真正优势是什么? 什么是静态和堆栈的问题? 我可以编写一个完整的应用程序,而不需要在堆中分配变量吗? 我听说其他语言包含一个“垃圾收集器”,所以你不必担心内存。 垃圾收集器是做什么的? 你可以自己操纵记忆,你不能使用这个垃圾回收器吗? 有人对我说,有了这个声明: int * asafe=new int; 我有一个“指针指针”。 这是什么意思? 它不同于: asafe=new int; ?
如果我有以下代码: MyClass pClass = new MyClass(); pClass.MyEvent += MyFunction; pClass = null; pClass会被垃圾收集吗? 还是会在发生事件的时候继续运行呢? 为了允许垃圾收集,我需要执行以下操作吗? MyClass pClass = new MyClass(); pClass.MyEvent += MyFunction; pClass.MyEvent -= MyFunction; pClass = null;
有人可以简单地向我解释ARC是如何工作的吗? 我知道这是垃圾收集不同,但我只是想知道它是如何工作的。 另外,如果ARC在不妨碍性能的情况下执行GC的操作,那么Java为什么使用GC? 为什么不使用ARC呢?