UseMembar determina se utilizzare o meno membar istruzioni in modo rigoroso, costringendo tutte le azioni di memoria per completare prima di continuare.
In pratica, si interrompono le ottimizzazioni di gestione della memoria ritardate del processore dall'incombenza del codice.
Questo generalmente rallenta le cose, e non è necessario sulle macchine virtuali moderne per la stragrande maggioranza del codice.
Occasionalmente ci si imbatte in problemi in cui il codice DOVREBBE essere thread-safe, ma non è perché la mancanza di istruzioni di istruzioni per l'uso. In questi casi è possibile attivare questa opzione per far funzionare tale codice senza passare alla modalità single-threading o fare confusione con l'ordinamento del codice per evitare il problema.
La JVM è generalmente in grado di rilevare codice che causerà problemi e inserirà una membrana o eseguirà un riorganizzazione del codice JIT per fornire il tempo necessario al completamento delle operazioni di memoria. Infatti, nella mia ricerca sul web sull'argomento, ho trovato solo un esempio del bug, ed è stato corretto nelle versioni recenti di entrambe le versioni Oracle e OpenJRE dell'hotspot JVM.
Come nota, per le architetture ARM questa opzione è ancora impostata su on, poiché le ottimizzazioni alternative (note come ottimizzazioni psuedo-membar) non sono state ancora applicate, e quindi è soggetta ad essere molto buggata senza le istruzioni di membar.
fonte
2015-12-26 23:47:21
BTW: Le opzioni -XX non sono ufficialmente supportate e possono essere rimosse da versioni future senza notifica. –
@Rastislav true, ma in molti casi è necessario utilizzarli ... –