Bug 11098 - Replacing items in System.Web.Caching.Cache causes memory leaks
Summary: Replacing items in System.Web.Caching.Cache causes memory leaks
Status: NEW
Alias: None
Product: Class Libraries
Classification: Mono
Component: System.Web (show other bugs)
Version: 2.10.x
Hardware: PC Linux
: --- normal
Target Milestone: Untriaged
Assignee: Bugzilla
URL:
Depends on:
Blocks:
 
Reported: 2013-03-12 22:39 UTC by randyficker
Modified: 2015-09-21 11:05 UTC (History)
2 users (show)

See Also:
Tags:
Is this bug a regression?: ---
Last known good build:


Attachments

Description randyficker 2013-03-12 22:39:52 UTC
The following code causes memory to leak forever until the program eventually crashes:

static void Main(string[] args)
{
	var cache = HttpRuntime.Cache;

	while (true)
	{
		//Keep inserting new arrays into the cache with the same key
		cache.Insert("key", new byte[50000], null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(1));

		Console.WriteLine("Used memory = " + GC.GetTotalMemory(true));
		Thread.Sleep(100);
	}
}

This happens because when you insert into the cache, it never releases its reference to the previous object you're replacing.  The bug can be worked-around by calling Remove("key") before inserting.

I verified it leaks in mono 2.10.8.1, but I'm pretty sure it leaks in trunk too.  It doesn't leak on Microsoft's implementation of Cache.  The issue does not have anything to do with what garbage collector is used -- the caching code seems to  keep references to the objects.

I found this when porting an asp.net application to mod_mono.  This application frequently updated cache items with new objects, and as a result, this bug caused mono to leak away all 4gb of the server's memory after just a couple hours.

Note You need to log in before you can comment on or make changes to this bug.