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();
+ }
}
}