We're updating the issue view to help you get more done. 

Improve default handling of JVM heap size

Description

Modify CommandBox to not set a max or min heap size if none is provided by the user.

Also allow heap size to have the k, m, or g identifier.

1 2 3 4 5 { "jvm" : { "heapSize" : "2G" } }

Default if no letter is provided will still be "m"

Original ticket


Per the thread of CFML slack referencing this article:

https://medium.com/@yortuc/jvm-memory-allocation-in-docker-container-a26bbce3a3f2

Commandbox specifies a default heapSize of 512 in /src/cfml/system/services/ServerService.cfc:127. In a Docker deployment, it appears that the best practice is not to specify a heap size at all. But it's probably not a good idea to just remove this value for everyone, so perhaps a transitional argument and environment variable that, when set, removes any default values for heapSize?

It could be simplified further, depending on how prescriptive you want to be, by directly adding the relevant JVM arguments, e.g. if

CFML_JVM_DOCKERHEAPMODE = 1

then no default heapSize, and the follow JVM args get added:

1 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1

This is the first time I've plumbed into the Commandbox source and it looks pretty straightforward, but I'm not quite comfortable enough yet to deal with optional settings that could come from either the command line or the environment (and not sure if that's Commandbox proper or just the Docker stuff).

Status

Assignee

Brad Wood

Reporter

Samuel W. Knowlton

Labels

Fix versions

Priority

Major