我正在编写一个 Java 小程序以在不同的硬件下以不同的方式运行。例如,如果我知道一台计算机有大量 RAM 但处理器较弱,我可以改变一些时间内存权衡的平衡。能够发现运行小程序的 CPU 的确切品牌和型号可能会有所帮助。拥有这些信息将使我能够针对不同的系统对我的软件进行基准测试并找到瓶颈。
一般来说,我正在寻找的是:
- 内核和/或处理器的数量
- 32 位与 64 位 CPU
- CPU 缓存行大小
- L1、L2、L3 缓存大小
- 设置缓存的关联性
- TLB 大小
- CPU 上的确切品牌/型号信息
- 外频信息
- 内存量
- 交换/虚拟内存量
- 运行小程序的 JVM
- 运行 JVM 的操作系统
- 系统负载
- 使用/未使用的内核线程数
- 互联网连接带宽
- 可用内存
- 正在使用的显卡
- 如果操作系统正在可视化
- 正在使用的网络资源
这些信息中是否有任何信息被嵌入到 Java Applets 中。是否有图书馆可以找到这些信息?Applet 基准测试工具来发现/猜测其中的一些?你能想到什么巧妙的技巧吗?
他们是阻塞的计算机硬件的任何方面。也就是说,Java 小程序是否可以通过尝试访问它并被拒绝(可能是特定的 TCP 端口或图形加速器)来检测正在使用或不可用的东西。
免责声明:我知道关心硬件与不关心硬件的 Java 意识形态背道而驰。虽然评论指出这一点可能对看到这个问题的其他读者有所帮助,但请注意,这样的答案不是我想要的。
编辑
添加了附加信息:
java.lang. 管理提供有关运行 JVM 的系统的各种信息。
java.lang.management。OperatingSystemMXBean提供:
- getAvailableProcessors()等效的可用处理器数量Runtime.availableProcessors()
- getSystemLoadAverage()系统上的平均负载是最后一分钟的系统负载平均值。
java.lang.management。管理工厂
getGarbageCollectorMXBeans()返回GarbageCollectorMXBeans 列表。可以查询每个 GarbageCollectorMXBean以获取以下信息:
- getCollectionCount()使用此 bean 发生的 gc 数。
- getCollectionTime() gc 之间经过的近似累积时间(以毫秒为单位)。(注意:Java 虚拟机实现可能使用高分辨率计时器来测量经过的时间。)
- getName()内存管理器的名称。
- getMemoryPoolNames()此 gc 管理的内存池。
getThreadMXBean()返回ThreadMXBean,它提供:
- getCurrentThreadCpuTime()返回当前线程的总 CPU 时间(以纳秒为单位)。如果实现区分用户模式时间和系统模式时间,则返回的 CPU 时间是当前线程在用户模式或系统模式下执行的时间量。
- getRuntimeMXBean返回RuntimeMXBean
- getUptime() Java 虚拟机的正常运行时间,以毫秒为单位。
- getStartTime() Java 虚拟机的启动时间,以毫秒为单位。
- getInputArguments()返回传递给 Java 虚拟机的输入参数,其中不包括 main 方法的参数。
- getCompilationMXBean返回CompilationMXBean
- getName() JIT 的名称
- getTotalCompilationTime()编译代码所需的时间(以毫秒为单位)。