Skip to content

Instantly share code, notes, and snippets.

@fforbeck
Forked from kevin-lee/JProfiler-with-Docker.md
Created August 14, 2020 16:08
Show Gist options
  • Save fforbeck/9a249b5870c631206ad1bf31432ffac7 to your computer and use it in GitHub Desktop.
Save fforbeck/9a249b5870c631206ad1bf31432ffac7 to your computer and use it in GitHub Desktop.
JVM Profiler with Docker

JProfiler with Docker

Docker

DockerFile

DockerFile should have JProfiler installation.

RUN wget <JProfiler file location> -P /tmp/ && \
  tar -xzf /tmp/<JProfiler file> -C /usr/local && \
  rm /tmp/<JProfiler file>

EXPOSE <port>

e.g.)

RUN wget http://download-aws.ej-technologies.com/jprofiler/jprofiler_linux_9_2.tar.gz -P /tmp/ && \
  tar -xzf /tmp/jprofiler_linux_9_2.tar.gz -C /usr/local &&\
  rm /tmp/jprofiler_linux_9_2.tar.gz

EXPOSE 8849

Run

docker run -p <port>:<port> your-docker 

e.g.)

docker run -p 8849:8849 your-docker 

JProfiler

Run Application with JProfiler Agent

java -jar my-app.jar -agentpath:/usr/local/jprofiler9/bin/linux-x64/libjprofilerti.so=port=<port>

e.g.)

java -jar my-app.jar -agentpath:/usr/local/jprofiler9/bin/linux-x64/libjprofilerti.so=port=8849

So in the DockerFile, it looks like

ENTRYPOINT ["java -jar","my-app.jar", 
  "-agentpath:/usr/local/jprofiler9/bin/linux-x64/libjprofilerti.so=port=8849"]
  1. Select 'Profile an application server, locally or remotely'.
  2. If the target application is running on any specific server listed, select it. Otherwise, choose Generic application.
  3. Select Linux X86/AMD64 for Platform of the remote computer on a remote computer.
  4. Select the JVM used in the Docker instance.
  5. To make JProfiler to wait for the application to start and send data, select Wait for a connection from the JProfiler GUI.
  6. Enter the remote address to the Remote address. If it's Docker for Mac, it is localhost. If Docker Machine is used, use the IP of the Docker Machine.
  7. Add the path to the JProfiler on the Docker where the jar file metioned above is using to the Remote installation directory. It looks like /usr/local/jprofiler<version>. e.g.) /usr/local/jprofiler9
  8. Set the port number or use the default (i.e. 8849).

VisualVM with Docker

Installation

VisualVM comes with the JDK so it doesn't require any extra installation or payment if JDK is already installed.

DockerFile

The following options should be added to java executable command.

-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=<port>
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=<port>
-Djava.rmi.server.hostname=<docker ip>

So it should be like

ENTRYPOINT ["java -jar", "app.jar",
  "-Dcom.sun.management.jmxremote=true",
  "-Dcom.sun.management.jmxremote.port=<port>",
  "-Dcom.sun.management.jmxremote.authenticate=false",
  "-Dcom.sun.management.jmxremote.ssl=false",
  "-Dcom.sun.management.jmxremote.local.only=false",
  "-Dcom.sun.management.jmxremote.rmi.port=<port>",
  "-Djava.rmi.server.hostname=<docker ip>"]

e.g.)

ENTRYPOINT ["java -jar", "my-app.jar",
  "-Dcom.sun.management.jmxremote=true",
  "-Dcom.sun.management.jmxremote.port=8849",
  "-Dcom.sun.management.jmxremote.authenticate=false",
  "-Dcom.sun.management.jmxremote.ssl=false",
  "-Dcom.sun.management.jmxremote.local.only=false",
  "-Dcom.sun.management.jmxremote.rmi.port=8849",
  "-Djava.rmi.server.hostname=localhost"]
  • Docker for Mac uses Hyperkit instead of Docker Machine through VirtualBox so the host location can be just localhost rather than the IP of the Docker Machine. If you're using Docker Machine, use the IP of the machine.

VisualVM

Run jvisualvm which is located at $JAVA_HOME/bin.

  1. File -> Add JMX Connection...
  2. Enter the host and port (e.g. localhost:8849).
@fforbeck
Copy link
Author

kubectl port-forward lib-deployment-77b775876d-zhktd 8849:8849

@fforbeck
Copy link
Author

ENV JPROFILER_VERSION "jprofiler_linux_9_2_1"
RUN wget https://download-gcdn.ej-technologies.com/jprofiler/$JPROFILER_VERSION.tar.gz -P / && \
tar -xzf /$JPROFILER_VERSION.tar.gz -C / && \
rm /$JPROFILER_VERSION.tar.gz

FROM adoptopenjdk/openjdk8:alpine-jre as production
RUN apk add --no-cache bash
COPY --from=packager /server /server
COPY --from=packager /jprofiler* /server/profiler
ENV JAVA_OPTS="${JAVA_OPTS} -agentpath:/server/profiler/bin/linux-x64/libjprofilerti.so=port=8849,nowait"
ENTRYPOINT ["/server/bin/server", "-Dconfig.resource=prod.conf", "-J-server"]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment