我正在编写一个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提供:
> getAvailableProcessors()可用处理器数量等于Runtime.availableProcessors()
> getSystemLoadAverage()系统平均负载最后一分钟的系统负载平均值.
java.lang.management.ManagementFactory
> getGarbageCollectorMXBeans()返回GarbageCollectorMXBeans列表.可以查询每个GarbageCollectorMXBean以获取以下信息:
> getCollectionCount()使用此次发生的gc数
豆角,扁豆.
> getCollectionTime()大约累计时间已过
gc之间的毫秒数. (注意:
Java虚拟机
实施可能会使用高
分辨率计时器来测量
经过的时间.)
> getName()内存管理器的名称.
> getMemoryPoolNames()此gc管理的内存池.
> getThreadMXBean()返回ThreadMXBean,其中提供:
> getCurrentThreadCpuTime()以纳秒为单位返回当前线程的总CPU时间.如果实现区分用户模式时间和系统模式时间,则返回的CPU时间是当前线程在用户模式或系统模式下执行的时间量.
> getRuntimeMXBean返回RuntimeMXBean
> getUptime() Java虚拟机的正常运行时间(以毫秒为单位).
> getStartTime() Java虚拟机的启动时间(以毫秒为单位).
> getInputArguments()返回传递给Java虚拟机的输入参数,该参数不包含main方法的参数.
> getCompilationMXBean返回CompilationMXBean
> getName() JIT的名称
> 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属性时,抛出了异常.
要获取默认情况下导致AccessControlException的那些属性,可能必须采取措施为applet提供权限以执行其中一些信息. (这是从The Java Tutorials开始的Security Restrictions Security Restrictions部分的链接.)
Runtime类可以提供以下信息:
> Runtime.availableProcessors
方法可供JVM使用的处理器(或核心或逻辑线程)数量.
> Java虚拟机的内存信息,例如freeMemory
,maxMemory
和totalMemory
.
除了默认的System和Runtime类提供的信息之外,可能还需要调用操作系统,这与平台有关.
编辑
0700年7月4日的Getting System Properties页面提供了可以读取的属性列表,以及applet无法读取的属性列表.