2015-12-26 16 views
19

Ho attraversato hot deployment tutorial e funziona. Ma ho delle domande sui limiti (punto 3) i.ePerché il debug di Hot Swap di Java è limitato alle modifiche intra-metodo?

La distribuzione rapida ha supportato le modifiche al codice solo nell'implementazione del metodo. Se aggiungi una nuova classe o un nuovo metodo, è ancora necessario riavviare.

Fondamentalmente perché non è necessario il riavvio del server se apporto modifiche nel metodo esistente ma richiesto in caso di aggiunta di metodo o classe.

mia comprensione come funziona: - quando faccio i cambiamenti nel metodo esistente o introdotto un nuovo metodo, Eclipse inserire il file nella posizione della destra sotto webserver. Se la classe è già stata caricata dal classloader nello spazio perm gen, lo scaricherà dallo spazio permgen e caricherà il nuovo internamente senza il riavvio del server in modo che le nuove modifiche (codice byte) si riflettano. È corretto ?

Se sì, perché la distribuzione a caldo non funziona con nuovi metodi e nuovi file di classe?

+0

Non è un'eccessiva distribuzione di eclissi; è [JPDA] (http://www.oracle.com/technetwork/java/javase/tech/jpda-141715.html). –

+0

ok. Ma la domanda è sempre la stessa, cioè come funziona internamente sia che si tratti dell'eclissi o di qualche altro strumento. Ho appena citato eclipse mentre lo sto usando – emilly

+0

Ecco perché ti ho dato il link a JPDA. –

risposta

18

Il ragionamento è piuttosto complicato e in realtà è noto solo a persone con conoscenza approfondita della JVM e come gestisce la memoria. C'è una spiegazione decente at this page (sebbene sia davvero una pubblicità per il prodotto JRebel) - scorri fino alla sezione intitolata Perché HotSwap è limitato ai corpi dei metodi?.

L'essenza: ci sono due fattori principali che impediscono a HotSwap di gestire le modifiche strutturali alle classi: JIT e allocazione di memoria.

Il compilatore JIT (Just In Time) nella JVM ottimizza il bytecode dopo che le classi sono state caricate ed eseguite alcune volte, in pratica inserendo molte chiamate per migliorare le prestazioni. Implementare tale funzionalità in modo sicuro ed efficace in un ambiente in cui la firma e la struttura della classe possono cambiare sarebbe una sfida significativa.

Altri problemi circondano ciò che accadrebbe riguardo alla gestione della memoria se le strutture di classe fossero autorizzate a cambiare. La JVM dovrebbe modificare istanze di classi esistenti, il che significherebbe trasferirle ad altre parti dell'heap storage. Per non parlare del dover spostare gli oggetti di classe stessi. La gestione della memoria della JVM è già incredibilmente complessa e altamente ottimizzata; tali cambiamenti non farebbero che aumentare la complessità e potenzialmente ridurre le prestazioni del compilatore JIT (e probabilmente porteranno a ulteriori bug).

Penso che sia lecito ritenere che gli ingegneri della JVM non siano stati disposti a prendere le prestazioni e gli svantaggi dell'impronta di bug che sarebbero necessari per supportare questa funzione. Ecco perché prodotti come JRebel e altri sono venuti per esistere.

+0

Per capirlo, ti preghiamo di fornirti dei pensieri su http://stackoverflow.com/domande/35249234/come-hot-deployment-works-internamente. Grazie in anticipo – emilly

+0

per quanto riguarda la tua affermazione 'La JVM dovrebbe modificare le istanze esistenti delle classi, il che significherebbe trasferirle ad altre parti dell'heap storage. Questo è vero quando anche lo sviluppatore sta cambiando all'interno del metodo. In questo caso è necessario prendere in considerazione la vecchia definizione di classe e una nuova deve essere caricata nello spazio permgen, non è vero? – emilly

+0

@emilly, non penso che le implementazioni del metodo compilato siano memorizzate con ogni istanza, ma i dati lo sono sicuramente. –

2

Come nota a margine, la specifica stessa è not limited.

Succede solo che alcune delle implementazioni disponibili, incluso l'onnipresente Reference Implementation, sono limitate.

Dopo essersi connessi a una macchina virtuale remota, è possibile verificare se consente di add methods o redefine classes.

+0

Buono a sapersi, però, purtroppo, non è pratico se non è possibile utilizzare una JVM che supporti tali funzioni avanzate. Penso che sia nuovo in Java 8, a proposito. –

2

È possibile se si esegue il java su un vm smalltalk. Smalltalk lo ha fatto praticamente per sempre, ed è uno dei motivi per cui Smalltalker tende a fare lo sviluppo del debugger come forma superiore di sviluppo guidato dai test. Smalltalk vms esegue la pulizia necessaria delle strutture dei dati di memoria.In Eliot Miranda's Spur (per Squeak, Pharo e Cuis) e Gemstone che è fatto pigramente, ma altrimenti potrebbe essere necessario attendere che tutti gli oggetti vengano migrati. L'implementazione di riferimento java vm probabilmente ha più ottimizzazioni rispetto a qualsiasi smalltalk vm che potresti eseguire java su a.t.m.

0

La risposta fornita da E-Riz ha già una buona spiegazione dei motivi per cui la tecnologia Java HotSwap standard supporta solo le modifiche ai metodi esistenti e non l'aggiunta di nuove classi o metodi alle classi.

Tuttavia, come è stato descritto in un relativo SO discussion, il livello di hot swap ottenuto dipende dalla catena di strumenti utilizzata. Quindi, se si finisce per aggiungere il plug-in JRebel, si potranno eseguire hot swap anche quando sono stati aggiunti nuovi metodi e classi.

Esiste un altro progetto: Hot Swap Agent: si tratta in genere di un agente java che può essere utilizzato per eseguire il contenitore Java ed è possibile attivarlo utilizzando un paio di parametri della riga di comando (come indicato nello quickstart).