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

@ -1,7 +1,7 @@
/* /*
* Hello Minecraft! Launcher. * Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com> * Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -46,7 +46,7 @@ public final class Launcher {
public static void println(String s) { public static void println(String s) {
System.out.println(s); System.out.println(s);
} }
static String classPath = "", proxyHost = "", proxyPort = "", proxyUsername = "", proxyPassword = ""; static String classPath = "", proxyHost = "", proxyPort = "", proxyUsername = "", proxyPassword = "";
public static void main(String[] args) { public static void main(String[] args) {
@ -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())
@ -144,7 +151,7 @@ public final class Launcher {
int flag = 0; int flag = 0;
try { try {
minecraftMain.invoke(null, new Object[] {(String[]) cmdList.toArray(new String[cmdList.size()])}); minecraftMain.invoke(null, new Object[]{(String[]) cmdList.toArray(new String[cmdList.size()])});
} catch (Throwable throwable) { } catch (Throwable throwable) {
String trace = StrUtils.getStackTrace(throwable); String trace = StrUtils.getStackTrace(throwable);
final String advice = MinecraftCrashAdvicer.getAdvice(trace); final String advice = MinecraftCrashAdvicer.getAdvice(trace);
@ -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;
/** /**
* *
@ -196,16 +196,16 @@ public class MinecraftVersionManager extends IMinecraftProvider {
@Override @Override
public File getRunDirectory(String id) { public File getRunDirectory(String id) {
switch (profile.getGameDirType()) { switch (profile.getGameDirType()) {
case VERSION_FOLDER: case VERSION_FOLDER:
return new File(baseFolder, "versions/" + id + "/"); return new File(baseFolder, "versions/" + id + "/");
default: default:
return baseFolder; return baseFolder;
} }
} }
@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
@ -236,7 +236,7 @@ public class MinecraftVersionManager extends IMinecraftProvider {
@Override @Override
public IMinecraftLoader provideMinecraftLoader(UserProfileProvider p) public IMinecraftLoader provideMinecraftLoader(UserProfileProvider p)
throws IllegalStateException { throws IllegalStateException {
return new MinecraftLoader(profile, this, p); return new MinecraftLoader(profile, this, p);
} }

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

@ -1,7 +1,7 @@
/* /*
* Hello Minecraft! Launcher. * Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com> * Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -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

@ -1,7 +1,7 @@
/* /*
* Hello Minecraft! Launcher. * Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com> * Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -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

@ -1,7 +1,7 @@
/* /*
* Hello Minecraft! Launcher. * Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com> * Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -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 {
OperatingSystemMXBean o = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); if (os() == LINUX)
return o.getTotalPhysicalMemorySize(); return memoryInfoForLinux()[0] * 1024;
else {
OperatingSystemMXBean o = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
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
Utils.shutdownForcely(0); try {
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;
/** /**
* *
@ -50,8 +55,8 @@ public class SwingUtils {
*/ */
public static DefaultTableModel makeDefaultTableModel(String[] titleA, final Class[] typesA, final boolean[] canEditA) { public static DefaultTableModel makeDefaultTableModel(String[] titleA, final Class[] typesA, final boolean[] canEditA) {
return new DefaultTableModel( return new DefaultTableModel(
new Object[][]{}, new Object[][]{},
titleA) { titleA) {
Class[] types = typesA; Class[] types = typesA;
boolean[] canEdit = canEditA; boolean[] canEdit = canEditA;
@ -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

@ -1,7 +1,7 @@
/* /*
* Hello Minecraft! Launcher. * Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui * Copyright (C) 2013 huangyuhui
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -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");
}
} }