diff -r 211a5e73d119 netx/net/sourceforge/jnlp/cache/CacheUtil.java
--- a/netx/net/sourceforge/jnlp/cache/CacheUtil.java	Mon Apr 18 17:38:31 2011 -0400
+++ b/netx/net/sourceforge/jnlp/cache/CacheUtil.java	Mon Apr 18 22:58:38 2011 -0400
@@ -533,6 +533,15 @@
             // First we want to figure out which stuff we need to delete.
             HashSet<String> keep = new HashSet<String>();
             lruHandler.load();
+            
+            long maxSize = -1; // Default 
+            try {
+                maxSize = Long.parseLong(JNLPRuntime.getConfiguration().getProperty("deployment.cache.max.size"));
+            } catch (NumberFormatException nfe) {
+            }
+            
+            maxSize = maxSize << 20; // Convert to byte (Should not overflow..)
+            long curSize = 0;
 
             for (Entry<String, String> e : lruHandler.getLRUSortedEntries()) {
                 // Check if the item is contained in cacheOrder.
@@ -540,16 +549,19 @@
                 final String value = e.getValue();
 
                 if (value != null) {
+                    File file = new File(value);
                     PropertiesFile pf = new PropertiesFile(new File(value + ".info"));
                     boolean delete = Boolean.parseBoolean(pf.getProperty("delete"));
 
                     // This will get me the root directory specific to this cache item.
-                    String rStr = value.substring(cacheDir.length());
+                    String rStr = file.getPath().substring(cacheDir.length());
                     rStr = cacheDir + rStr.substring(0, rStr.indexOf(File.separatorChar, 1));
+                    long len = file.length();
 
-                    if (delete || keep.contains(rStr)) {
+                    if (delete || !file.isFile() || (maxSize >= 0 && curSize + len > maxSize) || keep.contains(rStr)) {
                         lruHandler.removeEntry(key);
                     } else {
+                        curSize += len;
                         keep.add(value.substring(rStr.length()));
                         keep.add(rStr); // We can just use the same map, since these two things are disjoint with each other.
                     }