tags:

views:

1082

answers:

6

Is there a way to modify the jvm args from inside of the jvm? Specifically, I want to be able to change the maximum heap size of the jvm from inside of it. Is this possible?

Edit: I guess I should add the reason I wanted to do this. I have a few Java programs that are run on different machines/platforms. These programs have configurations that are sourced at runtime and are different depending on the machine/environment the program's running one. Some of these configurations can be changed at runtime and the various programs automatically update themselves as the configurations change.

I wanted heap size to be one of these configuration parameters that is sourced at runtime like the rest of the configuration. If so, then the program could startup (with some default jvm args) then adjust itself based on the retrieved config.

+3  A: 

Specifically, I want to be able to change the maximum heap size of the jvm from inside of it. Is this possible?

No.

Kevin
+5  A: 

This is a halfway-serious, completely-off-the-wall hack-thought:

...what if you spawned a new instance of java (with the new settings) from the current jvm then killed the old process from the new? I have no idea if this will help or not (or even work)...

javamonkey79
You don't need to kill the parent from the child, the parent can kill itself once the child is running.
paxdiablo
Given the requirement this is not an unreasonable solution. Basically write a bootstrap app that reads the config and launches the "real" app.
Michael Rutherfurd
@Pax: Even better, good call :)
javamonkey79
You could even use Terracotta for this. Spawn the new VM - replicate the fields using Terracotta and then kill the parent.
Fortyrunner
+3  A: 

You cant change those options simply because it compromises the security of the system.

If an admin wishes to only allow a certain program to have certain capaibilities by setting a security manager, it would be a serious problem if you could turn that off.

Anyway a program should not be changing stuff like its memory requirements at runtime - these should be known and setup by the administrator. There is no reason why your program should need to do this at runtime. If it really needs to change this perhaps the reason qustion is why doesnt the admin type dude not do it ?

mP
+2  A: 

With JRockit you can at least suggest a heap size.

JVMFactory.getJVM().getMemorySystem().suggestHeapSize(100*1000*1000);

See JMAPI for more information

Kire Haglin
According to my reading of the Javadoc, this does not allow you to make the heap size larger than the maximum heap size (-mx). Besides, it won't work for a Sun JVM.
Stephen C
A: 

As noted by others, this is generally only possible by having a bootstrap program (Java or other language) that invokes the main JVM with the right parameters.

That said, are you sure this is necessary? You mention "maximum heap size". If you are referring to the -Xmx parameter: This is just a limit the VM may never exceed. It does not mean the VM will really use that much, it will do with less if it can.

So you can always set -Xmx to the maximum the system can handle, and let the JVM decide how much it really needs. Why do you think you need to set it dynamically?

sleske
A: 

Dynamically setting -Xmx for instance would be very helpful for controlling projected system resources (primarily footprint) for long running runtimes. One of many ramifications of course is bigger/longer GC overhead.

I know several large server machines running dozens and dozens of 1G+ heap JVMs. If these runtimes could have their high water mark scaled back during low-use times then you could hard manage your system resources much better.

Xepoch