代码之家  ›  专栏  ›  技术社区  ›  Ethan Heilman

Java小程序可以发现多少硬件细节?

  •  7
  • Ethan Heilman  · 技术社区  · 17 年前

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

    一般来说,我要找的是:

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

    是否将这些信息放入Java小程序中。有图书馆可以找到这些信息吗?小程序基准测试工具发现/猜测其中的一些?你能想到什么聪明的把戏吗?

    它们是计算机硬件的任何一个阻碍因素。也就是说,Java Applet可以通过尝试访问它和被拒绝(可能是特定的TCP端口或图形加速器)来检测正在使用或不可用的东西。

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

    编辑

    附加信息:

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

    java.lang.management。 OperatingSystemMXBean 提供:

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

    java.lang.management。 ManagementFactory

    1. getGarbageCollectorMXBeans() 返回GarbageCollector或Xbeans的列表。各 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 回复  |  直到 12 年前
        1
  •  6
  •   coobird    17 年前

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

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

    一些可用信息 System.GetProperties(系统属性) 小程序似乎可以访问的内容包括:

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

    上面并不是一个全面的列表,但是它可以给出一些系统是什么样子的想法。

    应注意的是,并非所有通过 System.GetProperties(系统属性) 可以读取,对于某些属性,安全管理器将导致 AccessControlException . 当我试图阅读 java.home 属性,引发了异常。

    以获得导致 访问控制异常 默认情况下,可能需要采取措施授予小程序执行某些信息的权限。(这里有一个链接指向 Security Restrictions 剖面图 Lesson: Applets The Java Tutorials )

    这个 Runtime 类可以提供以下信息:

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

    编辑

    这个 Getting System Properties 页面从 课程:小应用程序 属于 java实用指导 提供可读取的属性列表,以及小程序无法读取的属性列表。

        2
  •  1
  •   Audrius Meskauskas    15 年前

    这里还有一些:

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

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

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

        3
  •  1
  •   J_z    14 年前

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

    http://www.browserleaks.com/java

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