views:

2022

answers:

3

I have a java app that uses about 15G on a machine with 16G. I don't know if I should set the max heap size.

If I set will the jvm eat all the ram up to the limit and then start garbage collecting and stop everything while it churns through 15G or heap objects?

If I don't will the jvm hurt performance by not using all of the available ram on the machine.

My specific vm is: Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_03-b05, mixed mode).

Thanks

+1  A: 

If you don't set a max heap size (with -Xmx), isn't the default maximum only 64MB?

So won't your application fail with OutOfMemoryErrors if you don't set it? I'm confused on this question. How can your application run without this switch?

matt b
I have been running with -Xmx 15G and it runs fine. I was just wondering if there is a performance hit by telling the jvm it has 15G to play with. Will it happily fill the 15G and then take forever curning through it. Also I'm not sure how much mem the app uses because its growing to 15G when I have -Xmx 15G.
Martin Redmond
Are you sure that you actually need a heap size of 15GB then, and that it isn't just a crazy runaway memory leak?
matt b
Thanks for responding. It not really a memory issue I'm thinking about, its a performance issue. I'm not getting OutOfMemoryError's. I'm trying to figure out if I should leave it to the jvm to find the best memory strategy or should I help it out a little.
Martin Redmond
+4  A: 

-Xmx 15G will set the maximum heap size to 15 gig. Java will only allocate what it needs as it runs. If you don't set it, it will only use the default. (64MB I think...)

-Xms 15G sets the minimum heap to 15 gig. This forces java to allocate 15 gig of heap space before it starts executing, weather it needs it or not.

Usually you can set them both to appropriate values depending on how you're tuning the JVM.

Cogsy
I have found that even if you set the minimum it often won't use that memory right always and will perform minor GCs before hitting the minimum.
Peter Lawrey
@Peter The Java process will allocate it, but the JVM might not actually use it. I don't know about the heuristics of the GC, but it's free to run whenever there are objects to collect. Consider when Xms == Xmx, I'd expect the heap usage would never quite meet Xms. Xms is how much Java 'mallocs' from the OS, nothing to do with how the application running in the JVM uses the heap.
Cogsy
+4  A: 

In Java 6, the default maximum heap size is determined by the amount of system memory present.

According to the Garbage Collector Ergonomics page, the maximum heap size is:

Smaller of 1/4th of the physical memory or 1GB. Before J2SE 5.0, the default maximum heap size was 64MB.

By using the -Xmx switch can be used to change the maximum heap size. See the java - the Java application launcher documentation for usage details.

coobird