2014-09-18 11 views
12

Questa è solo una semplice domanda teorica per curiosità. Sono sempre stato un fan dei java fan. Ma una cosa mi fa chiedere perché java non fornisce un meccanismo per creare oggetti nello stack? Non sarebbe più efficiente se potessi creare un piccolo oggetto Point (int x, int y) sullo stack invece che sull'heap come creare una struttura su C#. C'è qualche motivo di sicurezza speciale dietro questa restrizione in java? :)Creazione di oggetti nella memoria dello stack in java?

+1

Cosa succede quando lo metti in un contenitore che non è in pila? Quando ritorni, il contenitore ora ha un riferimento alla memoria deallocato. – Max

+1

@Max: presumibilmente, il linguaggio dovrebbe anche includere costrutti che consentono al compilatore di controllare questo. – Thilo

+0

@Max: il contenitore non ha un riferimento all'originale, ne ha una copia o una copia in scatola. .NET/C# ha avuto questo negli ultimi 15 anni. https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx – csauve

risposta

15

La strategia qui è che invece di lasciare questa decisione nel linguaggio, Java consente a JVM/Hotspot/JIT/runtime di decidere dove e come desidera allocare memoria.

È in corso la ricerca dell'uso di "analisi di escape" per capire quali oggetti non sono effettivamente necessari per passare all'heap e allocarli allo stack. Non sono sicuro che questo sia già diventato una JVM mainstrem. Ma se lo fa, sarà controllato dal runtime (cosa -XX: qualcosa), non dallo sviluppatore.

Il lato positivo di questo è che anche il vecchio codice può beneficiare di questi miglioramenti futuri senza essere aggiornato.

Se ti piace gestirlo manualmente (ma controlla che il compilatore rimanga "sicuro"), dai un'occhiata a Rust.

+4

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html abilitato in 6u23 e successive – jtahlborn

+1

@jtahlborn: +1. Penso che l'attuale serie di ottimizzazioni non si spinga fino all'allocazione degli oggetti nello stack. Dalle note di rilascio, sembra eliminare i blocchi e le copie ridondanti di oggetti esistenti. – Thilo

+0

+1 dal collegamento jtahlborn pubblicato: "Non sostituisce un'allocazione dell'heap con un'allocazione dello stack per gli oggetti di escape non globali." il che implica che * ArgEscape * e * NoEscape * saranno allocati nello stack. Ma di nuovo, non viene menzionato esplicitamente ... – alfasin

2

Un problema comune sarebbe quello di inizializzare alcuni riferimenti globali con un oggetto creato nello stack. Quando il metodo che ha creato l'oggetto è uscito a cosa hai puntato?

Detto questo oggetto viene creato nello stack in Java, è appena stato fatto dietro la schiena con il escape analysis che si assicura che lo scenario precedente non si verifichi.

4

questo sarà provvisoriamente venire a Java, non esiste una vera ETA impostata per questo modo si poteva solo sperare che verrà da Java 10.

La proposta si chiama Tipi di valore ed è possibile seguirla in the mailing list of Project Valhalla.

Non so se ci fossero dei motivi preliminari sul perché non fosse nella lingua in primo luogo, forse originariamente era considerato non necessario o semplicemente non c'era tempo per implementarlo.

+0

OK! Java "tentativamente" raggiungerà C#? "Sometime" (tm) – csauve

+0

@skiwi Puoi spiegare brevemente cosa sono i Value Type? –

Problemi correlati