Domanda

Sto scrivendo un'applet Java per funzionare in modo diverso con hardware diverso. Ad esempio, se so che un computer ha una grande quantità di RAM ma un processore debole, posso modificare il bilanciamento di alcuni compromessi della memoria temporale. Essere in grado di scoprire la marca e il modello esatti della CPU su cui è in esecuzione l'applet potrebbe essere utile. Avere tali informazioni mi permetterebbe di confrontare il mio software con sistemi diversi e trovare strozzature.

Generalmente quello che sto cercando è:

  • Numero di core e / o processori
  • CPU 32 bit vs 64 bit
  • Dimensione linea cache CPU
  • Dimensione della cache L1, L2, L3
  • Imposta associatività della cache
  • Dimensioni di TLB
  • Informazioni esatte su marca / modello sulla CPU
  • Informazioni FSB
  • Quantità di RAM
  • Quantità di memoria virtuale / di scambio
  • La JVM in cui è in esecuzione l'applet
  • Sistema operativo che esegue JVM
  • Caricamento sistema
  • Numero di thread Kernal usati / non utilizzati
  • Larghezza di banda della connessione Internet
  • Memoria disponibile
  • Schede grafiche in uso
  • Se il sistema operativo viene visualizzato
  • Risorsa di rete in uso

Qualcuna di queste informazioni è inserita in Applet Java. Ci sono librerie per trovare queste informazioni? Strumenti di benchmarking delle applet per scoprire / indovinare un po ' Qualche trucco intelligente che ti viene in mente?

Sono i loro aspetti dell'hardware del computer che stanno bloccando. Cioè, un'applet Java potrebbe rilevare che qualcosa è in uso o non disponibile provando ad accedervi e essere negato (forse una determinata porta TCP o acceleratore grafico).

Dichiarazione di non responsabilità: so che preoccuparsi dell'hardware va contro l'ideologia Java di non preoccuparsi dell'hardware. Mentre i commenti sottolineano questo può essere utile per altri lettori che vedono questa domanda, tieni presente che tali risposte non sono ciò che sto cercando.

Modifica

Aggiunte ulteriori informazioni:

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

java.lang.management. OperatingSystemMXBean fornisce:

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

java.lang.management. ManagementFactory

  1. getGarbageCollectorMXBeans () restituisce un elenco diGarbageCollectorMXBeans. Ogni GarbageCollectorMXBean può essere richiesto le seguenti informazioni:

    1. getCollectionCount () numero di gc che si sono verificati utilizzando questo fagiolo.
    2. getCollectionTime () tempo approssimativo accumulato trascorso tra gc in millisecondi. (Nota: La macchina virtuale Java l'implementazione può usare un alto timer di risoluzione per misurare il tempo trascorso.)
    3. getName () il nome del gestore della memoria.
    4. getMemoryPoolNames () i pool di memoria gestiti da questo gc.
  2. getThreadMXBean () restituisce il ThreadMXBean che fornisce:

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

Soluzione

Quelli che sono abbastanza semplici da ottenere sono le informazioni accessibili tramite 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 < code> System.getProperties , che sembra essere accessibile dall'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 es. Windows XP )
  • os.arch - architettura del sistema. (ad es. x86 )
  • os.version - versione del sistema operativo. (ad es. 5.1 )
  • java.specification.version - Versione della specifica JRE.

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

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

Per ottenere quelle proprietà che causano un AccessControlException per impostazione predefinita, si dovrebbero probabilmente adottare delle misure per concedere le autorizzazioni all'applet per eseguire alcune di queste informazioni. (Ecco un link alla Restrizioni di sicurezza della Lezione: Applet da The Java Tutorials .)

La classe Runtime può fornire informazioni come:

Al di là delle informazioni fornite dalle classi System e Runtime predefinite probabilmente richiederebbe di effettuare chiamate al sistema operativo, che dipenderà dalla piattaforma.

Modifica

La pagina Proprietà del sistema da < a href = "http://java.sun.com/docs/books/tutorial/deployment/applet/index.html" rel = "nofollow noreferrer"> Lezione: Applet di Tutorial Java fornisce un elenco di proprietà che è possibile leggere e un elenco di proprietà che non possono essere letto dalle applet.

Altri suggerimenti

Eccone alcuni:

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

Puoi anche allocare un array più grande 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 funzionano con Java; lo fanno). Tuttavia, questi test potrebbero sospendere l'applet per qualche tempo, quindi è necessario informare l'utente che si sta eseguendo.

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

Con getNetworkInterfaces puoi enumerare le interfacce di rete nel tuo sistema:

http://www.browserleaks.com/java

Potrebbe mostrare informazioni significative, come il nome della scheda di rete e il nome della connessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top