Tag: 垃圾收集

Java中的循环引用

给定一个以复杂的,循环的方式相互引用的类实例的聚合:垃圾收集器可能无法释放这些对象吗? 我隐约记得过去这是JVM中的一个问题,但是我认为这在多年前就已经解决了。 然而,一些调查显示,我现在正面临一个循环引用,就是造成内存泄露的原因。 注:我一直觉得JVM有能力解决循环引用,从内存中释放这些“垃圾岛”。 不过,我只是提出这个问题,看是否有人发现任何例外。

如何在Java中释放内存?

有没有一种方法来释放Java中的内存,类似于C的free()函数? 或者是设置对象为空,并依靠GC唯一的select?

MATLAB的垃圾收集器?

你的心智模式是什么? 它是如何实现的? 它有哪些优点和缺点? MATLAB GC与Python GC ? 我有时会看到奇怪的性能瓶颈时使用MATLAB嵌套function,否则无害的代码,我相信这是因为GC。 垃圾收集器是虚拟机的一个重要组成部分,Mathworks并不公开。 我的问题是关于MATLAB自己的堆和GC! 不是关于处理Java / COM对象/防止“内存不足”错误/分配堆栈variables。 编辑:第一个回答实际上是元回答“我为什么要在意?”。 我很在乎,因为GC在实现链表或MVC模式时显现出来。

在java中,什么时候一个对象变得不可达?

在java中,什么是不可达对象? 什么时候该对象变得无法访问? 在学习垃圾收集的时候,我无法理解这个概念。 任何人都可以提供任何想法的例子?

正确实施IDisposable

在我的课程中,我实现了IDisposable,如下所示: public class User : IDisposable { public int id { get; protected set; } public string name { get; protected set; } public string pass { get; protected set; } public User(int UserID) { id = UserID; } public User(string Username, string Password) { name = Username; pass = Password; } // Other functions […]

Java垃圾收集器 – 它什么时候收集?

什么是什么决定垃圾收集器实际收集的时间? 这是否发生在一定的时间或一定量的内存已经用完之后? 还是还有其他因素?

为什么大对象堆,为什么我们在意?

我已阅读关于世代和大对象堆。 但我仍然不明白什么是大对象堆的意义(或好处)? 如果CLR只是依赖第二代(考虑到Gen0和Gen1的阈值对处理Large对象来说很小),那么会出现什么问题(在性能或内存方面)呢?

为什么System.Timers.Timer存活GC,但不是System.Threading.Timer?

看来, System.Timers.Timer实例通过某种机制保持活动,但System.Threading.Timer实例不是。 示例程序,具有周期性的System.Threading.Timer和自动重置System.Timers.Timer : class Program { static void Main(string[] args) { var timer1 = new System.Threading.Timer( _ => Console.WriteLine("Stayin alive (1)…"), null, 0, 400); var timer2 = new System.Timers.Timer { Interval = 400, AutoReset = true }; timer2.Elapsed += (_, __) => Console.WriteLine("Stayin alive (2)…"); timer2.Enabled = true; System.Threading.Thread.Sleep(2000); Console.WriteLine("Invoking GC.Collect…"); GC.Collect(); Console.ReadKey(); } […]

防止.NET垃圾收集很短的时间

我有一个处理大量数据的高性能应用程序。 它在很短的时间内接收,分析和丢弃大量的信息。 这导致我目前正试图优化,但也会导致次要问题的相当数量的对象stream失。 当垃圾收集开始时,可​​能会导致一些长时间的延迟,因为它会清理一些东西(我的意思是10秒到100毫秒)。 99%的时间是可以接受的,但是对于大约1-2分钟的短时窗口,我需要绝对确保垃圾收集不会造成延迟。 我知道这些时间会在什么时候发生,我只是需要一种方法来确保垃圾收集在这段时间内不会发生。 该应用程序是使用.NET 4.0 Framework在C#中编写的,如果重要,则使用托pipe代码和非托pipe代码。 我的问题是 是否有可能暂停垃圾收集整个程序? 是否有可能使用System.GC.Collect()在窗口之前强制垃圾收集,我需要免费的垃圾收集,如果我做了多久,我会成为垃圾收集免费? 人们对减less垃圾收集整体需求有什么build议? 注 – 这个系统相当复杂,有很多不同的组件。 我希望避免去一个方法,我必须在程序的每个类上实现一个自定义的IDisposable接口。

finalize()在Java 8中调用强可到达的对象

我们最近将我们的消息处理应用程序从Java 7升级到了Java 8.自从升级之后,我们偶然发现一个stream正在被读取时closures的exception。 日志logging显示终结器线程正在调用持有stream的对象的finalize() (它依次closuresstream)。 代码的基本概述如下: MIMEWriter writer = new MIMEWriter( out ); in = new InflaterInputStream( databaseBlobInputStream ); MIMEBodyPart attachmentPart = new MIMEBodyPart( in ); writer.writePart( attachmentPart ); MIMEWriter和MIMEBodyPart是本土MIME / HTTP库的一部分。 MIMEBodyPart扩展HTTPMessage ,它具有以下内容: public void close() throws IOException { if ( m_stream != null ) { m_stream.close(); } } protected void finalize() { try […]