4 import java.io.IOException;
5 import java.lang.management.ManagementFactory;
6 import java.util.ArrayList;
11 private final static String startClass = "jalview.bin.Jalview";
13 private final static int maxHeapSizePerCent = 90;
15 private final static String dockIconPath = "JalviewLogo_Huge.png";
17 public static void main(String[] args)
19 final String javaBin = System.getProperty("java.home") + File.separator
20 + "bin" + File.separator + "java";
22 ArrayList<String> command = new ArrayList<>();
25 boolean isAMac = System.getProperty("os.name").indexOf("Mac") > -1;
27 for (String jvmArg : ManagementFactory.getRuntimeMXBean()
33 command.add(ManagementFactory.getRuntimeMXBean().getClassPath());
34 ArrayList<String> arguments = new ArrayList<>();
35 for (String arg : args)
40 // add memory setting if not specified
41 boolean memSet = false;
42 boolean dockIcon = false;
43 boolean dockName = false;
44 ARG: for (int i = 0; i < command.size(); i++)
46 String arg = command.get(i);
47 if (arg.startsWith("-Xmx"))
51 else if (arg.startsWith("-Xdock:icon"))
55 else if (arg.startsWith("-Xdock:name"))
67 maxMemLong = MemorySetting.memPercent(maxHeapSizePerCent);
78 command.add("-Xmx" + Long.toString(maxMemLong));
86 command.add("-Xdock:icon=" + dockIconPath);
90 // -Xdock:name=... doesn't actually work :(
91 // Leaving it in in case it gets fixed
92 command.add("-Xdock:name=" + "Jalview");
96 command.add(startClass);
97 command.addAll(arguments);
99 final ProcessBuilder builder = new ProcessBuilder(command);
101 System.out.println("COMMAND: " + String.join(" ", builder.command()));
106 Process process = builder.start();
108 } catch (IOException e)
110 if (e.getMessage().toLowerCase().contains("memory"))
112 System.out.println("Caught a memory exception: " + e.getMessage());
113 // Probably the "Cannot allocate memory" error, try without the memory setting
114 ArrayList<String> commandNoMem = new ArrayList<>();
115 for (int i = 0; i < command.size(); i++)
117 if (!command.get(i).startsWith("-Xmx"))
119 commandNoMem.add(command.get(i));
122 final ProcessBuilder builderNoMem = new ProcessBuilder(
124 System.out.println("NO MEM COMMAND: "
125 + String.join(" ", builderNoMem.command()));
128 builderNoMem.inheritIO();
129 Process processNoMem = builderNoMem.start();
130 processNoMem.waitFor();
131 } catch (Exception ex)
133 ex.printStackTrace();
140 } catch (Exception e)