如何区分在Windows上运行的两个Java进程?

我有一些代码用命令行运行java.exe来启动游戏。 由于我不是玩家同时启动多个游戏程序实例,所以我需要检查游戏是否已经运行。

对于正常的exe文件,我可以从进程信息中获得exepath。 但是对于java游戏,执行文件path总是java.exejavaw.exe的path。 所以我曾经想过获取命令行信息来运行jar文件。 但是我无法得到命令行的原因是:

请记住,从Win32的angular度来看,命令行只是一个复制到新进程地址空间的string。 启动过程和新过程如何解释这个string不是由规则而是由惯例来pipe理的。

所以,我需要另一种方式来做这样的事情,但我想不出任何方法来区分两个java进程。 任何人都可以给我一些提示?

您不必从启动程序运行java.exe 。 相反,您的启动器可以通过使用调用API来创建进程内JVM。 通过这种方式,您可以检查可执行文件的路径,检查命令行,创建已命名的互斥锁或执行任何您想要的操作,而不依赖于外部Java启动器。

另一种解决方案是使用Jvmstat性能计数器来查找系统中其他Java进程的主类,参数和VM选项,就像jpsjcmd权限一样。 这个想法是,每个Java进程(除非用-XX:+PerfDisableSharedMem运行)将某些运行时信息导出为用户的Temp\hsperfdata_user文件夹中的内存映射文件。 所以你可以检查这些文件,看看它们是否属于游戏。

我猜你可以传递JVM参数为“-Dservice.name”。 然后从启动文件(.bat或.sh文件),再次启动之前,您可以检查进程是否已经与service.name或已经运行。 并据此作出决定。