[float]
[[ls-jvm]]
=== Java (JVM) version

{ls} requires one of these versions:

* Java 8
* Java 11
* Java 15 (see <<jdk15-upgrade>> for settings info)

Use the
http://www.oracle.com/technetwork/java/javase/downloads/index.html[official
Oracle distribution] or an open-source distribution, such as
http://openjdk.java.net/[OpenJDK].
See the https://www.elastic.co/support/matrix#matrix_jvm[Elastic Support Matrix]
for the official word on supported versions across releases.

.Bundled JDK
[NOTE]
===== 
{ls} offers architecture-specific
https://staging-website.elastic.co/downloads/logstash[downloads] that include
AdoptOpenJDK 11, the latest long term support (LTS) release of JDK.

Use the JAVA_HOME environment variable if you want to use a JDK other than the
version that is bundled. 
If you have the JAVA_HOME environment variable set to use a custom JDK, Logstash
will continue to use the JDK version you have specified, even after you upgrade. 
=====

[float]
[[check-jvm]]
==== Check your Java version
Run the following command:

[source,shell]
java -version

On systems with Java installed, this command produces output similar to the following:

[source,shell]
-----
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
-----

[float]
[[java-home]]
==== `JAVA_HOME`

{ls} uses the Java version set in `JAVA_HOME`. The `JAVA_HOME` environment
variable must be set for {ls} to operate correctly. 

On some Linux systems, you may need to have the `JAVA_HOME` environment
exported before installing {ls}, particularly if you installed Java from
a tarball. 
{ls} uses Java during installation to automatically detect your environment and
install the correct startup method (SysV init scripts, Upstart, or systemd). If
{ls} is unable to find the `JAVA_HOME` environment variable during package
installation, you may get an error message, and {ls} will not start properly.

[float]
[[jdk15-upgrade]]
==== Using JDK 15

{ls} supports JDK 15, but you need to update settings in `jvm.options` and
`log4j2.properties` if: 

* you are upgrading from  {ls} 7.11.x (or earlier) to 7.12 or later, and
* you are using JDK 15 or later.

[float]
===== Updates to `jvm.options`
In the `config/jvm.options` file, replace all CMS related flags with:

[source,shell]
-----
## GC configuration
8-13:-XX:+UseConcMarkSweepGC
8-13:-XX:CMSInitiatingOccupancyFraction=75
8-13:-XX:+UseCMSInitiatingOccupancyOnly
-----

For more information about how to use `jvm.options`, please refer to <<jvm-settings>>.

[float]
===== Updates to `log4j2.properties`
In the `config/log4j2.properties`:

* Replace properties that start with `appender.rolling.avoid_pipelined_filter.*` with: 
+
[source,shell]
-----
appender.rolling.avoid_pipelined_filter.type = PipelineRoutingFilter
-----

* Replace properties that start with `appender.json_rolling.avoid_pipelined_filter.*` with:
[source,shell]
+
-----
appender.json_rolling.avoid_pipelined_filter.type = PipelineRoutingFilter
-----

* Replace properties that start with `appender.routing.*` with:
[source,shell]
+
-----
appender.routing.type = PipelineRouting
appender.routing.name = pipeline_routing_appender
appender.routing.pipeline.type = RollingFile
appender.routing.pipeline.name = appender-${ctx:pipeline.id}
appender.routing.pipeline.fileName = ${sys:ls.logs}/pipeline_${ctx:pipeline.id}.log
appender.routing.pipeline.filePattern = ${sys:ls.logs}/pipeline_${ctx:pipeline.id}.%i.log.gz
appender.routing.pipeline.layout.type = PatternLayout
appender.routing.pipeline.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %m%n
appender.routing.pipeline.policy.type = SizeBasedTriggeringPolicy
appender.routing.pipeline.policy.size = 100MB
appender.routing.pipeline.strategy.type = DefaultRolloverStrategy
appender.routing.pipeline.strategy.max = 30
-----
