2009-12-09 9 views
19

Ho notato recentemente che ci sono alcune librerie java (JDK, joda time, iText) che compilano senza alcune/tutte le informazioni di debug. Mancano le informazioni sulle variabili locali oppure mancano sia le informazioni sulle variabili locali che i numeri di riga.Perché alcune librerie java sono compilate senza eseguire il debug delle informazioni

C'è qualche motivo per questo? Mi rendo conto che rende il codice compilato più grande, ma non credo che sia una considerazione particolare. O si sta semplicemente costruendo con le opzioni di compilazione predefinite?

Grazie.

+0

Molto spesso, si dovrebbe essere in grado di scaricare una versione non ottimizzata/"debuggable" della lib, o si può semplicemente mordere il proiettile e tirare giù lo src da soli – Ian

risposta

34

Le opzioni di compilazione predefinite non includono le informazioni di debug, è necessario specificare specificamente al compilatore di includerlo. Ci sono diversi motivi per cui la maggior parte della gente lo omette:

  • Alcune librerie sono utilizzate in sistemi embedded (come i telefoni cellulari). Fino a poco tempo fa, ogni piccolo conto. Oggi la maggior parte dei cellulari ha più memoria di tutti i computer nel 1985 insieme;)
  • Quando compilato con il debug attivo, il codice viene eseguito più lentamente del 5%. Non molto ma ancora, in alcuni casi ogni ciclo conta.
  • I Senior Developer di oggi sono nati in un'epoca in cui 64 KB di RAM erano enormi. Ieri ho aggiunto un'altra unità da 2 TB al mio server in cantina. Sono 7 ordini di grandezza in 25 anni. Gli umani hanno bisogno di più tempo per adattarsi.

[EDIT] Come sottolineato da John, il bytecode Java non è più ottimizzato (molto) oggi. Quindi l'output dei file di classe sarà lo stesso per entrambi i casi (solo il file di classe con le informazioni di debug sarà più grande). Il codice è ottimizzato in JIT in runtime che consente al runtime di ottimizzare il codice per CPU, memoria (quantità e layout), ecc.

La penalità del 5% menzionata è quando si esegue il codice e si aggiunge la riga di comando opzioni per consentire a un debugger remoto di collegarsi al processo. Se non abiliti il ​​debug remoto, non c'è penalità (tranne che per il caricamento di classe, ma ciò accade solo una volta).

+0

Inoltre, quando si compila con il debug abilitato, puoi anche compilare senza ottimizzare il codice (altrimenti i numeri di riga non avrebbero senso), quindi perdi i vantaggi prestazionali dei metodi/proprietà (statici/finali/privati) – Ian

+2

@iAn: in Java, la compilazione con ottimizzazioni è in genere, comunque, inutile - IIRC hanno rimosso l'opzione o reso un no-op. Non perdi prestazioni, perché le ottimizzazioni vengono invece eseguite dalla JIT. –

+7

Sì, oggi il codice Java è ottimizzato in fase di esecuzione. La penalità di velocità del 5% è in realtà quando * esegue * il codice con le opzioni per collegare un debugger remoto. –

0

Probabilmente dimensioni dell'installazione. Le informazioni di debug aggiungono un sovraccarico ai file jar che a Sun probabilmente non piaceva.

Ho dovuto esaminare un problema di Java Web Start di recente - nessuna informazione di debug disponibile - quindi aggiungere la traccia completa alla console java e scaricare il codice sorgente ne ha aiutato alcuni, ma il codice è piuttosto aggrovigliato quindi mi piacerebbe un debug costruire.

JDK deve essere compilato con informazioni di debug complete ovunque!

+0

FYI c'è un jar DEBUG di JDK6u18 che contiene le informazioni di debug. È circa 20mb più grande dell'alternativa. Vedi qui: http://download.java.net/jdk6/ –

Problemi correlati