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

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

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

  • 核心和/或处理器的数量
  • 32位与64位CPU
  • CPU缓存行大小
  • L1,L2,L3缓存的大小
  • 设置缓存的关联性
  • TLB的大小
  • 关于CPU的精确制造/型号信息
  • FSB信息
  • RAM的数量
  • 交换/虚拟内存量
  • 正在运行applet的JVM
  • 操作系统运行JVM
  • 系统负载
  • 已使用/未使用的Kernal线程数
  • 互联网连接的带宽
  • 内存可用
  • 显卡正在使用中
  • 如果正在显示操作系统
  • 正在使用的网络资源

是否有任何此类信息都包含在Java Applet中。 是否有用于查找此类信息的库? Applet基准测试工具来发现/猜测其中的一些? 你能想到任何聪明的技巧吗?

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

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

编辑

添加了其他信息:

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

java.lang.management。 OperatingSystemMXBean提供:

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

java.lang.management。 ManagementFactory

  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()编译代码所用的时间(以毫秒为单位) 。

很容易获得的是可通过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属性时,抛出了exception。

要获取默认情况下导致AccessControlException的那些属性,可能必须采取措施为applet提供权限以执行其中一些信息。 (以下是课程 安全限制部分的链接: Java教程中的 小程序 。)

Runtime类可以提供以下信息:

  • Runtime.availableProcessors方法为JVM提供的处理器(或核心,或逻辑线程)的数量。
  • Java虚拟机的内存信息,例如freeMemorymaxMemorymaxMemory

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

编辑

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

这里还有一些:

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

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

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

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

http://www.browserleaks.com/java

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