# Java Options Framework
The Java Options Framework contributes arbitrary Java options to the application at runtime.
| Detection Criterion |
java_opts set in the config/java_opts.yml file or the JAVA_OPTS environment variable set |
| Tags |
java-opts |
Tags are printed to standard output by the buildpack detect script
## Configuration
For general information on configuring the buildpack, including how to specify configuration values through environment variables, refer to [Configuration and Extension][].
The framework can be configured by creating or modifying the [`config/java_opts.yml`][] file in the buildpack fork.
| Name | Description
| ---- | -----------
| `from_environment` | Whether to append the value of the `JAVA_OPTS` environment variable to the collection of Java options
| `java_opts` | The Java options to use when running the application. All values are used without modification when invoking the JVM. The options are specified as a single YAML scalar in plain style or enclosed in single or double quotes.
Any `JAVA_OPTS` from either the config file or environment variables will be specified in the start command after any Java Opts added by other frameworks.
## Escaping strings
Java options will have special characters escaped when used in the shell command that starts the Java application but the `$` and `\` characters will not be escaped. This is to allow Java options to include environment variables when the application starts.
```bash
cf set-env my-application JAVA_OPTS '-Dexample.port=$PORT'
```
If an escaped `$` or `\` character is needed in the Java options they will have to be escaped manually. For example, to obtain this output in the start command.
```bash
-Dexample.other=something.\$dollar.\\slash
```
From the command line use;
```bash
cf set-env my-application JAVA_OPTS '-Dexample.other=something.\\\\\$dollar.\\\\\\\slash'
```
From the [`config/java_opts.yml`][] file use;
```yaml
from_environment: true
java_opts: '-Dexample.other=something.\\$dollar.\\\\slash'
```
Finally, from the applications manifest use;
```yaml
env:
JAVA_OPTS: '-Dexample.other=something.\\\\\$dollar.\\\\\\\slash'
```
## Examples
### Configuration File Example
```yaml
# config/java_opts.yml
---
from_environment: false
java_opts: -Xloggc:$PWD/beacon_gc.log -verbose:gc
```
### Environment Variable Override Examples
To override the configuration via the `JBP_CONFIG_JAVA_OPTS` environment variable, use YAML flow style (inline YAML) with curly braces:
**Example 1: Using an array of options (recommended)**
```bash
cf set-env my-application JBP_CONFIG_JAVA_OPTS '{ java_opts: ["-Xms256m", "-Xmx1024m", "-XX:+UseG1GC"] }'
```
Or in the application manifest:
```yaml
env:
JBP_CONFIG_JAVA_OPTS: '{ java_opts: ["-Xms256m", "-Xmx1024m", "-XX:+UseG1GC"] }'
```
**Example 2: Disabling from_environment**
```bash
cf set-env my-application JBP_CONFIG_JAVA_OPTS '{ from_environment: false, java_opts: ["-Xmx512m"] }'
```
**Example 3: Multiple JVM options**
```yaml
env:
JBP_CONFIG_JAVA_OPTS: '{ from_environment: false, java_opts: ["-Xmx512M", "-Xms256M", "-Xss1M", "-XX:MetaspaceSize=157286K", "-XX:MaxMetaspaceSize=314572K"] }'
```
**Note**: For backward compatibility, a space-separated string is also supported:
```yaml
env:
JBP_CONFIG_JAVA_OPTS: '{ java_opts: "-Xmx512M -Xms256M" }'
```
However, using an array format is recommended for clarity and to avoid parsing ambiguities.
## Allowed Memory Settings
| Argument| Description
| ------- | -----------
| `-Xms` | Minimum or initial size of heap.
| `-Xss` | Size of each thread's stack. **This could effect the total heap size. [JRE Memory]**
| `-XX:MaxMetaspaceSize` | The maximum size Metaspace can grow to. **This could effect the total heap size. [JRE Memory]**
| `-XX:MaxPermSize` | The maximum size Permgen can grow to. Only applies to Java 7. **This could effect the total heap size. [JRE Memory]**
| `-Xmn ` | Maximum size of young generation, known as the eden region.
| `-XX:+UseGCOverheadLimit` | Use a policy that limits the proportion of the VM's time that is spent in GC before an `java.lang.OutOfMemoryError` error is thrown.
| `-XX:+UseLargePages` | Use large page memory. For details, see [Java Support for Large Memory Pages].
| `-XX:-HeapDumpOnOutOfMemoryError` | Dump heap to file when `java.lang.OutOfMemoryError` is thrown.
| `-XX:HeapDumpPath=` | Path to directory or filename for heap dump.
| `-XX:LargePageSizeInBytes=` | Sets the large page size used for the Java heap.
| `-XX:MaxDirectMemorySize=` | Upper limit on the maximum amount of allocatable direct buffer memory. **This could effect the total heap size. [JRE Memory]**
| `-XX:MaxHeapFreeRatio=` | Maximum percentage of heap free after GC to avoid shrinking.
| `-XX:MaxNewSize=` | Maximum size of new generation. Since `1.4`, `MaxNewSize` is computed as a function of `NewRatio`.
| `-XX:MinHeapFreeRatio=` | Minimum percentage of heap free after GC to avoid expansion.
| `-XX:NewRatio=` | Ratio of old/new generation sizes. 2 is equal to approximately 66%.
| `-XX:NewSize=` | Default size of new generation.
| `-XX:OnError=";"` | Run user-defined commands on fatal error.
| `-XX:ReservedCodeCacheSize=` | _Java 8 Only_ Maximum code cache size. Also know as `-Xmaxjitcodesize`. **This could effect the total heap size. [JRE Memory]**
| `-XX:SurvivorRatio=` | Ratio of eden/survivor space. Solaris only.
| `-XX:TargetSurvivorRatio=` | Desired ratio of survivor space used after scavenge.
[`config/java_opts.yml`]: ../config/java_opts.yml
[Configuration and Extension]: ../README.md#configuration-and-extension
[Java Support for Large Memory Pages]: http://www.oracle.com/technetwork/java/javase/tech/largememory-jsp-137182.html
[JRE Memory]: jre-open_jdk_jre.md#memory