supported linux memory reading

This commit is contained in:
huangyuhui
2015-12-31 21:30:39 +08:00
parent 5f78f2725a
commit 6968809499
11 changed files with 146 additions and 78 deletions

View File

@@ -79,7 +79,14 @@ public final class Launcher {
int len = tokenized.length; int len = tokenized.length;
if (showInfo) { if (showInfo) {
LogWindow.INSTANCE.setTerminateGame(() -> Utils.shutdownForcely(1)); LogWindow.INSTANCE.setTerminateGame(() -> {
try {
Utils.shutdownForcely(1);
} catch (Exception e) {
MessageBox.Show(C.i18n("launcher.exit_failed"));
HMCLog.err("Failed to shutdown forcely", e);
}
});
try { try {
File logFile = new File("hmclmc.log"); File logFile = new File("hmclmc.log");
if (!logFile.exists()) if (!logFile.exists())
@@ -159,7 +166,12 @@ public final class Launcher {
} }
println("*** Game Exited ***"); println("*** Game Exited ***");
Utils.shutdownForcely(1); try {
Utils.shutdownForcely(flag);
} catch (Exception e) {
MessageBox.Show(C.i18n("launcher.exit_failed"));
HMCLog.err("Failed to shutdown forcely", e);
}
} }
/* /*
static Object getShutdownHaltLock() { static Object getShutdownHaltLock() {

View File

@@ -18,7 +18,6 @@
package org.jackhuang.hellominecraft.launcher.utils.installers; package org.jackhuang.hellominecraft.launcher.utils.installers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import org.jackhuang.hellominecraft.utils.functions.Consumer; import org.jackhuang.hellominecraft.utils.functions.Consumer;

View File

@@ -42,7 +42,7 @@ import org.jackhuang.hellominecraft.tasks.TaskWindow;
import org.jackhuang.hellominecraft.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.tasks.download.FileDownloadTask;
import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils;
import org.jackhuang.hellominecraft.utils.MessageBox; import org.jackhuang.hellominecraft.utils.MessageBox;
import org.jackhuang.hellominecraft.utils.Utils; import org.jackhuang.hellominecraft.views.SwingUtils;
/** /**
* *
@@ -205,7 +205,7 @@ public class MinecraftVersionManager extends IMinecraftProvider {
@Override @Override
public void open(String mv, String name) { public void open(String mv, String name) {
Utils.openFolder((name == null) ? getRunDirectory(mv) : new File(getRunDirectory(mv), name)); SwingUtils.openFolder((name == null) ? getRunDirectory(mv) : new File(getRunDirectory(mv), name));
} }
@Override @Override

View File

@@ -567,7 +567,15 @@ public class MainPagePanel extends AnimatedPanel implements Event<String> {
MainFrame.INSTANCE.dispose(); MainFrame.INSTANCE.dispose();
} }
JavaProcessMonitor jpm = new JavaProcessMonitor(p); JavaProcessMonitor jpm = new JavaProcessMonitor(p);
jpm.stoppedEvent.register((sender3, t) -> { jpm.applicationExitedAbnormallyEvent.register((sender2, t) -> {
MessageBox.Show(C.i18n("launch.exited_abnormally") + ", exit code: " + t);
return true;
});
jpm.jvmLaunchFailedEvent.register((sender2, t) -> {
MessageBox.Show(C.i18n("launch.cannot_create_jvm") + ", exit code: " + t);
return true;
});
jpm.stoppedEvent.register((sender2, t) -> {
if (obj.getProfile().getLauncherVisibility() != LauncherVisibility.KEEP && !LogWindow.INSTANCE.isVisible()) if (obj.getProfile().getLauncherVisibility() != LauncherVisibility.KEEP && !LogWindow.INSTANCE.isVisible())
System.exit(0); System.exit(0);
return true; return true;

View File

@@ -40,6 +40,7 @@ public class TaskList extends Thread {
boolean shouldContinue = true; boolean shouldContinue = true;
public TaskList() { public TaskList() {
setDaemon(true);
} }
public void clean() { public void clean() {
@@ -71,6 +72,7 @@ public class TaskList extends Thread {
public InvokeThread(Task task, Set<InvokeThread> ss) { public InvokeThread(Task task, Set<InvokeThread> ss) {
this.task = task; this.task = task;
s = ss; s = ss;
setDaemon(true);
} }
@Override @Override

View File

@@ -18,14 +18,12 @@
package org.jackhuang.hellominecraft.utils; package org.jackhuang.hellominecraft.utils;
import com.sun.management.OperatingSystemMXBean; import com.sun.management.OperatingSystemMXBean;
import java.awt.Desktop;
import java.awt.Image; import java.awt.Image;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.StringSelection;
import java.io.File; import java.io.File;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
@@ -33,7 +31,6 @@ import java.net.URLClassLoader;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.Random; import java.util.Random;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import org.jackhuang.hellominecraft.C;
import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.HMCLog;
/** /**
@@ -79,16 +76,6 @@ public final class Utils {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), null); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), null);
} }
public static void openFolder(File f) {
try {
f.mkdirs();
java.awt.Desktop.getDesktop().open(f);
} catch (Exception ex) {
MessageBox.Show(C.i18n("message.cannot_open_explorer") + ex.getMessage());
HMCLog.warn("Failed to open folder:" + f, ex);
}
}
public static ImageIcon scaleImage(ImageIcon i, int x, int y) { public static ImageIcon scaleImage(ImageIcon i, int x, int y) {
return new ImageIcon(i.getImage().getScaledInstance(x, y, Image.SCALE_SMOOTH)); return new ImageIcon(i.getImage().getScaledInstance(x, y, Image.SCALE_SMOOTH));
} }
@@ -153,16 +140,11 @@ public final class Utils {
* *
* @param status exit code * @param status exit code
*/ */
public static void shutdownForcely(int status) { public static void shutdownForcely(int status) throws Exception {
try {
Class z = Class.forName("java.lang.Shutdown"); Class z = Class.forName("java.lang.Shutdown");
Method exit = z.getDeclaredMethod("exit", int.class); Method exit = z.getDeclaredMethod("exit", int.class);
exit.setAccessible(true); exit.setAccessible(true);
exit.invoke(z, status); exit.invoke(z, status);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
MessageBox.Show(C.i18n("launcher.exit_failed"));
e.printStackTrace();
}
} }
public static void requireNonNull(Object o) { public static void requireNonNull(Object o) {

View File

@@ -17,10 +17,8 @@
*/ */
package org.jackhuang.hellominecraft.utils.system; package org.jackhuang.hellominecraft.utils.system;
import org.jackhuang.hellominecraft.utils.MessageBox;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import org.jackhuang.hellominecraft.C;
import org.jackhuang.hellominecraft.utils.CollectionUtils; import org.jackhuang.hellominecraft.utils.CollectionUtils;
import org.jackhuang.hellominecraft.utils.Event; import org.jackhuang.hellominecraft.utils.Event;
import org.jackhuang.hellominecraft.utils.EventHandler; import org.jackhuang.hellominecraft.utils.EventHandler;
@@ -33,7 +31,20 @@ import org.jackhuang.hellominecraft.utils.StrUtils;
public class JavaProcessMonitor { public class JavaProcessMonitor {
private final HashSet<Thread> al = new HashSet<>(); private final HashSet<Thread> al = new HashSet<>();
/**
* this event will be executed only if the application returned 0.
*/
public final EventHandler<JavaProcess> stoppedEvent = new EventHandler<>(this); public final EventHandler<JavaProcess> stoppedEvent = new EventHandler<>(this);
/**
* When the monitored application exited with exit code not zero, this event
* will be executed. Event args is the exit code.
*/
public final EventHandler<Integer> applicationExitedAbnormallyEvent = new EventHandler<>(this);
/**
* When jvm crashed, this event will be executed. Event args is the exit
* code.
*/
public final EventHandler<Integer> jvmLaunchFailedEvent = new EventHandler<>(this);
private final JavaProcess p; private final JavaProcess p;
public JavaProcessMonitor(JavaProcess p) { public JavaProcessMonitor(JavaProcess p) {
@@ -43,7 +54,7 @@ public class JavaProcessMonitor {
public void start() { public void start() {
Event<JavaProcess> event = (sender2, t) -> { Event<JavaProcess> event = (sender2, t) -> {
if (t.getExitCode() != 0) if (t.getExitCode() != 0)
MessageBox.Show(C.i18n("launch.exited_abnormally")); applicationExitedAbnormallyEvent.execute(t.getExitCode());
processThreadStopped((ProcessThread) sender2, false); processThreadStopped((ProcessThread) sender2, false);
return true; return true;
}; };
@@ -51,7 +62,7 @@ public class JavaProcessMonitor {
if (p1.getExitCode() != 0 && p1.getStdErrLines().size() > 0 && StrUtils.containsOne(p1.getStdErrLines(), Arrays.asList("Could not create the Java Virtual Machine.", if (p1.getExitCode() != 0 && p1.getStdErrLines().size() > 0 && StrUtils.containsOne(p1.getStdErrLines(), Arrays.asList("Could not create the Java Virtual Machine.",
"Error occurred during initialization of VM", "Error occurred during initialization of VM",
"A fatal exception has occurred. Program will exit."))) "A fatal exception has occurred. Program will exit.")))
MessageBox.Show(C.i18n("launch.cannot_create_jvm")); jvmLaunchFailedEvent.execute(p1.getExitCode());
processThreadStopped((ProcessThread) sender3, false); processThreadStopped((ProcessThread) sender3, false);
return true; return true;
}; };

View File

@@ -18,7 +18,13 @@
package org.jackhuang.hellominecraft.utils.system; package org.jackhuang.hellominecraft.utils.system;
import com.sun.management.OperatingSystemMXBean; import com.sun.management.OperatingSystemMXBean;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.util.StringTokenizer;
import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.HMCLog;
/** /**
@@ -40,9 +46,8 @@ public enum OS {
} }
public static OS os() { public static OS os() {
String str; String str = System.getProperty("os.name").toLowerCase();
if ((str = System.getProperty("os.name").toLowerCase()) if (str.contains("win"))
.contains("win"))
return OS.WINDOWS; return OS.WINDOWS;
if (str.contains("mac")) if (str.contains("mac"))
return OS.OSX; return OS.OSX;
@@ -62,12 +67,45 @@ public enum OS {
*/ */
public static long getTotalPhysicalMemory() { public static long getTotalPhysicalMemory() {
try { try {
if (os() == LINUX)
return memoryInfoForLinux()[0] * 1024;
else {
OperatingSystemMXBean o = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); OperatingSystemMXBean o = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
return o.getTotalPhysicalMemorySize(); return o.getTotalPhysicalMemorySize();
}
} catch (Throwable t) { } catch (Throwable t) {
HMCLog.warn("Failed to get total physical memory size"); HMCLog.warn("Failed to get total physical memory size", t);
return -1; return -1;
} }
} }
public static long[] memoryInfoForLinux() throws IOException {
File file = new File("/proc/meminfo");
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
long[] result = new long[4];
String str = null;
StringTokenizer token;
while ((str = br.readLine()) != null) {
token = new StringTokenizer(str);
if (!token.hasMoreTokens())
continue;
str = token.nextToken();
if (!token.hasMoreTokens())
continue;
if (str.equalsIgnoreCase("MemTotal:"))
result[0] = Long.parseLong(token.nextToken());
else if (str.equalsIgnoreCase("MemFree:"))
result[1] = Long.parseLong(token.nextToken());
else if (str.equalsIgnoreCase("SwapTotal:"))
result[2] = Long.parseLong(token.nextToken());
else if (str.equalsIgnoreCase("SwapFree:"))
result[3] = Long.parseLong(token.nextToken());
}
return result;
}
} }

View File

@@ -28,6 +28,7 @@ import org.jackhuang.hellominecraft.logging.Level;
import org.jackhuang.hellominecraft.utils.functions.NonFunction; import org.jackhuang.hellominecraft.utils.functions.NonFunction;
import org.jackhuang.hellominecraft.utils.DoubleOutputStream; import org.jackhuang.hellominecraft.utils.DoubleOutputStream;
import org.jackhuang.hellominecraft.utils.LauncherPrintStream; import org.jackhuang.hellominecraft.utils.LauncherPrintStream;
import org.jackhuang.hellominecraft.utils.MessageBox;
import org.jackhuang.hellominecraft.utils.Utils; import org.jackhuang.hellominecraft.utils.Utils;
/** /**
@@ -208,7 +209,12 @@ public class LogWindow extends javax.swing.JFrame {
if (flag) if (flag)
this.dispose(); this.dispose();
else else
try {
Utils.shutdownForcely(0); Utils.shutdownForcely(0);
} catch (Exception e) {
MessageBox.Show(C.i18n("launcher.exit_failed"));
HMCLog.err("Failed to shutdown forcely", e);
}
}//GEN-LAST:event_btnCloseActionPerformed }//GEN-LAST:event_btnCloseActionPerformed
private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnClearActionPerformed private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnClearActionPerformed

View File

@@ -19,6 +19,8 @@ package org.jackhuang.hellominecraft.views;
import java.awt.EventQueue; import java.awt.EventQueue;
import java.awt.FontMetrics; import java.awt.FontMetrics;
import java.io.File;
import java.io.IOException;
import java.net.URI; import java.net.URI;
import javax.swing.DefaultListModel; import javax.swing.DefaultListModel;
import javax.swing.JLabel; import javax.swing.JLabel;
@@ -28,9 +30,12 @@ import javax.swing.JScrollPane;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.JTextArea; import javax.swing.JTextArea;
import javax.swing.table.DefaultTableModel; import javax.swing.table.DefaultTableModel;
import org.jackhuang.hellominecraft.C;
import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.HMCLog;
import org.jackhuang.hellominecraft.utils.MessageBox;
import org.jackhuang.hellominecraft.utils.StrUtils; import org.jackhuang.hellominecraft.utils.StrUtils;
import org.jackhuang.hellominecraft.utils.functions.NonFunction; import org.jackhuang.hellominecraft.utils.functions.NonFunction;
import org.jackhuang.hellominecraft.utils.system.OS;
/** /**
* *
@@ -67,6 +72,28 @@ public class SwingUtils {
}; };
} }
public static void openFolder(File f) {
f.mkdirs();
String path = f.getAbsolutePath();
switch (OS.os()) {
case OSX:
try {
Runtime.getRuntime().exec(new String[]{"/usr/bin/open", path});
} catch (IOException ex) {
HMCLog.err("Failed to open " + path + " through /usr/bin/open", ex);
}
break;
default:
try {
java.awt.Desktop.getDesktop().open(f);
} catch (Throwable ex) {
MessageBox.Show(C.i18n("message.cannot_open_explorer") + ex.getMessage());
HMCLog.warn("Failed to open " + path + " through java.awt.Desktop.getDesktop().open()", ex);
}
break;
}
}
/** /**
* Open URL by java.awt.Desktop * Open URL by java.awt.Desktop
* *
@@ -76,6 +103,12 @@ public class SwingUtils {
try { try {
java.awt.Desktop.getDesktop().browse(new URI(link)); java.awt.Desktop.getDesktop().browse(new URI(link));
} catch (Throwable e) { } catch (Throwable e) {
if (OS.os() == OS.OSX)
try {
Runtime.getRuntime().exec(new String[]{"/usr/bin/open", link});
} catch (IOException ex) {
HMCLog.warn("Failed to open link: " + link, ex);
}
HMCLog.warn("Failed to open link: " + link, e); HMCLog.warn("Failed to open link: " + link, e);
} }
} }

View File

@@ -37,7 +37,7 @@ public class MonitorServiceImpl implements IMonitorService {
private static final int CPUTIME = 30; private static final int CPUTIME = 30;
private static final int PERCENT = 100; private static final int PERCENT = 100;
private static final int FAULTLENGTH = 10; private static final int FAULTLENGTH = 10;
private static String linuxVersion = null; private static final String linuxVersion = null;
/** /**
* 获得当前的监控对象. * 获得当前的监控对象.
@@ -94,7 +94,6 @@ public class MonitorServiceImpl implements IMonitorService {
BufferedReader brStat = null; BufferedReader brStat = null;
StringTokenizer tokenStat; StringTokenizer tokenStat;
try { try {
System.out.println("Getting usage rate of CPU , linux version: " + linuxVersion);
Process process = Runtime.getRuntime().exec("top -b -n 1"); Process process = Runtime.getRuntime().exec("top -b -n 1");
is = process.getInputStream(); is = process.getInputStream();
isr = new InputStreamReader(is); isr = new InputStreamReader(is);
@@ -249,26 +248,4 @@ public class MonitorServiceImpl implements IMonitorService {
} }
return null; return null;
} }
/**
* 测试方法.
*
* @param args
*
* @throws Exception
* @author GuoHuang
*/
public static void main(String[] args) throws Exception {
IMonitorService service = new MonitorServiceImpl();
MonitorInfoBean monitorInfo = service.getMonitorInfoBean();
System.out.println("cpu占有率=" + monitorInfo.getCpuRatio());
System.out.println("可使用内存=" + monitorInfo.getTotalMemory());
System.out.println("剩余内存=" + monitorInfo.getFreeMemory());
System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory());
System.out.println("操作系统=" + monitorInfo.getOsName());
System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb");
System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb");
System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb");
System.out.println("线程总数=" + monitorInfo.getTotalThread() + "kb");
}
} }