2009-06-18 12 views
7

Sto scrivendo un'applet Java per funzionare in modo diverso su hardware diverso. Ad esempio, se conosco un computer con una grande quantità di RAM ma un processore debole, posso alterare il bilanciamento di alcuni compromessi della memoria temporale. Potrebbe essere utile scoprire la marca e il modello esatti della CPU su cui è in esecuzione l'applet. Avere tali informazioni mi permetterebbe di confrontare il mio software con diversi sistemi e trovare colli di bottiglia.Quanti dettagli hardware può rilevare una applet Java?

In generale quello che sto cercando è:

  • Numero di core e/o incaricati del trattamento
  • 32 bit vs 64 bit CPU
  • CPU dimensioni linea di cache
  • Superficie L1, L2 , cache L3
  • Set associatività della cache di
  • Dimensioni della TLB
  • Marchio Exact/Mo del informazioni sulla CPU informazioni
  • FSB
  • Quantità di RAM
  • Quantità di swap/memoria virtuale
  • JVM in cui l'applet viene eseguito
  • sistema operativo in esecuzione JVM
  • Load
  • Numero di impiegati/inutilizzati discussioni Kernal
  • larghezza di banda di connessione a internet
  • Memor y disponibili
  • schede grafiche in uso
  • Se il sistema operativo viene visualizzato
  • risorsa di rete in uso

è una di queste informazioni cotto in applet Java. Ci sono biblioteche per trovare una di queste informazioni? Strumenti di analisi comparativa di applet per scoprirne/indovinare un po '? Qualche trucco intelligente a cui riesci a pensare?

I loro aspetti dell'hardware del computer che stanno bloccando. Cioè, un'applet Java può rilevare che qualcosa è in uso o non disponibile cercando di accedervi e negato (forse una particolare porta TCP o acceleratore grafico).

Disclaimer: So che preoccuparsi dell'hardware va contro l'ideologia Java di non preoccuparsi dell'hardware. Anche se i commenti lo mettono in evidenza potrebbero essere utili per gli altri lettori che vedono questa domanda, ti preghiamo di notare che tali risposte non sono quello che sto cercando.

EDIT

Aggiunto ulteriori informazioni:

java.lang. management fornisce tutti i tipi di informazioni sul sistema su cui è in esecuzione la JVM.

java.lang.management.OperatingSystemMXBean prevede:

  1. getAvailableProcessors() Il numero di processori disponibili equivalenti Runtime.availableProcessors()
  2. getSystemLoadAverage() Il carico medio del sistema, il carico medio del sistema per l'ultimo minuto.

java.lang.management. ManagementFactory

  1. getGarbageCollectorMXBeans() restituisce un elenco ofGarbageCollectorMXBeans. Ogni GarbageCollectorMXBean possono essere interrogati per le seguenti informazioni:

    1. getCollectionCount() numero di GC che hanno verificato utilizzando questo fagiolo.
    2. getCollectionTime() tempo approssimativo trascorso tra gc in millisecondi. (Nota: il virtuale implementazione Java macchina può utilizzare un timer ad alta risoluzione per misurare il tempo trascorso .)
    3. getName() il nome del gestore di memoria.
    4. getMemoryPoolNames() i pool di memoria gestiti da questo gc.
  2. getThreadMXBean() restituisce il ThreadMXBean che prevede:

    1. getCurrentThreadCpuTime() Restituisce il tempo totale di CPU per il thread corrente in nanosecondi. Se l'implementazione distingue tra tempo della modalità utente e tempo della modalità di sistema, il tempo di CPU restituito è la quantità di tempo che il thread corrente ha eseguito in modalità utente o di sistema.
  3. getRuntimeMXBean rendimenti RuntimeMXBean
    1. getUptime() uptime della macchina virtuale Java in millisecondi.
    2. getStartTime() ora di avvio della macchina virtuale Java in millisecondi.
    3. getInputArguments() Restituisce gli argomenti di input passati alla macchina virtuale Java che non include gli argomenti del metodo principale.
  4. getCompilationMXBean restituisce il CompilationMXBean
    1. getName() il nome del JIT
    2. getTotalCompilationTime() tempo in millisecondi impiegato per compilare il codice.

