如何区分Windows上的两个运行java进程?
How to distinguish two running java processes on Windows?
我有一些代码 运行 java.exe 使用命令行启动游戏。由于玩家不会同时启动多个游戏程序实例,所以我需要检查游戏是否已运行ning。
对于普通的exe文件,我可以从进程信息中获取exe路径。但对于java游戏,执行文件路径始终是java.exe
或javaw.exe
的路径。于是想到了获取jar文件运行ning的命令行信息。但是获取不到命令行是有原因的:
Remember that from Win32's point of view, the command line is just a string that is copied into the address space of the new process. How the launching process and the new process interpret this string is governed not by rules but by convention.
所以,我需要另一种方法来做这样的事情,但我想不出任何方法来区分两个 java 进程。谁能给我一些提示?
您不必从您的启动器 运行 java.exe
。相反,您的启动器可能会使用 Invocation API 创建进程内 JVM。通过这种方式,您可以检查可执行文件路径、检查命令行、创建命名互斥体或做任何您想做的事,而无需依赖外部 Java 启动器。
另一个解决方案是使用Jvmstat Performance Counters找到系统中其他Java进程的主要class、参数和VM选项,就像jps
一样jcmd
实用程序可以。这个想法是每个 Java 进程(除非 运行 和 -XX:+PerfDisableSharedMem
)将某些 运行 时间信息导出为用户 Temp\hsperfdata_user
文件夹中的内存映射文件。所以你可以检查这些文件,看看它们是否属于游戏。
我想您可以将 JVM 参数作为“-Dservice.name”传递。然后从启动文件(.bat 或 .sh 文件)中,在再次启动它之前,您可以检查一个进程是否已经 运行 service.name。并做出相应的决定。
我有一些代码 运行 java.exe 使用命令行启动游戏。由于玩家不会同时启动多个游戏程序实例,所以我需要检查游戏是否已运行ning。
对于普通的exe文件,我可以从进程信息中获取exe路径。但对于java游戏,执行文件路径始终是java.exe
或javaw.exe
的路径。于是想到了获取jar文件运行ning的命令行信息。但是获取不到命令行是有原因的:
Remember that from Win32's point of view, the command line is just a string that is copied into the address space of the new process. How the launching process and the new process interpret this string is governed not by rules but by convention.
所以,我需要另一种方法来做这样的事情,但我想不出任何方法来区分两个 java 进程。谁能给我一些提示?
您不必从您的启动器 运行 java.exe
。相反,您的启动器可能会使用 Invocation API 创建进程内 JVM。通过这种方式,您可以检查可执行文件路径、检查命令行、创建命名互斥体或做任何您想做的事,而无需依赖外部 Java 启动器。
另一个解决方案是使用Jvmstat Performance Counters找到系统中其他Java进程的主要class、参数和VM选项,就像jps
一样jcmd
实用程序可以。这个想法是每个 Java 进程(除非 运行 和 -XX:+PerfDisableSharedMem
)将某些 运行 时间信息导出为用户 Temp\hsperfdata_user
文件夹中的内存映射文件。所以你可以检查这些文件,看看它们是否属于游戏。
我想您可以将 JVM 参数作为“-Dservice.name”传递。然后从启动文件(.bat 或 .sh 文件)中,在再次启动它之前,您可以检查一个进程是否已经 运行 service.name。并做出相应的决定。