internal void Dispose() { SRefMultiple sref = _sizedRef; if (sref != null && Interlocked.CompareExchange(ref _sizedRef, null, sref) == sref) { sref.Dispose(); } }
int GetCurrentPressure() { // Call GetUpdatedTotalCacheSize to update the total // cache size, if there has been a recent Gen 2 Collection. // This update must happen, otherwise the CacheManager won't // know the total cache size. int gen2Count = GC.CollectionCount(2); SRefMultiple sref = _sizedRef; if (gen2Count != _gen2Count && sref != null) { // update _gen2Count _gen2Count = gen2Count; // the SizedRef is only updated after a Gen2 Collection // increment the index (it's either 1 or 0) Debug.Assert(SAMPLE_COUNT == 2); _idx = _idx ^ 1; // remember the sample time _cacheSizeSampleTimes[_idx] = DateTime.UtcNow; // remember the sample value _cacheSizeSamples[_idx] = sref.ApproximateSize; #if DBG Debug.Trace("CacheMemory", "SizedRef.ApproximateSize=" + _cacheSizeSamples[_idx]); #endif } // if there's no memory limit, then there's nothing more to do if (_memoryLimit <= 0) { return(0); } long cacheSize = _cacheSizeSamples[_idx]; // use _memoryLimit as an upper bound so that pressure is a percentage (between 0 and 100, inclusive). if (cacheSize > _memoryLimit) { cacheSize = _memoryLimit; } // PerfCounter: Cache Percentage Process Memory Limit Used // = memory used by this process / process memory limit at pressureHigh // Set private bytes used in kilobytes because the counter is a DWORD // BUGBUG: need to update description for this counter, or deprecate and introduce a new one for this usage PerfCounters.SetCounter(AppPerfCounter.CACHE_PERCENT_PROC_MEM_LIMIT_USED, (int)(cacheSize >> KILOBYTE_SHIFT)); int result = (int)(cacheSize * 100 / _memoryLimit); return(result); }
internal CacheSizeMonitor(SRefMultiple sizedRef) { _sizedRef = sizedRef; _gen2Count = GC.CollectionCount(2); _cacheSizeSamples = new long[SAMPLE_COUNT]; _cacheSizeSampleTimes = new DateTime[SAMPLE_COUNT]; _pressureHigh = 99; _pressureMiddle = 98; _pressureLow = 97; InitHistory(); }
internal CacheMemorySizePressure(SRefMultiple sizedRef) { _sizedRef = sizedRef; _gen2Count = GC.CollectionCount(2); _cacheSizeSamples = new long[SAMPLE_COUNT]; _cacheSizeSampleTimes = new DateTime[SAMPLE_COUNT]; _pressureHigh = 99; _pressureMiddle = 98; _pressureLow = 97; _startupTime = DateTime.UtcNow; InitHistory(); }
internal void Dispose() { SRefMultiple sref = _sizedRef; if (sref != null && Interlocked.CompareExchange(ref _sizedRef, null, sref) == sref) { sref.Dispose(); } ApplicationManager appManager = HostingEnvironment.GetApplicationManager(); if (appManager != null) { long sizeUpdate = (0 - _cacheSizeSamples[_idx]); appManager.GetUpdatedTotalCacheSize(sizeUpdate); } }
internal CacheCommon() { _cachePublic = new Cache(0); _srefMultiple = new SRefMultiple(); _cacheMemoryStats = new CacheMemoryStats(_srefMultiple); _enableMemoryCollection = true; _enableExpiration = true; }
internal CacheMemoryStats(SRefMultiple sizedRef) { _pressureTotalMemory = new CacheMemoryTotalMemoryPressure(); _pressureCacheSize = new CacheMemorySizePressure(sizedRef); }
internal CacheMemoryStats(SRefMultiple sizedRef) { _pressureTotalMemory = new CacheMemoryTotalMemoryPressure(); _pressureCacheSize = new CacheMemorySizePressure(sizedRef); }
internal CacheMemorySizePressure(SRefMultiple sizedRef) { _sizedRef = sizedRef; _gen2Count = GC.CollectionCount(2); _cacheSizeSamples = new long[SAMPLE_COUNT]; _cacheSizeSampleTimes = new DateTime[SAMPLE_COUNT]; _pressureHigh = 99; _pressureMiddle = 98; _pressureLow = 97; _startupTime = DateTime.UtcNow; InitHistory(); }