微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java ProcessHandle.Info.totalCpuDuration() 返回很少的数据

如何解决Java ProcessHandle.Info.totalCpuDuration() 返回很少的数据

Optional<Duration> totalcpuDuration(); 的 'ProcessHandle.Info' 方法何时返回信息?

我试过使用和不使用 sudo,似乎没有太大区别;无论哪种方式,只有当前进程返回非空值。文档没有说太多。

是什么阻止了在 sudo(在 MacOS 或 Linux 上)下运行的 JVM stdlib 获取该信息?只是没有实施吗?获取这些信息会不会太慢?

解决方法

这与权限无关,至少在 MacOS 上是这样:只是尚未实施(截至 2021 年 5 月)。

对于 linux,代码似乎通过所有进程的 proc fs 读取 cpu 时间,或者至少尝试读取,权限可能适用。

对于 MacOS,它只读取当前进程的信息。它是硬编码的:if (pid == getpid()) { ... };不会尝试从其他进程获取此信息。


MacOS:

https://github.com/openjdk/jdk15u/blob/master/src/java.base/macosx/native/libjava/ProcessHandleImpl_macosx.c

Linux:

https://github.com/openjdk/jdk15u/blob/master/src/java.base/linux/native/libjava/ProcessHandleImpl_linux.c


这里有一个答案,其中包含一些代码来实现 Java 和 shell exec 的解决方法:

https://stackoverflow.com/a/36381244/336356

,

获取进程总 CPU 持续时间的另一种方法是

ProcessHandle processHandle = ProcessHandle.of(<system pid>).get();
ProcessHandle.Info processInfo = processHandle.info();
long timeDiff = Instant.now().getEpochSecond() - processInfo.startInstant().get().getEpochSecond();

这适用于用户有权访问的任何进程,而不仅仅是当前进程。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。