7

我正在编写一个 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提供:

  1. getAvailableProcessors()等效的可用处理器数量Runtime.availableProcessors()
  2. getSystemLoadAverage()系统上的平均负载是最后一分钟的系统负载平均值。

java.lang.management。管理工厂

  1. getGarbageCollectorMXBeans()返回GarbageCollectorMXBeans 列表。可以查询每个 GarbageCollectorMXBean以获取以下信息:

    1. getCollectionCount()使用此 bean 发生的 gc 数。
    2. getCollectionTime() gc 之间经过的近似累积时间(以毫秒为单位)。(注意:Java 虚拟机实现可能使用高分辨率计时器来测量经过的时间。)
    3. getName()内存管理器的名称。
    4. getMemoryPoolNames()此 gc 管理的内存池。
  2. getThreadMXBean()返回ThreadMXBean,它提供:

    1. getCurrentThreadCpuTime()返回当前线程的总 CPU 时间(以纳秒为单位)。如果实现区分用户模式时间和系统模式时间,则返回的 CPU 时间是当前线程在用户模式或系统模式下执行的时间量。
  3. getRuntimeMXBean返回RuntimeMXBean
    1. getUptime() Java 虚拟机的正常运行时间,以毫秒为单位。
    2. getStartTime() Java 虚拟机的启动时间,以毫秒为单位。
    3. getInputArguments()返回传递给 Java 虚拟机的输入参数,其中不包括 main 方法的参数。
  4. getCompilationMXBean返回CompilationMXBean
    1. getName() JIT 的名称
    2. getTotalCompilationTime()编译代码所需的时间(以毫秒为单位)。
4

3 回答 3

6

很容易获得的是通过System.getProperties(or System.getProperty) 方法可访问的信息。

例如,os.name将返回操作系统的名称。在我的系统上,我得到了Windows XP结果。

一些可用的信息System.getProperties,似乎可以通过小程序访问,包括:

  • java.vm.version-- JVM 的版本。
  • java.vm.vendor-- JVM 的供应商名称。
  • java.vm.name-- JVM 的名称。
  • os.name-- 操作系统的名称。(例如Windows XP
  • os.arch——系统架构。(例如x86
  • os.version-- 操作系统的版本。(例如5.1
  • java.specification.version-- JRE 规范版本。

以上不是一个完整的列表,但它可以提供一些关于系统是什么样的想法。

需要注意的是,并不是所有可以System.getProperties通过AccessControlException. 当我试图读取该java.home属性时,抛出了一个异常。

要获得默认情况下导致的那些属性,AccessControlException可能必须采取一些步骤来授予小程序执行其中一些信息的权限。(这里是课程安全限制部分的链接: Java 教程中的小程序。)

该类Runtime可以提供以下信息:

System除了默认和类提供的信息之外,Runtime可能还需要调用操作系统,这将取决于平台。

编辑

课程中的获取系统属性页面Java 教程的小程序提供了一个可以读取的属性列表,以及一个小程序无法读取的属性列表。

于 2009-06-18T08:17:50.587 回答
1

这里还有一些:

java.awt.Toolkit可能能够告诉屏幕分辨率,甚至可能更多关于图形卡的信息(来自使用的颜色模型)。

您还可以分配一些更大的字节数组并测量访问时间以获取有关缓存的大致信息(过去我们使用它来检查内存缓存技巧是否适用于 Java;他们确实如此)。但是,这些测试可能会使您的小程序挂起一段时间,因此您需要通知用户您正在执行的操作。

进行建模的小程序可以测量经过的虚拟时间与经过的实际时间的比率。在检测到慢速系统后,小程序可以增加积分步长和类似的常数,以减少 CPU 时间,即使以不太完美的输出为代价。这里有一个这样的自我调整代码的例子,它在模拟鸟群行为时调整步速。

于 2011-03-02T12:58:18.383 回答
1

使用getNetworkInterfaces,您可以枚举系统中的网络接口:

http://www.browserleaks.com/java

它可能会显示重要信息,例如网络适配器名称和连接名称。

于 2012-03-26T13:04:19.630 回答