Setting JVM memory limits

Java has an option, -XX:MaxRAMFraction=XXX, that lets developers specify the maximum amount of available RAM a Java application should occupy. This sounds like a great idea, until you realize how it’s implemented. The number that you specify for “XXX” is an integer that represents the fraction of total RAM that should be used. The intrepretation is 1/XXX. So -XX:MaxRamFraction=1 tells the application to use as much RAM as it wants. XX:MaxRAMFraction=2 tells it to use half of the memory. What if you want to use 75% of the memory? Or, perhaps 2/3 the memory? Tough luck. You get all, one-half, one-third, one-fourth, one-fifth, etc. You want to use 40%? Sorry, buddy. You can get 50% or 33%. Take your pick.

When I first heard this, I thought the guy who was explaining it was misinformed or pulling my leg.

I’d sure like to understand the thinking that went into this design decision, because from where I’m standing it looks like lunacy. I can’t imagine how such an idiotic design could make it through review and implementation without somebody with a modicum of intelligence and authority raising a stink. You mean nobody realized how stupid this is?

Java 10 introduced the -XX:MaxRAMPercentage and associated flags. See for more information.

Sanity prevails, but I still want to understand how the original design got approved. That something so obviously wrong managed to make it through the approval process and was released on an unsuspecting world doesn’t give me much confidence in the competence of Java platform developers.

2 comments to Setting JVM memory limits

  • Phil Wheat

    My bet?

    “We’re killing the box, we need to be able to throttle the RAM.”

    “How much?”

    “Just cut limit it to 50% of total ram”

    “Hey, if I do it as a fraction, we can do even better if we need to”

    “It’s killing production right now, so fine – do it however you want, just get the servers back up NOW!”

    Remember, these were the DotCom days.

    I hope it was more involved than that. I’m not sure which would be worse, finding out it was or finding out it wasn’t.

  • Say that loud Jim. Otherwise, the insane parts like this will never be addressed fairly. JVM has a lot of knobs that people want to keep turning and turning. For most part (like 95%), no such knob turning is required for .NET, which is nice. There are knobs in .NET/CLR that you turn when you know what are doing.



A sample text widget

Etiam pulvinar consectetur dolor sed malesuada. Ut convallis euismod dolor nec pretium. Nunc ut tristique massa.

Nam sodales mi vitae dolor ullamcorper et vulputate enim accumsan. Morbi orci magna, tincidunt vitae molestie nec, molestie at mi. Nulla nulla lorem, suscipit in posuere in, interdum non magna.