[freenet-cvs] r19729 - trunk/freenet/src/freenet/node

j16sdiz at freenetproject.org j16sdiz at freenetproject.org
Sun May 4 11:51:27 UTC 2008


Author: j16sdiz
Date: 2008-05-04 11:51:27 +0000 (Sun, 04 May 2008)
New Revision: 19729

Modified:
   trunk/freenet/src/freenet/node/MemoryChecker.java
Log:
oomhook: check average free memory < 4MiB for 1.5 minutes


Modified: trunk/freenet/src/freenet/node/MemoryChecker.java
===================================================================
--- trunk/freenet/src/freenet/node/MemoryChecker.java	2008-05-04 10:33:57 UTC (rev 19728)
+++ trunk/freenet/src/freenet/node/MemoryChecker.java	2008-05-04 11:51:27 UTC (rev 19729)
@@ -6,11 +6,14 @@
 import freenet.support.Logger;
 import freenet.support.OOMHandler;
 import freenet.support.SizeUtil;
+import freenet.support.math.RunningAverage;
+import freenet.support.math.SimpleRunningAverage;
 
 public class MemoryChecker implements Runnable {
 	private volatile boolean goon = false;
 	private final PacketSender ps;
 	private int aggressiveGCModificator;
+	private RunningAverage avgFreeMemory;
 	
 	public MemoryChecker(PacketSender ps, int modificator){
 		this.ps = ps;
@@ -47,18 +50,31 @@
 		
 		Logger.normal(this, "Memory in use: "+SizeUtil.formatSize((totalMemory-freeMemory)));
 		
-		if (freeMemory < 4 * 1024 * 1024 // free memory < 4 MB
-		        && (totalMemory == maxMemory || maxMemory == Long.MAX_VALUE)) { // we have allocated max memory
-			Logger.normal(this, "Reached threshold, checking for low memory ...");
-			System.gc();
-			System.runFinalization();
-			totalMemory = r.totalMemory();
-			freeMemory = r.freeMemory();
-			maxMemory = r.maxMemory();
-			if (freeMemory < 4 * 1024 * 1024 // free memory < 4 MB
-			        && (totalMemory == maxMemory || maxMemory == Long.MAX_VALUE)) { // we have allocated max memory
-				Logger.error(this, "memory too low, trying to free some");
-				OOMHandler.lowMemory();
+		if (totalMemory == maxMemory || maxMemory == Long.MAX_VALUE) {
+			// jvm have allocated maximum memory
+			// totalMemory never decrease, so check it only for once
+			if (avgFreeMemory == null)
+				avgFreeMemory = new SimpleRunningAverage(3, freeMemory);
+			else
+				avgFreeMemory.report(freeMemory);
+			
+			if (avgFreeMemory.countReports() >= 3 && avgFreeMemory.currentValue() < 4 * 1024 * 1024) {//  average free memory < 4 MB
+				Logger.normal(this, "Reached threshold, checking for low memory ...");
+				System.gc();
+				System.runFinalization();
+
+				try {
+					Thread.sleep(10); // Force a context switch, finalization need a CS to complete
+				} catch (InterruptedException e) {
+				}
+
+				freeMemory = r.freeMemory();
+				avgFreeMemory.report(freeMemory);
+				
+				if (freeMemory < 4 * 1024 * 1024) { // *current* free memory < 4 MB
+					Logger.error(this, "Memory too low, trying to free some");
+					OOMHandler.lowMemory();
+				} 
 			}
 		}
 		




More information about the cvs mailing list