b595b4f4286f326e83063a2761df0471abe5a51d
[jalview.git] / src / jalview / bin / Launcher.java
1 package jalview.bin;
2
3 import java.io.File;
4 import java.lang.management.ManagementFactory;
5 import java.lang.management.OperatingSystemMXBean;
6 import java.util.ArrayList;
7
8 public class Launcher
9 {
10
11   private final static String startClass = "jalview.bin.Jalview";
12
13   private final static int maxHeapSizePerCent = 95;
14
15   private final static String dockIconPath = "JalviewLogo_Huge.png";
16
17   public static void main(String[] args)
18   {
19     final String javaBin = System.getProperty("java.home") + File.separator
20             + "bin" + File.separator + "java";
21
22     ArrayList<String> command = new ArrayList<>();
23     command.add(javaBin);
24
25     boolean isAMac = System.getProperty("os.name").indexOf("Mac") > -1;
26
27     for (String jvmArg : ManagementFactory.getRuntimeMXBean()
28             .getInputArguments())
29     {
30       command.add(jvmArg);
31     }
32     command.add("-cp");
33     command.add(ManagementFactory.getRuntimeMXBean().getClassPath());
34     ArrayList<String> arguments = new ArrayList<>();
35     for (String arg : args)
36     {
37       arguments.add(arg);
38     }
39
40     // add memory setting if not specified
41     boolean memSet = false;
42     boolean dockIcon = false;
43     ARG: for (int i = 0; i < command.size(); i++)
44     {
45       String arg = command.get(i);
46       if (arg.startsWith("-Xmx"))
47       {
48         memSet = true;
49       }
50       else if (arg.startsWith("-Xdock:icon"))
51       {
52         dockIcon = true;
53       }
54     }
55
56     if (!memSet)
57     {
58       long maxMemLong = -1;
59       long physicalMem = getPhysicalMemory();
60       if (physicalMem > 0)
61       {
62         maxMemLong = physicalMem * maxHeapSizePerCent / 100;
63       }
64       if (maxMemLong > 0)
65       {
66         command.add("-Xmx" + Long.toString(maxMemLong));
67       }
68     }
69
70     if (!dockIcon)
71     {
72       command.add("-Xdock:icon=" + dockIconPath);
73       // -Xdock:name=... doesn't actually work :(
74       // Leaving it in in case it gets fixed
75       command.add("-Xdock:name=" + "Jalview");
76     }
77
78     command.add(startClass);
79     command.addAll(arguments);
80
81     final ProcessBuilder builder = new ProcessBuilder(command);
82
83     System.out.println("COMMAND: " + String.join(" ", builder.command()));
84
85     try
86     {
87       builder.inheritIO();
88       builder.start();
89     } catch (Exception e)
90     {
91       e.printStackTrace();
92     }
93     // System.exit(0);
94
95   }
96
97   public static long getPhysicalMemory()
98   {
99     final OperatingSystemMXBean o = ManagementFactory
100             .getOperatingSystemMXBean();
101
102     try
103     {
104       if (o instanceof com.sun.management.OperatingSystemMXBean)
105       {
106         final com.sun.management.OperatingSystemMXBean osb = (com.sun.management.OperatingSystemMXBean) o;
107         return osb.getTotalPhysicalMemorySize();
108       }
109     } catch (NoClassDefFoundError e)
110     {
111       // com.sun.management.OperatingSystemMXBean doesn't exist in this JVM
112       System.out.println("No com.sun.management.OperatingSystemMXBean");
113     }
114
115     // We didn't get a com.sun.management.OperatingSystemMXBean.
116     return -1;
117   }
118
119 }