使用Visual VM 查看linux中tomcat运行时JVM内存

前言:在生产环境中经常发生服务器内存溢出,假死或者线程死锁等异常,导致服务不可用。我们经常使用的解决方法是通过分析错误日记,然后去寻找代码到底哪里出现了问题,这样的方式也许会奏效,但是排查起来耗费时间比较多,或者说本身代码本身就没有错,而是访问量大时候消耗内存太多,垃圾对象没有及时回收等等其他情况导致的,这样排查异常起来异常困难,那么有没有一些可视化的工具,帮助我们可以详细地查看当前应用服务的内存情况,从而为我们在解决异常、优化代码、优化服务等方面提供一些建议呢?幸好,jdk为我们免费提供一个这样的可视化工具,VisualVM,当然市场上还有一些商业或免费的其他类似工具,如JProfiler、JConsole等。下面我就介绍介绍,如何在window环境下,使用Visual VM连接Linux环境上的部署在tomcat上的web应用。

1、环境准备和说明

win7

jdk1.6.0_31

tomcat6

linux centos

本地的VisualVM要连接远程的JVM,需要进行相关的配置,VisualVM主要是通过JMX和jstatd两种方式进行远程连接的。

JMX连接可以查看系统信息,CPU使用情况,线程多少时间轴,手动执行垃圾回收等比较偏于系统级层面的信息。

jstatd连接方式可以提供JVM内存分布详细信息,垃圾回收分布图、线程详细信息,甚至可以看到某个对象使用内存的大小。

因此想查看远程的JVM的具体信息,最好两种方式都进行配置连接。

2、JMX连接的配置

在tomcat的bin/startup.sh中的末尾加入如下配置,这样该tomcat下 的web应用都可以通过VisualVM的JMX方式连接

export CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote=true
-Djava.rmi.server.hostname=19.129.251.16
-Dcom.sun.management.jmxremote.port=8099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"

hostname:tomcat所在的Linux服务器的地址

port:暴露的访问端口,不能和其他端口重复

添加后的效果图:

配置完毕后启动tomcat,看能不能访问上面配置的地址10.5.227.81:8999

使用telnet成功,说明地址是可以访问的,如果不能,则需要排查网络环境

a、远程Linux服务器的地址10.5.227.81和你的机器的联通性,使用ping命令看通不通

b、查看防火墙的是否限制了该端口的访问

如果上述步骤没有出现问题,那么你已经接近成功一大半

接下来在本地机器上打开jdk/bin/jvisualvm.exe,如图是visual VM的开始页面

新建一个远程连接,”远程”右键–>”添加远程主机”,输入上述配置的服务器地址,Djava.rmi.server.hostname=10.5.227.81

选择添加的主机,右键–>”添加JMX连接”,输入上面配置的端口8999,-Dcom.sun.management.jmxremote.port=8999

JMX连接成功后,你已经可以查看JVM的参数,如堆栈大小等JVM相关参数,查看服务器cpu消耗情况,手动执行垃圾回收、导出堆dump镜像,查看类、线程的总数和分布情况等权限

3、jstatd连接的配置

如果想看看jvm的内存各个分区的使用情况,哪些线程,变量使用内存的详细情况,还需要建立jstatd连接。在tomcat下(或者某个路径下,下面用到时指定绝对路径就行)新建文件jstatd.java.policy,该文件主要是用于授予VisualVM远程连接的权限,里面内容如下

   grant codebase "file:${java.home}/../lib/tools.jar" {
     permission java.security.AllPermission;
   };

创建jstatd.java.policy 后的效果图如下:

在Linux服务窗口执行下面命令

[root@qgserver ~]# jstatd -J-Djava.rmi.server.hostname=10.5.227.81  -J-Djava.security.policy=/data/tomcat6-fssmyx/jstatd.java.policy 

10.5.227.81是Linux服务器的ip地址,同上面。

jstatd.java.policy就是上面建立的文件,注意要指定绝对路径,我的是放在/data/tomcat6-fssmyx/,根据实际情况配置。

执行成功后,Visual VM中自动建立的jstatd连接,可以看到这台机上所有的tomcat,找到自己需要查看的tomcat web服务

打开VIsual GC选项卡可以看到tomcat的内存使用分布图,永久区、老年代、新生代的使用情况、垃圾回收的信息。要使用更多工具查看JVM,可以通过 ‘工具’-> ‘插件’安装更多工具

到此,使用本地的VisualVM查看远程的JVM已经完毕,谢谢大家的查看!!

时间: 2024-11-05 13:46:18

使用Visual VM 查看linux中tomcat运行时JVM内存的相关文章

设置eclise运行时JVM内存

