【问题标题】:How many hardware details can a Java Applet Discover?Java Applet 可以发现多少硬件细节?
【发布时间】:2010-11-03 21:47:09
【问题描述】:

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

一般我要找的是:

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

这些信息中是否有任何信息被嵌入到 Java Applet 中。是否有图书馆可以找到这些信息? Applet 基准测试工具来发现/猜测其中的一些?你能想到什么妙招?

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

免责声明:我知道关心硬件与不关心硬件的 Java 意识形态背道而驰。虽然 cmets 指出这一点可能对看到此问题的其他读者有所帮助,但请注意,这些答案不是我想要的。

编辑

添加了附加信息:

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

java.lang.management.OperatingSystemMXBean 提供:

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

java.lang.management.ManagementFactory

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

    1. getCollectionCount() 使用此发生的 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() 编译代码所需的时间(以毫秒为单位)。

【问题讨论】:

    标签: java operating-system benchmarking


    【解决方案1】:

    很容易获得的是通过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 的属性,可能必须采取一些步骤来授予小程序执行其中一些信息的权限。 (这里是来自The Java TutorialsLesson: AppletsSecurity Restrictions 部分的链接。)

    Runtime 类可以提供如下信息:

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

    编辑

    来自Lesson: AppletsThe Java TutorialsGetting System Properties 页面提供了一个可以读取的属性列表,以及一个小程序无法读取的属性列表。

    【讨论】:

      【解决方案2】:

      这里还有一些:

      java.awt.Toolkit 可能能够判断屏幕分辨率,甚至可以判断显卡的更多信息(来自使用的颜色模型)。

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

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

      【讨论】:

      • 很好的答案,我根本没有考虑过使用 awt。针对 java 的内存缓存技巧过去两年我一直在这个领域工作。我很好奇你为什么要这样做?
      • 我在我的大学里有一门关于缓存架构的课程,并决定检查这个经验是否可以在 Java 中重用。 Java 实际上对对象在内存中的放置方式提供了更多控制:如果按顺序分配,它们通常是相邻分配的。此外,原始数组的成员彼此相邻分配。我正在玩数组元素访问,访问彼此相邻的元素或可能彼此远离的随机元素。缓存不能轻易支持随机、大规模的访问,而且需要更长的时间。
      【解决方案3】:

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

      http://www.browserleaks.com/java

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

      【讨论】:

        猜你喜欢
        • 2021-06-12
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-18
        • 2016-03-13
        • 2017-09-19
        相关资源
        最近更新 更多