我正在编写一个 Java 小程序,以便在不同的硬件下以不同的方式运行。例如,如果我知道一台计算机有大量 RAM 但处理器较弱,我可以改变一些时间与内存权衡的平衡。能够发现运行小程序的 CPU 的确切品牌和型号可能会有所帮助。有了这些信息,我就可以针对不同的系统对我的软件进行基准测试并找到瓶颈。

一般来说,我正在寻找的是:

  • 核心和/或处理器的数量
  • 32 位与 64 位 CPU
  • CPU 高速缓存线大小
  • L1、L2、L3 缓存大小
  • 设置缓存关联性
  • TLB的大小
  • CPU 的准确品牌/型号信息
  • 金融稳定委员会信息
  • 内存容量
  • 交换/虚拟内存量
  • 运行小程序的 JVM
  • 运行JVM的操作系统
  • 系统负载
  • 使用/未使用的内核线程数
  • 互联网连接带宽
  • 可用内存
  • 使用中的显卡
  • 如果操作系统正在可视化
  • 正在使用的网络资源

这些信息是否已融入 Java Applet 中?有图书馆可以查找这些信息吗?Applet 基准测试工具可以发现/猜测其中的一些吗?你能想到什么巧妙的技巧吗?

他们的计算机硬件的任何方面是否受到阻碍。也就是说,Java 小程序是否可以通过尝试访问某个东西但被拒绝(可能是特定的 TCP 端口或图形加速器)来检测某些东西正在使用或不可用。

免责声明:我知道关心硬件违背了 Java 不关心硬件的思想。虽然评论指出这一点可能对看到这个问题的其他读者有所帮助,但请注意,这样的答案不是我想要的。

编辑

添加了附加信息:

java.lang.管理 提供有关运行 JVM 的系统的各种信息。

java.lang.管理。操作系统MXBean 提供:

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

java.lang.管理。管理工厂

  1. getGarbageCollectorMXBeans() 返回 GarbageCollectorMXBean 列表。每个 垃圾收集器MXBean 可以查询以下信息:

    1. 获取集合计数() 使用此豆类发生的GC数量。
    2. 获取集合时间() GC的千分之一毫秒之间经过的近似累积时间。(笔记:Java 虚拟机 执行时可使用高 分辨率定时器来测量 经过时间)。
    3. 获取名称() 内存管理器的名称。
    4. 获取内存池名称() 此 gc 管理的内存池。
  2. 获取ThreadMXBean() 返回 线程MXBean 其中规定:

    1. getCurrentThreadCpuTime() 返回当前线程的总 CPU 时间(以纳秒为单位)。如果实现区分用户模式时间和系统模式时间,则返回的CPU时间是当前线程在用户模式或系统模式下执行的时间量。
  3. 获取运行时MXBean 回报 运行时MXBean
    1. 获取正常运行时间() Java 虚拟机的正常运行时间(以毫秒为单位)。
    2. 获取开始时间() Java 虚拟机的启动时间(以毫秒为单位)。
    3. 获取输入参数() 返回传递给 Java 虚拟机的输入参数,其中不包括 main 方法的参数。
  4. getCompilationMXBean 返回 编译MXBean
    1. 获取名称() JIT 的名称
    2. getTotalCompilationTime() 编译代码所花费的时间(以毫秒为单位)。
有帮助吗?

解决方案

非常容易获得的信息是通过以下方式访问的信息: System.getProperties (或者 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 类可以提供以下信息:

超出默认提供的信息 SystemRuntime 类可能需要调用操作系统,这将是依赖于平台的。

编辑

获取系统属性 页面来自 课:小程序Java 教程 提供小程序可以读取的属性列表和不能读取的属性列表。

其他提示

还有一些:

java.awt.工具包 也许能够告诉屏幕分辨率,甚至可能知道更多关于显卡的信息(从使用的颜色模型)。

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

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

获取网络接口 您可以枚举系统中的网络接口:

http://www.browserleaks.com/java

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top