Eclipse 中设置JVM 内存 今天在eclipse 中测试把文档转换为图片的时候,报出了下面的错误: java.lang.OutOfMemoryError: Java heap space 从上边的异常信息可以看到,JVM 需要使用的内存已经超过了我们分配给虚拟机可以使用的最大内存.所以问题就转化为如何设置eclipse 中jvm 的最大内存. 一.尝试修改Eclipse.ini 文件 (此方法不行) 找到eclipse 目录下的eclipse.ini 文件,修改下面的内容: -Xms40

如何修改Tomcat运行时jvm编码

问题: 最近在部署项目的时候出现数据乱码的情况,经过一番查看项目都是用的UTF-8编码格式,数据也是,但是经过调用接口传给对方就乱码了. 由于是部署在Windows环境下,Windows默认编码GBK,这就导致了jvm运行时编码不一致的问题,修改也很容易. 解决办法: Linux环境下如果使用的UTF-8编码,可以不用修改,因为Linux默认为UTF-8 war包部署在Tomcat 修改jvm编码 Linux环境 在catalina.sh配置 JAVA_OPTS="$JAVA_OPTS -Dfi

linux中tomcat内存溢出解决办法

用命令 tail -f /root/apache-tomcat-6.0.20/logs/catalina.out(需要找到tomcat路径) 查看日志,查看是否有错误 linux中tomcat内存溢出解决办法 常见的一般会有下面三种情况:1.OutOfMemoryError: Java heap space2.OutOfMemoryError: PermGen space3.OutOfMemoryError: unable to create new native thread.前两种通常一起进

Linux中tomcat开机启动配置脚本【参考其他文章的总结备忘录】

参考文章http://blog.sina.com.cn/s/blog_a57562c80101ic47.html http://blog.csdn.net/cheng168520/article/details/4312828 http://blog.sina.com.cn/s/blog_7f395ece0100ti5y.html 以前在自己本机上安装过一个Linux,后台应为系统崩溃,以前配置的开机启动脚本.数据库主从双备份.负载均衡等都没了,所以现在在重新配置一次,赶紧做个笔记防止自己以后又

查看linux中的TCP连接数【转】

转自:http://blog.csdn.net/he_jian1/article/details/40787269 查看linux中的TCP连接数 本文章已收录于:  计算机网络知识库  分类: 安全测试总结(2)  性能经验总结(107)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.查看哪些IP连接本机 netstat -an 二.查看TCP连接数 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps

项目部署到tomcat出错(tomcat运行时的JDK版本)

先展示一下错误,把项目部署到tomcat运行 出错原因 简单来说,就是执行代码的jdk版本 低于 编译的jdk版本 最后面的52.0是一种叫什么魔码,有各自对应的jdk版本. 其中52.0 对应的就是 jdk1.8版本. 解决办法 1)把编译的jdk版本降低:参考https://blog.csdn.net/qq_36769100/article/details/78880341 2)把执行代码的jdk版本提高: 我们错误是把项目放到tomcat中,运行时出错的,说明tomcat依赖的jdk版本太

云计算高级培训,Tomcat运维JVM 虚拟机常识

云计算高级培训,Tomcat运维JVM 虚拟机常识,作为了解JVM 虚拟机的开始.我们很有必要弄明白以下问题. 所谓虚拟机,就是一台虚拟的计算机.他是一款软件,用来执行一系列虚拟计算机指令.大体上,虚拟机可以分为系统虚拟机和程序虚拟机.大名鼎鼎的VisualBox.VMware就属于系统虚拟机.他们完全是对物理计算机的仿真.提供了一个可以运行完整操作系统的软件平台. 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令.

tomcat启动时JVM内存大小,以免出现内存溢出

问题: 主要是2个内存溢出的错误. 首先是:java.lang.OutOfMemoryError: Java heap space 其次是:java.lang.OutOfMemoryError: PermGen space 最终解决办法[我是4G内存,请适当修改大小]: [Windows]在catalina.bat的第一行增加: set JAVA_OPTS=-Xms512m -Xmx900m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSiz

查看linux中swap内存的相关参数

内容主要来源于:linux的内存回收和交换 各项命令查看的linux环境是:Linux SUSE-33 2.6.32.12-0.7-defaul zone? 内存管理的相关逻辑都是以zone为单位的,这里zone的含义是指内存的分区管理.Linux将内存分成多个区,主要有直接访问区(DMA).一般区(Normal)和高端内存区(HighMemory).内核对内存不同区域的访问因为硬件结构因素会有寻址和效率上的差别.如果在NUMA架构上,不同CPU所管理的内存也是不同的zone. /proc/zo