Jconsole工具和Java VisualVM

一、简介

 

Jconsole是JDK自带的监控工具,在JDK/bin目录下可以找到。它用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监
控,并画出大量的图表,提供强大的可视化界面。而且本身占用的服务器内存很小,甚至可以说几乎不消耗。

二、远程监控

 

1、启动Java程序时添加如下参数:

JAVA_OPTS="-Xms4096m -Xmx4096m 
-Dcom.sun.management.jmxremote.port=3009 -Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false"

2、Java程序启动成功后,打开Jconsole工具,可在jdk/bin下找到jconsole.exe, 双击弹出一个窗口,输入ip:port,用户名和密码为 root即可

image.png

 

连接成功之后页面.png

 

3、随时可以使用JConsole的在右上角的绿色连接状态图标,断开或重新连接到正在运行的Java虚拟机。 从下拉菜单中选择连接,然后新建连接,您可以
同时连接到任何数量运行中的Java虚拟机。

4、JConsole的,可以让您保存在一个逗号分隔值(CSV)文件中的图表提供的数据。 只需右键单击任何图表上,选择保存数据即可。

CSV格式是常用的电子表格应用程序之间的数据交换。 CSV文件可以导入到电子表格应用程序,可以用来创建这些应用程序的图表。 这些数据是两个或
多个命名的列,第一列表示的时间戳。 导入电子表格应用程序的文件后,你通常需要选择的第一列,并改变其格式为“日期”或“日期/时间”。

监控内存消耗.png

 

监控内存消耗显示:

1、“执行GC”的按钮,可以单击执行垃圾收集。 图表动态显示内存使用的堆和非堆内存的内存池。 可用的内存池取决于正在使用的版本的Java VM。

2、 串行垃圾回收的内存池的HotSpot Java虚拟机,有以下几种。
    eden空间(堆):大多数对象最初分配内存的池。
    生存空间(堆):包含eden空间垃圾收集后生存的对象。
    年老代(堆):池包含已经存在一段时间的对象。
    永久代(非堆):池包含的所有虚拟机本身的反射的数据,如类和方法的对象。 Java虚拟机,使用类数据共享,这一代分为只读和读写区域。
    代码缓存(非堆):HotSpot Java虚拟机的还包括一个代码缓存,包含内存,使用本机代码的编译和存储。

3、可以从图表下拉菜单中的选项选择不同的图表显示表示这些内存池的消费。 此外,点击在右下角的角落堆和非堆图标,将切换显示图表
  (与下拉框选择不同类型图表功能相同)。 最后,可以指定跟踪内存使用情况,从时间范围内的下拉菜单中的选项选择的时间范围。

4、“详细信息”区域显示了当前内存信息:

  (1)、已使用:目前使用的内存量,包括所有对象,可达和不可达占用的内存。

  (2)、分配 :保证由Java虚拟机使用的内存量。 提交的内存量可能会随时间而改变。 Java虚拟机可能会释放系统内存,已提交的内存量可能会少于
      最初启动时分配的内存量。 提交的内存量将始终大于或等于使用的内存量。

  (3)、最大值,可用于内存管理的最大内存量。 它的价值可能会发生变化,或者是不确定的。 如果Java虚拟机试图增加使用的内存大于提交的内存,
       内存分配可能失败,即使使用量小于或等于最大值(例如,当系统上的虚拟内存不足)。

  (4)、GC时间 :累计时间花在垃圾收集和调用的总数。 它可能有多个行,其中每一个代表一个垃圾收集器算法在Java虚拟机使用时间。
        MarkSweepCompact:年轻代GC
        Scavenge:full GC
       
        GC时会暂停整个JAVA应用,普通GC 只是对年轻代进行垃圾回收,full的GC会对整个堆内存(包含老年代、年轻代)进行垃圾回收。
        system的GC显示调用GC。

        full gc 只会在两个情况下发生:1)system.gc被显示调用时,会执行full gc。2)老年代的堆内存满时,会执行full gc。
 
5、较低的右侧的条形图显示堆和非堆内存中的内存池消耗的内存。 列会变成红色时,使​​用的内存超过了内存使用阀值。

 

内存溢出的原因有很多种,比如:

  1、数据量过于庞大;死循环 ;静态变量和静态方法过多;递归;无法确定是否被引用的对象;

  2、虚拟机不回收内存(内存泄漏);
         程序运行要用到的内存大于虚拟机能提供的最大内存就发生内存溢出了。 

内存溢出的一般解决方法:

  一个是优化程序代码,如果业务庞大,逻辑复杂,尽量减少全局变量的引用,让程序使用完变量的时候释放该引用,能够让垃圾回收器回收和释放资源。

  二就是物理解决,增大物理内存,然后通过-Xms2048m -Xmx2048m 的修改来增大内存空间。

二、Java VisualVM

 

1、Java VisualVM也是JDK的一个集成的分析工具,自从JDK 6 Update 7以后已经作为Sun的JDK的一部分。

2、VisualVM可以监控应用程序的性能和内存占用情况、监控应用程序的线程、进行线程转储(Thread Dump)或堆转储(Heap Dump)、跟踪内存泄漏、
监控垃圾回收器、执行内存和CPU分析,保存快照以便脱机分析应用程序;同时它还支持在MBeans上进行浏览和操作。 VisualVM自身要在JDK6以上的运
行,但是JDK1.4以上版本的程序也能被它监控。

3、启动方法:进入JAVA_HOME所在的bin目录,运行jvisualvm.exe就可以启动VisualVM

   远程连接WAS服务器的话,需要添加JMX连接方式就可以了

Java VisualVM.png

 

 

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页