|
From: <tre...@us...> - 2007-09-24 18:33:18
|
Revision: 435
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=435&view=rev
Author: trevorolio
Date: 2007-09-24 11:33:21 -0700 (Mon, 24 Sep 2007)
Log Message:
-----------
Added a test for memory usage and refuses to load template data when we reach a (magic) limit.
Modified Paths:
--------------
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/Log.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/Log.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/Log.java 2007-09-24 07:32:04 UTC (rev 434)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/util/Log.java 2007-09-24 18:33:21 UTC (rev 435)
@@ -1,5 +1,8 @@
package com.ogoglio.util;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+
public class Log {
private static class Logger {
@@ -31,6 +34,12 @@
public void error(Object msg, Throwable t) {
System.err.println(msg + ": " + t);
}
+
+ public void logMemoryUsage() {
+ MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
+ System.out.println("\tHeap: " + (memoryBean.getHeapMemoryUsage().getUsed() / 1024 / 1024f) + "MB / " + (memoryBean.getHeapMemoryUsage().getCommitted() / 1024 / 1024f) + "MB / " + (memoryBean.getHeapMemoryUsage().getMax() / 1024 / 1024f) + "MB");
+ System.out.println("\tNon: " + (memoryBean.getNonHeapMemoryUsage().getUsed() / 1024 / 1024f) + "MB / " + (memoryBean.getNonHeapMemoryUsage().getCommitted() / 1024 / 1024f) + "MB / " + (memoryBean.getNonHeapMemoryUsage().getMax() / 1024 / 1024f) + "MB");
+ }
}
static Logger log = new Logger();
@@ -66,4 +75,8 @@
public static void test(Object msg) {
log.debug("TEST:" + msg);
}
+
+ public static void logMemoryUsage(){
+ log.logMemoryUsage();
+ }
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java 2007-09-24 07:32:04 UTC (rev 434)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DDataManager.java 2007-09-24 18:33:21 UTC (rev 435)
@@ -3,6 +3,8 @@
import java.awt.Image;
import java.io.BufferedInputStream;
import java.io.InputStream;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
import java.util.HashMap;
import java.util.Vector;
@@ -33,6 +35,8 @@
public class J3DDataManager {
+ public static final float MINIMUM_REMAINING_HEAP = 20 * 1024 * 1024; //if we lower this, Firefox crashes when the heap limit is reached
+
public static Appearance DEFAULT_APPEARANCE = new Appearance();
private static Material DEFAULT_MATERIAL = new Material();
@@ -52,8 +56,11 @@
private boolean loadAppearances = true;
- public J3DDataManager(boolean loadAppearances) {
+ private boolean complainedAboutMemory = false;
+
+ public J3DDataManager(boolean loadAppearances, GeometryProvider errorGeometryProvider) {
this.loadAppearances = loadAppearances;
+ this.errorGeometryProvider = errorGeometryProvider;
}
public J3DTemplateData[] getTemplateData(long templateID, GeometryProvider geoProvider, boolean useCache) {
@@ -270,12 +277,12 @@
return appearance;
}
-
+
private Obj[] getObjs(GeometryProvider geoProvider, long templateID) {
boolean gotObj = false;
Obj[] objs = new Obj[GeometryProvider.LOD_DISTANCES.length + 1];
try {
- for (int i = 0; i < objs.length; i++) {
+ for (int i = 0; !atMaxMemory() && i < objs.length; i++) {
objs[i] = getObj(geoProvider, i);
if (objs[i] != null && objs[i].getGroups().length == 0) {
Log.error("Got obj with no groups for template " + templateID);
@@ -302,6 +309,25 @@
return objs;
}
+ private long getHeapRemaining(){
+ MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
+ return memoryBean.getHeapMemoryUsage().getMax() - memoryBean.getHeapMemoryUsage().getUsed();
+ }
+
+ private boolean atMaxMemory(){
+ boolean atMax = getHeapRemaining() < MINIMUM_REMAINING_HEAP;
+ if(atMax){
+ Runtime.getRuntime().runFinalization();
+ System.gc();
+ }
+ atMax = getHeapRemaining() < MINIMUM_REMAINING_HEAP;
+ if(atMax && !complainedAboutMemory){
+ complainedAboutMemory = true;
+ Log.error("Reached maximum memory use. Try raising your max heap size.");
+ }
+ return atMax;
+ }
+
private Obj getObj(GeometryProvider provider, int lodIndex) throws ObjParseException {
if (lodIndex != 0) {
return null;
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java 2007-09-24 07:32:04 UTC (rev 434)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java 2007-09-24 18:33:21 UTC (rev 435)
@@ -123,7 +123,7 @@
this.username = username;
this.userInputListener = userInputListener;
this.offScreen = offScreen;
- this.dataManager = new J3DDataManager(!offScreen);
+ this.dataManager = new J3DDataManager(!offScreen, errorGeometryProvider);
setCapabilities(sceneRoot);
setCapabilities(usersGroup);
@@ -528,7 +528,10 @@
}
}
- public void stopRenderer() {
+ public synchronized void stopRenderer() {
+ if(rendererStopped){
+ return;
+ }
rendererStopped = true;
physicsBehavior.cleanup();
universe.removeAllLocales();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|