risposta

6

Quelli che sono abbastanza semplice da ottenere le informazioni sono accessibili tramite il metodo System.getProperties (o System.getProperty).

Ad esempio, os.name restituirà il nome del sistema operativo. Sul mio sistema, ho ottenuto il Windows XP come risultato.

Alcune informazioni disponibili da System.getProperties, che sembra essere raggiungibile con l'applet includono:

  • java.vm.version - versione della JVM.
  • java.vm.vendor - nome del fornitore della JVM.
  • java.vm.name - nome della JVM.
  • os.name - nome del sistema operativo. (ad esempio Windows XP)
  • os.arch - architettura del sistema. (ad esempio x86)
  • os.version - versione del sistema operativo. (ad esempio 5.1)
  • java.specification.version - Versione specifica JRE.

Quanto sopra non è un elenco completo, ma può fornire alcune idee su come è il sistema.

Si noti che non tutte le proprietà disponibili tramite System.getProperties possono essere lette, come per alcune proprietà, il gestore sicurezza causerà un AccessControlException. Quando ho provato a leggere la proprietà java.home, è stata generata un'eccezione.

Per ottenere quelle proprietà che causano uno AccessControlException per impostazione predefinita, è probabile che si debbano eseguire dei passi per fornire le autorizzazioni all'applet per eseguire alcune di tali informazioni. (Questo è il link alla sezione Security Restrictions del Lesson: Applets da The Java Tutorials.)

La classe Runtime in grado di fornire informazioni quali:

Al di là delle informazioni fornite dal default System e Runtime classi richiederebbe probabilmente effettuare chiamate al sistema operativo, che sarebbe dipendente dalla piattaforma.

Modifica

La pagina Getting System Properties da Lesson: Applets di The Java Tutorials fornisce un elenco delle proprietà che può essere letto, e una lista di proprietà che non possono essere letti da applet.

1

Qui ci sono alcuni più:

java.awt.Toolkit può essere in grado di dire la risoluzione dello schermo e forse anche qualcosa di più sulla scheda grafica (dal modello colore utilizzato).

È inoltre possibile allocare un numero maggiore di byte e misurare i tempi di accesso per ottenere informazioni approssimative sulla cache (in passato abbiamo giocato con questo per verificare se i trucchi della cache di memoria funzionassero con Java affatto). Tuttavia questi test potrebbero bloccare l'applet per un po 'di tempo, quindi devi informare l'utente che stai facendo.

Le applet che eseguono la modellazione possono misurare il rapporto tra il tempo virtuale passato e il tempo reale passato. Dopo aver rilevato un sistema lento, l'applet può aumentare il passo di integrazione e costanti simili a richiedere meno tempo di CPU, anche a spese dell'output meno perfetto. Here c'è un esempio di tale codice di autoregolazione che regola la velocità del passo nella simulazione del comportamento del gregge degli uccelli.

+0

Buona risposta, non avevo pensato di usare affatto awt. Trucchi della cache della memoria contro java Ho lavorato in quest'area negli ultimi due anni. Sono curioso perché stavi facendo questo? –

+0

Ho seguito un corso sulle architetture della cache nella mia università e ho deciso di verificare se questa esperienza può essere riutilizzata in Java. Java in realtà fornisce un maggiore controllo sul modo in cui gli oggetti vengono inseriti nella memoria: se allocati in una sequenza, vengono solitamente allocati uno accanto all'altro. Inoltre, i membri dell'array primitivo vengono allocati uno accanto all'altro. Stavo giocando con l'accesso all'elemento dell'array, accedendo a uno accanto all'altro o a elementi casuali che possono essere distanti l'uno dall'altro. L'accesso casuale a larga scala non può essere facilmente supportato dalla cache e richiede più tempo. –

1

Con getNetworkInterfaces è possibile enumerare le interfacce di rete nel sistema:

http://www.browserleaks.com/java

Si può mostrare un significativo informazioni, come il nome della scheda di rete e il nome della connessione.