View Full Version : [JAVA] Quando lancio + JAR da console, ognuno gira isolato in una sua JVM o no?
Matrixbob
05-03-2012, 09:54
Quando lancio + JAR da console, ognuno gira isolato in una sua JVM o no?
Chiedo perchè nel caso NON fosse 1 lancio .JAR --> 1 JVM, allora dovrei fare attenzione ad usare variabili statiche di classe, giusto?
Potrei andarmi a sovrascrivere i dati come un pirla.
Voi sapete sta cosa?
TNX a lot!
Quando lancio + JAR da console, ognuno gira isolato in una sua JVM o no?
Chiedo perchè nel caso NON fosse 1 lancio .JAR --> 1 JVM, allora dovrei fare attenzione ad usare variabili statiche di classe, giusto?
Potrei andarmi a sovrascrivere i dati come un pirla.
Voi sapete sta cosa?
TNX a lot!
...sovrascrivere le variabili?...
Matrixbob
05-03-2012, 10:20
...sovrascrivere le variabili?...
Eh le famose variabili di classe ... quelle dichiarate static sono di classe e non di istanza dell'oggetto.
brodaglia
05-03-2012, 10:54
Se vuoi preserevare lo stato di alcune variabili, evitando gli accessi concorrenziali, ti conviene crearti blocchi sincronizzati o eseguire lock sugli oggetti tramite wait().
Matrixbob
05-03-2012, 11:28
Se vuoi preserevare lo stato di alcune variabili, evitando gli accessi concorrenziali, ti conviene crearti blocchi sincronizzati o eseguire lock sugli oggetti tramite wait().
Diciamo che il mio target e che ognuno dei miei jar scrivi sullo stesso file report.log le azioni che sta compiendo sul suo input e distinguersi.
Pensavo ad isolare la sua esecuzione piuttosto che a sincronizzare/bloccare oggetti.
Anche perchè il log4j dovrebbe essere singleton di suo.
...sospetto basti fugare i dubbi con una semplice classe di test...mi sembra strano comunque che questo possa avvenire...
Matrixbob
05-03-2012, 12:24
...sospetto basti fugare i dubbi con una semplice classe di test...mi sembra strano comunque che questo possa avvenire...
Che possa avvenire cosa ti sembra strano?
...sospetto qui (http://www.hwupgrade.it/forum/showthread.php?t=686133) possa esserci una risposta...
Per ogni java -jar pippo.jar è istanziata una nuova jvm. Anche se "pippo.jar" è lo stesso, ognuna ha la sua fettona di memoria, classi nominalmente identiche sono entità diverse e non interagiscono.
C'è un livello di condivisione nella piattaforma Java di oracle (il cosidetto class data sharing) ma quello riguarda il file da cui è generata la classe.
Il discorso cambia ad esempio per le Applet: lì il plugin-in può usare una stessa jvm per eseguire più applet ed essendo la jvm sempre quella a certe condizioni è possibile che l'applet A veda il valore del campo statico della classe C impostato dall'applet B anche se le applet appartengono a pagine diverse.
brodaglia
05-03-2012, 17:00
Diciamo che il mio target e che ognuno dei miei jar scrivi sullo stesso file report.log le azioni che sta compiendo sul suo input e distinguersi.
Pensavo ad isolare la sua esecuzione piuttosto che a sincronizzare/bloccare oggetti.
Anche perchè il log4j dovrebbe essere singleton di suo.
Puoi costruirti un log apposito, specificando nel tracciato il valore del thread in esecuzione per esempio con Thread.currentThread().
Non li vedrai in sequenza ma dovresti essere in grado di distinguerli..
Matrixbob
06-03-2012, 12:05
Puoi costruirti un log apposito, specificando nel tracciato il valore del thread in esecuzione per esempio con Thread.currentThread().
Non li vedrai in sequenza ma dovresti essere in grado di distinguerli..
Questa l'avevo pensata, ma un mio collega mi disse che essendo la computazione principale li avrei avuto 0 o lo stesso valore per tutti i jar.
Forse non è così, dovrei provare de facto.
Matrixbob
06-03-2012, 12:07
Per ogni java -jar pippo.jar è istanziata una nuova jvm. Anche se "pippo.jar" è lo stesso, ognuna ha la sua fettona di memoria, classi nominalmente identiche sono entità diverse e non interagiscono.
TNX a lot, se le cose stanno veramente così, questo è molto importante.
Grazie.
Matrixbob
06-03-2012, 17:35
Confermo che i jar girano isolati come memoria, mentre l'id del thread si ripete per esecuzioni differenti e nel mio caso quindi NON è descripante.
http://img72.imageshack.us/img72/4724/immaginejn.jpg
brodaglia
07-03-2012, 15:07
Allora probabilmente un framework di logging dovrebbe fare al caso tuo, tipo log4j.
Matrixbob
08-03-2012, 14:31
Allora probabilmente un framework di logging dovrebbe fare al caso tuo, tipo log4j.
Si si il log4j è il re dei fw di logging, ma il mio problema era mettere un marking per distinguere il Lui:/Lei:/Egli: di un dialogo (quello dei jar a me lettore del log) sullo stesso unico log.
Usando log4j + le variabili statiche, lanciando N volte lo stesso jar, ho ottenuto questo risultato senza che un jar nella sua computazione vada a rompere i maroni alla variabile di classe dello stesso oggetto.
De facto la computazione di un jar risulta isolata dalle altre.
Forse è conseguenza dell'implementazione della macchina Java SW che è quella dell'interprete JVM.
Matrixbob
08-03-2012, 17:56
C'è modo di vedere tipo con jconsole.exe l'andazzo specifico dei 3D e della VM in generale?
netbeans e eclipse hanno dei profiler integrati, altrimenti puoi usare JVisualVM (jdk oracle). E' relativamente intuitivo, quindi non sto qui a raccontarti la storia dell'orso.
Matrixbob
09-03-2012, 09:56
netbeans e eclipse hanno dei profiler integrati, altrimenti puoi usare JVisualVM (jdk oracle). E' relativamente intuitivo, quindi non sto qui a raccontarti la storia dell'orso.
Grazie, sembra buono. Mi hanno consigliato anche:
Using JConsole to Monitor Applications
jvmstat (questo per le performance mi pare)
JVM Monitor home (applicazione esterna)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.