jps原理

2 篇文章 0 订阅
2 篇文章 0 订阅

用法

虚拟机进程状况工具

列出正在运行的虚拟机进程,并显示虚拟机执行主类的名称,以及这些进程的本地虚拟机的唯一ID(LVMID).

对于本地虚拟机进程来说,LVMID与操作系统的进程ID是一致的,使用windwos的任务管理器或者Unix的ps命令也可以查询到虚拟机进程的LVMID,但如果同时启动了多个虚拟机进程,无法根据进程名称定位时,那就只能依赖jps命令显示主类的功能才能区分.

命令格式:

jps [ options ] [hostid]

jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名

jps工具主要选项

-q: 只输出LVMID,省略主类的名称
-m: 输出虚拟机进程启动时传递给主类main()函数的参数
-l: 输出主类的全名,如果进程执行的jar包,输出jar路径
-v: 输出虚拟机进程启动时JVM参数.

源码解析

import java.util.Iterator;
import java.util.Set;
import sun.jvmstat.monitor.*;
public class Jps {
    private static Arguments arguments;
    public static void main(String[] args) {
        try {
            arguments = new Arguments(args);
        } catch (IllegalArgumentException e) {
            return;
        }
        try {
            HostIdentifier hostId = arguments.hostId();
            MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(hostId);
            // get the set active JVMs on the specified host.
            Set jvms = monitoredHost.activeVms();
            for (Iterator j = jvms.iterator(); j.hasNext(); /* empty */ ) {
                int lvmid = ((Integer) j.next()).intValue();
                if (arguments.isQuiet()) {
                    continue;
                }
                try {
                    String vmidString = "//" + lvmid + "?mode=r";
                    // process information unavailable";
                    VmIdentifier id = new VmIdentifier(vmidString);
                    MonitoredVm vm = monitoredHost.getMonitoredVm(id, 0);
                    // main class information unavailable";
                    MonitoredVmUtil.mainClass(vm, arguments.showLongPaths());
                    if (arguments.showMainArgs()) {
                        String mainArgs = MonitoredVmUtil.mainArgs(vm);
                    }
                    if (arguments.showVmArgs()) {
                        String jvmArgs = MonitoredVmUtil.jvmArgs(vm);
                    }
                    if (arguments.showVmFlags()) {
                        String jvmFlags = MonitoredVmUtil.jvmFlags(vm);
                    }
                    monitoredHost.detach(vm);
                } catch (Exception e) {
                } finally {
                }
            }
        } catch (MonitorException e) {
            e.printStackTrace();
        }
    }
}
import java.net.URISyntaxException;
import sun.jvmstat.monitor.HostIdentifier;
/**
 * Class for processing command line arguments and providing method level access
 * to the command line arguments.
 */
public class Arguments {
    private boolean help;
    private boolean quiet;
    private boolean longPaths;
    private boolean vmArgs;
    private boolean vmFlags;
    private boolean mainArgs;
    private String hostname;
    private HostIdentifier hostId;
    public Arguments(String[] args) throws IllegalArgumentException {
        int argc = 0;
        if (args.length == 1) {
            if ((args[0].compareTo("-?") == 0) || (args[0].compareTo("-help") == 0)) {
                help = true;
                return;
            }
        }
        for (argc = 0; (argc < args.length) && (args[argc].startsWith("-")); argc++) {
            String arg = args[argc];
            if (arg.compareTo("-q") == 0) {
                quiet = true;
            } else if (arg.startsWith("-")) {
                for (int j = 1; j < arg.length(); j++) {
                    switch (arg.charAt(j)) {
                    case 'm':
                        mainArgs = true;
                        break;
                    case 'l':
                        longPaths = true;
                        break;
                    case 'v':
                        vmArgs = true;
                        break;
                    case 'V':
                        vmFlags = true;
                        break;
                    default:
                        throw new IllegalArgumentException("illegal argument: " + args[argc]);
                    }
                }
            } else {
                throw new IllegalArgumentException("illegal argument: " + args[argc]);
            }
        }
        switch (args.length - argc) {
        case 0:
            hostname = null;
            break;
        case 1:
            hostname = args[args.length - 1];
            break;
        default:
            throw new IllegalArgumentException("invalid argument count");
        }
        try {
            hostId = new HostIdentifier(hostname);
        } catch (URISyntaxException e) {
            IllegalArgumentException iae = new IllegalArgumentException("Malformed Host Identifier: " + hostname);
            iae.initCause(e);
            throw iae;
        }
    }
    public boolean isQuiet() {
        return quiet;
    }
    public boolean showLongPaths() {
        return longPaths;
    }
    public boolean showVmArgs() {
        return vmArgs;
    }
    public boolean showVmFlags() {
        return vmFlags;
    }
    public boolean showMainArgs() {
        return mainArgs;
    }
    public HostIdentifier hostId() {
        return hostId;
    }
}

从上面的源码中可以看到, jps的主要使用的是sun.jvmstat.monitor里的工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值