Per accelerare i tempi di avvio della JVM, gli sviluppatori Sun hanno deciso che è consigliabile precompilare le classi di runtime standard per una piattaforma durante l'installazione della JVM. Queste classi precompilate possono essere trovate per es. a:Accelerare l'avvio dell'applicazione aggiungendo classi di applicazioni alle classi.jsa
$ JAVA_HOME \ jre \ bin \ client \ classes.jsa
La mia azienda attualmente si sviluppa un'applicazione autonoma Java che porta il proprio JRE, quindi sarebbe una scelta fantastica per accelerare la nostra applicazione ora di inizio aggiungendo anche le nostre classi di applicazione a questo file jsa.
Non credo che il file JSA sia stato creato per magia, quindi: come viene creato? E come posso ingannare la JVM incorporando le mie classi?
EDIT: ho già trovato il seguente:
Il classes.jsa viene creato dal comando
java -Xshare:dump
L'elenco delle classi a recepire, nella discarica può essere trovato in $JAVA_HOME/jre/lib/classlist
.
Sono persino riuscito ad aggiungere le mie classi qui (e ad aggiungerle nel file rt.jar per trovarle) e a generare il mio checksum sotto il file classlist.
Il problema finale è: solo le classi nei pacchetti java, com.sun e org.w3c sembrano essere riconosciute, se lascio le stesse classi nei loro pacchetti originali, non verranno caricate. Ho cercato l'intero sorgente OpenJDK per il puntatore su questo, ma sembra che abbia qualcosa a che fare con i domini di protezione. Se qualcuno è interessato abbastanza a questo argomento e abbastanza informato, per favore aggiungi alcune indicazioni per me per investigaete ulteriormente.
Puoi condividere come ha ricalcolato il checksum? – coppit
Ho trovato la mia risposta in una diapositiva per Java incorporato: c'è un'utilità chiamata AddJsum nell'albero dei sorgenti openjdk. http://www.oracle.com/technetwork/jp/ondemand/java/20110519-java-a-1-greg-400531-ja.pdf – coppit
Grazie, potrei provarlo quando avrò il tempo. – Daniel