jvm调优以及docker容器的远程jms监控

本文介绍了如何利用JVM自带的工具进行调优,包括jvm插件的使用、守护线程的概念,以及如何在Docker容器中进行JMS监控。同时,通过jps、jinfo、jstat、jstack、jmap和jhat等命令行工具,展示了JVM监控和调优的过程,并提供了实践操作步骤。

摘要:jdk自带原生可视化查看线程、堆、cpu执行、方法执行的工具jvisualvm.exe,如果想要查看老年代, 新生代、年轻代相关的运行状况可以安装插件Visual GC(VisualVM是Sun的一个OpenJDK项目,其目的在于为Java应用创建一个整套的问题解决工具。它集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况,可以用它来查看和浏览Heap Dump、Thread Dump、内存对象实例情况、GC执行情况、CPU消耗以及类的装载情况。 Java开发人员可以使用 VisualVM创建必要信息的日志,系统管理人员)

 

jvm插件使用

插件安装:https://visualvm.github.io/archive/uc/8u40/updates.html 到此页面下载VisualGC插件

安装成功之后如下图所示

守护线程

Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程。当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有如果没有了被守护这,也就没有继续运行程序的必要了。如果有非守护线程仍然存活,VM就不会退出。

守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。用户可以用Thread的setDaemon(true)方法设置当前线程为守护线程。

虽然守护线程可能非常有用,但必须小心确保其他所有非守护线程消亡时,不会由于它的终止而产生任何危害。因为你不可能知道在所有的用户线程退出运行前,守护线程是否已经完成了预期的服务任务。一旦所有的用户线程退出了,虚拟机也就退出运行了。 因此,不要在守护线程中执行业务逻辑操作(比如对数据的读写等)。、

另外有几点需要注意:

1、setDaemon(true)必须在调用线程的start()方法之前设置,否则会抛出IllegalThreadStateException异常。

2、在守护线程中产生的新线程也是守护线程。 
3、 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。
 

public static void main(String[] args) throws InterruptedException {
        Thread d = new Thread(new Daemon());
        d.setDaemon(true);//必须在启动线程前调用
        d.start();
        System.out.println("d.isDaemon() = " + d.isDaemon() + ".");
        TimeUnit.SECONDS.sleep(1);
    }

docker容器jms监控

dockerFile增加jmx remote和端口开放的配置

FROM java:8
VOLUME /tmp
ADD student.jar app.jar
RUN bash -c 'touch /app.jar'




ENV CATALINA_OPTS="-Dcom.sun.management.jmxremote.rmi.port=5555 \
                    -Dcom.sun.management.jmxremote=true \
                    -Dcom.sun.management.jmxremote.port=5555  \
                    -Dcom.sun.management.jmxremote.ssl=false \
                    -Dcom.sun.management.jmxremote.authenticate=false \
                    -Dcom.sun.management.jmxremote.local.only=false \
                    -Djava.rmi.server.hostname=192.168.1.11"
EXPOSE 7850
EXPOSE 5555
ENTRYPOINT java ${CATALINA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar

docker-compose 进行端口5555的映射

由于服务器上有域名配置,所以需要如下操作

    接着修改:  vi     /etc/hosts

    添加这句后面添加 你的主机名

    127.0.0.1               localhost.localdomain localhost 你的主机名

然后通过jvisualVM工具查看,基本信息都可以看,但是会发现visual GC显示“不受此jvm支持”,原因是jstad没有启动起来,启动起来之后的端口是1099

./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.1.11 -p 1099 -J-Djava.rmi.server.logCalls=true</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alexander137

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值