Environment variables truth source of the JVM (and how to mutate it)
forax at univ-mlv.fr
Wed May 10 13:32:09 UTC 2017
it's more a question for the core-dev mailing list.
The trick shown by Heinz does not work anymore with jdk 9.
You can not mutate the environment variables of jdk,
i repeat YOU CAN NOT MUTATE THE ENVIRONMENT VARIABLES OF THE JDK :)
But you can send a new environment each time you create a new process,
----- Mail original -----
> De: pierre at 2bst.fr
> À: discuss at openjdk.java.net
> Envoyé: Mercredi 10 Mai 2017 13:55:23
> Objet: Environment variables truth source of the JVM (and how to mutate it)
> Hi, I've been trying to understand how the JVM accesses environment
> variables and how they can be mutated.
> I sent an email on this list few minutes ago but it appears to be
> ill-formatted and hardly legible. Sorry for double post: I resend it
> with better formatting hopefully.
> For this I've made some assumptions and I would like to know if they're
> correct, could you help me on this?
> 1) It appears that the JVM gets a copy of its process environment
> variables and store them in static final fields
> theUnmodifiableEnvironment and theEnvironment of class
> - My assumption is: these fields are the "truth source" about
> environment variables inside the JVM and any attempt to access some of
> them will end up in a lookup of this fields.
> - I have a question about this: why two final fields instead of only
> one? Perhaps theUnmodifiableEnvironment stands for base JVM env whilst
> theEnvironment is for env of current process (which could be changed
> with Process.exec(String cmdarray, String envp, File dir))?
> 2) There is a subtle way to mutate them in Sun JDK (see
> - My assumption is: These fields are passed to all new JVM threads, so
> mutating them (as ugly as it can sound) will be JVM-wide and will
> result in all thread getting mutated env as their environment
> - Sensitive question: is this enforced? System.getenv() appears to
> correctly returns mutated env, can I deduce all new threads in the JVM
> will get mutated values?
> - Another sensitive question: as these fields are static final, can I
> deduce all threads in the JVM will get mutated values, not only new
> It would be my pleasure to provide further details ifneedsbe. Just let
> me know if some of the above assumptions are incorrect! Again, please
> forgive that double post.
> Yours faithfully,
More information about the discuss