Java Applet可以发现多少硬件细节?

时间:2009-06-18 06:17:25

标签: java operating-system benchmarking

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

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

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

是否有任何此类信息都嵌入到Java Applet中。是否有用于查找此类信息的库? Applet基准测试工具可以发现/猜测其中一些?你能想到的任何巧妙的技巧吗?

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

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

修改

添加了其他信息:

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

java.lang.management。OperatingSystemMXBean 提供:

  1. getAvailableProcessors()相当于Runtime.availableProcessors()
  2. 的可用处理器数量
  3. getSystemLoadAverage()系统平均负载,系统最后一分钟的平均负载。
  4. java.lang.management。ManagementFactory

    1. getGarbageCollectorMXBeans() 会返回GarbageCollectorMXBeans列表。可以查询每个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()时间,以毫秒为单位编译代码。

3 个答案:

答案 0 :(得分:6)

可以通过System.getProperties(或System.getProperty)方法获取的信息非常简单。

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

System.getProperties提供的一些信息似乎可由applet访问,包括:

  • 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的属性,可能必须采取措施为applet提供权限以执行其中一些信息。 (以下是指向Security Restrictions Lesson: AppletsThe Java Tutorials部分的链接。)

Runtime类可以提供以下信息:

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

修改

来自Getting System PropertiesLesson: AppletsThe Java Tutorials页面提供了可以读取的属性列表,以及applet无法读取的属性列表。

答案 1 :(得分:1)

以下是其他内容:

java.awt.Toolkit或许可以告诉屏幕分辨率甚至更多关于显卡的信息(来自使用的颜色模型)。

你还可以分配一些更大的字节数组并测量访问时间,以获得有关缓存的近似信息(过去我们使用它来检查内存缓存技巧是否与Java一起工作;他们这样做)。但是,这些测试可能会暂停您的applet一段时间,因此您需要通知用户您正在做的事情。

进行建模的小程序可以测量传递的实时虚拟时间的比率。在检测到慢速系统之后,小程序可以增加集成步骤和类似的常量,从而需要更少的CPU时间,即使以不太完美的输出为代价。 Here有一个这样的自调整代码示例,用于调整鸟群行为模拟中的步速。

答案 2 :(得分:1)

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

http://www.browserleaks.com/java

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