<parent>
<groupId>com.threerings.getdown</groupId>
<artifactId>getdown</artifactId>
- <version>1.8.3-1.1.8_FJVL</version>
+ <version>1.8.3-1.2.0_FJVL</version>
</parent>
<artifactId>getdown-ant</artifactId>
<parent>
<groupId>com.threerings.getdown</groupId>
<artifactId>getdown</artifactId>
- <version>1.8.3-1.1.8_FJVL</version>
+ <version>1.8.3-1.2.0_FJVL</version>
</parent>
<artifactId>getdown-core</artifactId>
addAll(jvmargs, _jvmargs);
}
- // see if a percentage of physical memory option exists
- int jvmmempc = config.getInt("jvmmempc", -1);
+ // see if a percentage of physical memory, or max heap size options exist
+ String jvmmempc = config.getString("jvmmempc", null);
+ String jvmmemmax = config.getString("jvmmemmax", null);
// app_id prefixed setting overrides
if (appPrefix.length() > 0) {
- jvmmempc = config.getInt(appPrefix + "jvmmempc", jvmmempc);
- }
- if (0 <= jvmmempc && jvmmempc <= 100) {
-
- long maxMemLong = -1;
-
- try
- {
- maxMemLong = MemorySetting.memPercent(jvmmempc);
- } catch (Exception e)
- {
- e.printStackTrace();
- } catch (Throwable t)
- {
- t.printStackTrace();
- }
-
- if (maxMemLong > 0)
- {
-
- String[] maxMemHeapArg = new String[]{"-Xmx"+Long.toString(maxMemLong)};
- // remove other max heap size arg
- ARG: for (int i = 0; i < _jvmargs.size(); i++) {
- if (_jvmargs.get(i) instanceof java.lang.String && _jvmargs.get(i).startsWith("-Xmx")) {
- _jvmargs.remove(i);
- break ARG;
- }
+ jvmmempc = config.getString(appPrefix + "jvmmempc", jvmmempc);
+ jvmmemmax = config.getString(appPrefix + "jvmmemmax", jvmmemmax);
+ }
+ long maxMemLong = -1;
+ maxMemLong = MemorySetting.getMemorySetting(jvmmemmax, jvmmempc);
+ if (maxMemLong > 0)
+ {
+ String[] maxMemHeapArg = new String[]{"-Xmx"+Long.toString(maxMemLong)};
+ // remove other max heap size arg
+ ARG: for (int i = 0; i < _jvmargs.size(); i++) {
+ if (_jvmargs.get(i) instanceof java.lang.String && _jvmargs.get(i).startsWith("-Xmx")) {
+ _jvmargs.remove(i);
+ break ARG;
}
- addAll(maxMemHeapArg, _jvmargs);
- log.info("Max memory set", "maxMemHeapArg", maxMemHeapArg[0]);
-
}
-
- } else if (jvmmempc != -1) {
- log.warning("'jvmmempc' value must be in range 0 to 100 (read as '"+Integer.toString(jvmmempc)+"')");
+ addAll(maxMemHeapArg, _jvmargs);
}
// get the set of optimum JVM arguments
private final Map<String, Object> _data;
- public static final List<String> allowedReplaceKeys = Arrays.asList("appbase","apparg","jvmarg","jvmmempc"); // these are the ones we might use
+ public static final List<String> allowedReplaceKeys = Arrays.asList("appbase","apparg","jvmarg","jvmmempc","jvmmemmax"); // these are the ones we might use
public static final List<String> allowedMergeKeys = Arrays.asList("apparg","jvmarg"); // these are the ones we might use
//private final List<String> allowedMergeKeys = Arrays.asList("apparg","jvmarg","resource","code","java_location"); // (not exhaustive list here)
}
--- /dev/null
+package jalview.bin;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+
+public class MemoryPercent
+{
+
+ protected static long getPhysicalMemory()
+ {
+ final OperatingSystemMXBean o = ManagementFactory
+ .getOperatingSystemMXBean();
+
+ try
+ {
+ if (o instanceof com.sun.management.OperatingSystemMXBean)
+ {
+ final com.sun.management.OperatingSystemMXBean osb = (com.sun.management.OperatingSystemMXBean) o;
+ return osb.getTotalPhysicalMemorySize();
+ }
+ } catch (NoClassDefFoundError e)
+ {
+ // com.sun.management.OperatingSystemMXBean doesn't exist in this JVM
+ System.out.println("No com.sun.management.OperatingSystemMXBean");
+ }
+
+ // We didn't get a com.sun.management.OperatingSystemMXBean.
+ return -1;
+ }
+
+ public static long memPercent(int percent)
+ {
+ return memPercent(percent);
+ }
+ public static long memPercent(float percent)
+ {
+ long memPercent = -1;
+
+ long physicalMem = getPhysicalMemory();
+ if (physicalMem > MemorySetting.applicationMinMemory)
+ {
+ // try and set at least applicationMinMemory and thereafter ensure
+ // leaveFreeMinMemory is left for the OS
+ memPercent = Math.max(MemorySetting.applicationMinMemory,
+ (long) (physicalMem
+ - Math.max(physicalMem * (100 - percent) / 100,
+ MemorySetting.leaveFreeMinMemory)));
+ }
+
+ return memPercent;
+ }
+
+}
package jalview.bin;
-import java.lang.management.ManagementFactory;
-import java.lang.management.OperatingSystemMXBean;
-
public class MemorySetting
{
public static final long leaveFreeMinMemory = 536870912; // 0.5 GB
public static final long applicationMinMemory = 536870912; // 0.5 GB
- protected static long getPhysicalMemory()
+ private final static int maxHeapSizePerCentDefault = 90;
+
+ public final static String maxHeapSizePerCentProperty = "jvmmempc";
+
+ private final static long maxHeapSizeDefault = 34359738368L; // 32GB
+
+ private final static long noMemMaxHeapSizeDefault = 8589934592L; // 8GB
+
+ public final static String maxHeapSizeProperty = "jvmmemmax";
+
+ public static long getMemorySetting()
{
- final OperatingSystemMXBean o = ManagementFactory
- .getOperatingSystemMXBean();
+ return getMemorySetting(null, null);
+ }
- try
+ public static long getMemorySetting(String jvmmemmaxString,
+ String jvmmempcString)
+ {
+ // actual Xmx value-to-be
+ long maxMemLong = -1;
+
+ // get (absolute) jvmmaxmem setting
+ long memmax = maxHeapSizeDefault;
+ String jvmmemmaxorig = jvmmemmaxString;
+ if (jvmmemmaxorig == null)
+ {
+ jvmmemmaxorig = System.getProperty(maxHeapSizeProperty);
+ }
+ String jvmmemmax = jvmmemmaxorig;
+ if (jvmmemmax != null && jvmmemmax.length() > 0)
{
- if (o instanceof com.sun.management.OperatingSystemMXBean)
+ long multiplier = 1;
+ switch (jvmmemmax.toLowerCase().substring(jvmmemmax.length() - 1))
+ {
+ case "t":
+ multiplier = 1099511627776L; // 2^40
+ jvmmemmax = jvmmemmax.substring(0, jvmmemmax.length() - 1);
+ break;
+ case "g":
+ multiplier = 1073741824; // 2^30
+ jvmmemmax = jvmmemmax.substring(0, jvmmemmax.length() - 1);
+ break;
+ case "m":
+ multiplier = 1048576; // 2^20
+ jvmmemmax = jvmmemmax.substring(0, jvmmemmax.length() - 1);
+ break;
+ case "k":
+ multiplier = 1024; // 2^10
+ jvmmemmax = jvmmemmax.substring(0, jvmmemmax.length() - 1);
+ break;
+ case "b":
+ multiplier = 1; // 2^0
+ jvmmemmax = jvmmemmax.substring(0, jvmmemmax.length() - 1);
+ break;
+ default:
+ break;
+ }
+
+ // parse the arg
+ try
+ {
+ memmax = Long.parseLong(jvmmemmax);
+ } catch (NumberFormatException e)
+ {
+ memmax = maxHeapSizeDefault;
+ System.out.println("MemorySetting Property '" + maxHeapSizeProperty
+ + "' ("
+ + jvmmemmaxorig + "') badly formatted, using default ("
+ + memmax + ").");
+ }
+
+ // apply multiplier if not too big (i.e. bigger than a long)
+ if (Long.MAX_VALUE / memmax < multiplier)
+ {
+ memmax = maxHeapSizeDefault;
+ System.out.println(
+ "MemorySetting Property '" + maxHeapSizeProperty + "' ("
+ + jvmmemmaxorig
+ + ") too big, using default (" + memmax + ").");
+ }
+ else
+ {
+ memmax = multiplier * memmax;
+ }
+
+ // check at least minimum value (this accounts for negatives too)
+ if (memmax < MemorySetting.applicationMinMemory)
{
- final com.sun.management.OperatingSystemMXBean osb = (com.sun.management.OperatingSystemMXBean) o;
- return osb.getTotalPhysicalMemorySize();
+ memmax = MemorySetting.applicationMinMemory;
+ System.out.println(
+ "MemorySetting Property '" + maxHeapSizeProperty + "' ("
+ + jvmmemmaxorig
+ + ") too small, using minimum (" + memmax + ").");
}
- } catch (NoClassDefFoundError e)
+
+ }
+ else
{
- // com.sun.management.OperatingSystemMXBean doesn't exist in this JVM
- System.err.println("No com.sun.management.OperatingSystemMXBean");
+ // no need to warn if no setting
+ // System.out.println("MemorySetting Property '" + maxHeapSizeProperty + "' not
+ // set.");
}
- // We didn't get a com.sun.management.OperatingSystemMXBean.
- return -1;
- }
+ // get max percent of physical memory
+ float percent = maxHeapSizePerCentDefault;
+ String jvmmempc = jvmmempcString;
+ if (jvmmempc == null)
+ {
+ jvmmempc = System.getProperty(maxHeapSizePerCentProperty);
+ }
+ long pcmem = -1;
+ try
+ {
+ if (jvmmempc != null)
+ {
+ float trypercent = Float.parseFloat(jvmmempc);
+ if (0 < trypercent && trypercent <= 100f)
+ {
+ percent = trypercent;
+ }
+ else
+ {
+ System.out.println(
+ "MemorySetting Property '" + maxHeapSizePerCentProperty
+ + "' should be in range 1..100");
+ }
+ }
+ } catch (NumberFormatException e)
+ {
+ System.out.println(
+ "MemorySetting property '" + maxHeapSizePerCentProperty
+ + "' (" + jvmmempc + ") badly formatted");
+ }
- public static long memPercent(int percent)
- {
- long memPercent = -1;
+ // catch everything in case of no com.sun.management.OperatingSystemMXBean
+ boolean memoryPercentError = false;
+ try
+ {
+ pcmem = MemoryPercent.memPercent(percent);
+ } catch (Throwable t)
+ {
+ memoryPercentError = true;
+ System.out.println("Problem calling MemoryPercent.memPercent("
+ + percent
+ + "). Likely to be problem with com.sun.management.OperatingSystemMXBean");
+ t.printStackTrace();
+ }
+ // In the case of an error reading the percentage if physical memory, let's cap maxMemLong to 8GB
+ if (memoryPercentError && jvmmempc != null && pcmem == -1
+ && memmax > noMemMaxHeapSizeDefault)
+ {
+ System.out.println(
+ "Capping maximum memory to 8GB due to failure to read physical memory size.");
+ memmax = noMemMaxHeapSizeDefault;
+ }
- long physicalMem = getPhysicalMemory();
- if (physicalMem > applicationMinMemory)
+ if (pcmem == -1) // not set
+ {
+ maxMemLong = memmax;
+ }
+ else
{
- // try and set at least applicationMinMemory and thereafter ensure
- // leaveFreeMinMemory is left for the OS
- memPercent = Math.max(applicationMinMemory,
- physicalMem - Math.max(physicalMem * (100 - percent) / 100,
- leaveFreeMinMemory));
+ maxMemLong = Math.min(pcmem, memmax);
}
- return memPercent;
+ return maxMemLong;
}
}
<parent>
<groupId>com.threerings.getdown</groupId>
<artifactId>getdown</artifactId>
- <version>1.8.3-1.1.8_FJVL</version>
+ <version>1.8.3-1.2.0_FJVL</version>
</parent>
<artifactId>getdown-launcher</artifactId>
if [ x$JVLVERSION != x ]; then
export VERSION=$JVLVERSION
else
- export VERSION=1.8.3-1.1.8_JVL
+ export VERSION=1.8.3-1.2.0_JVL
fi
if [ x${VERSION%_JVL} = x$VERSION ]; then
<groupId>com.threerings.getdown</groupId>
<artifactId>getdown</artifactId>
<packaging>pom</packaging>
- <version>1.8.3-1.1.8_FJVL</version>
+ <version>1.8.3-1.2.0_FJVL</version>
<name>getdown</name>
<description>An application installer and updater.</description>
getdown_txt_allow_offline = true
getdown_txt_max_concurrent_downloads = 10
getdown_txt_jalview.jvmmempc = 90
+getdown_txt_jalview.jvmmemmax = 32G
getdown_txt_multi_jvmarg = -Dgetdownappdir=%APPDIR%
getdown_txt_strict_comments = true
getdown_txt_title = Jalview
bamboo_channelbase = https://builds.jalview.org/browse
bamboo_planKey =
bamboo_getdown_channel_suffix = /latest/artifact/shared/getdown-channel
-
\ No newline at end of file
+
} catch (NoClassDefFoundError e)
{
// com.sun.management.OperatingSystemMXBean doesn't exist in this JVM
- Cache.log.error("No com.sun.management.OperatingSystemMXBean");
+ System.out.println("No com.sun.management.OperatingSystemMXBean");
}
// We didn't get a com.sun.management.OperatingSystemMXBean.
private final static long maxHeapSizeDefault = 34359738368L; // 32GB
+ private final static long noMemMaxHeapSizeDefault = 8589934592L; // 8GB
+
public final static String maxHeapSizeProperty = "jvmmemmax";
public static long getMemorySetting()
}
// In the case of an error reading the percentage if physical memory, let's cap maxMemLong to 8GB
if (memoryPercentError && jvmmempc != null && pcmem == -1
- && memmax > 8589934592L)
+ && memmax > noMemMaxHeapSizeDefault)
{
System.out.println(
"Capping maximum memory to 8GB due to failure to read physical memory size.");
- memmax = 8589934592L;
+ memmax = noMemMaxHeapSizeDefault;
}
if (pcmem == -1) // not set