精华内容
下载资源
问答
  • VisualVM 是一款免费的\集成了多个JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU ...

    一、简介

    VisualVM 是一款免费的\集成了多个JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。

    在内存分析上,Java VisualVM的最大好处是可通过安装Visual GC插件来分析GC(Gabage Collection)趋势、内存消耗详细状况。

    二、GC分析操作简介

    Java VisualVM默认没有安装Visual GC插件,需要手动安装JDK的安装目录的bin目露下双击jvisualvm.exe,即可打开Java VisualVM,点击菜单栏 工具->插件 安装Visual GC

     

    若报:无法连接Java VisualVM 插件中心, 因为Server returned HTTP response code: 503 for URL: http://www.oracle.com。这是插件中心地址错误问题,请参考:https://blog.csdn.net/xionglangs/article/details/77603343

    安装完成后重启Java VisualVM,Visual GC界面自动打开,即可看到JVM中堆内存的分代情况:

     

     

    被监控的程序运行一段时间后Visual GC显示如下

    要看懂上面的图必须理解Java虚拟机的一些基本概念:

    堆(Heap) :JVM管理的内存叫堆
    分代:根据对象的生命周期长短,把堆分为3个代:Young,Old和Permanent,根据不同代的特点采用不同的收集算法,扬长避短也。

    1. Young(年轻代)
      年轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor复制过来的对象。而且,Survivor区总有一个是空的。

    2. Tenured(年老代)
      年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。

    3. Perm(持久代)
      用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。

    4. Metaspace(元空间)

              随着JDK8的到来,JVM不再有Perm。但类的元数据信息(metadata)还在,只不过不再是存储在连续的堆空间上,而是移动到叫做“Metaspace”的本地内存(Native memory)中。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存

    GC的基本概念

    gc分为full gc 跟 minor gc以及major gc,当每一块区满的时候都会引发gc。

    1. minor gc GC
      一般情况下,当新对象生成,并且在Eden申请空间失败时,就触发了minor gc GC,堆Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。

    2. Full GC
      对整个堆进行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此应该尽可能减少Full GC。有如下原因可能导致Full GC:上一次GC之后Heap的各域分配策略动态变化,System.gc()被显示调用,Perm域被写满.Tenured被写满

    内存溢出  out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

    内存泄露  memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。其实说白了就是该内存空间使用完毕之后未回收。

    二 Java VisualVM的其他功能

    0.概述

    1.监视界面(cpu,类,堆,线程)

     

    2.线程界面

    3.Profile界面(性能剖析)

    点击CPU按钮执行cpu分析查看方法

     

    点击内存按钮执行内存分析查看类

     

    4.堆dump生成和分析

    Dump文件是进程的内存镜像,一般比较大,可以把程序的执行状态通过调试器保存到dump文件中,主要是用来在系统中出现异常或者崩溃的时候来生成dump文件,然后用调试器进行调试,这样就可以把生产环境中的dump文件拷贝到自己的开发机上,调试就可以找到程序出错的位置。

    分析服务器jvm 某进程堆内存信息:

    jmap -heap <pid>   

    分析服务器jvm 堆dump文件:

          执行 jmap -dump:file=文件名称.dump <pid>  #pid为正在运行的java进程pid,必须填

         copy dump文件到windows,使用visualVM 加载 dump文件,分析,那一时刻堆内存的详细使用情况

        我们可以在启动java进程时,设置如下参数:

    参数说明
    -XX:+HeapDumpOnOutOfMemoryError内存溢出时自动导出内存快照
    -XX:HeapDumpPath=E:/dumps/导出内存快照时保存的路径

         在进程发生oom时自动生成dump文件,然后分析进程崩溃原因,注意dump文件时那一时刻进程使用内存情况,而oom是发生在申请内存大于实际拥有内存,即oom是内存并不一定100%使用。

    visualVM 监控的进程可通过: 监视->点击堆dump 按钮来,生成dump文件,并分析

     

    三、参考资料

    1、java自带的控工具VisualVM-https://www.cnblogs.com/happy-rabbit/p/6232581.html

    2、系统优化怎么做-JVM优化之VisualVM-http://www.imooc.com/article/73034

    3、VisualVM工具下载地址-https://visualvm.github.io

    4、jvm 内存溢出问题排查方法-https://www.cnblogs.com/lvgg/p/6840644.html

    5、visualvm官方使用手册-https://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/

    6、使用 VisualVM 进行性能分析及调优-https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

    展开全文
  • https://java.net/projects/tda/downloads/directory/visualvm 官方下载的,附带使用方法,Visualvm的TDA插件,能很好的分析线程Dump日志,吐血推荐!
  • JProfiler和JavaVisualVM分析Heap dump文件 下面将介绍利用常见的两个工具分析Heap dump文件。 接下来分析的heap dump文件,都是由于下面的代码引起的内存泄漏。 List<Integer> temp = new ArrayList<>...

    JProfiler和JavaVisualVM分析Heap dump文件

    下面将介绍利用常见的两个工具分析Heap dump文件。

    接下来分析的heap dump文件,都是由于下面的代码引起的内存泄漏。

    List<Integer> temp = new ArrayList<>();
     for(int i=0;i>=0;i++){
         temp.add(i);
     }
    

    1、JProfiler分析heap dump

    JProfiler打开->“Open Snapshot”—>找到dump文件—>查看“Heap walker”。
    在这里插入图片描述
    右击,选择这一个References。
    在这里插入图片描述
    这个基本能看出来是ArrayList引起的问题。

    2、Java VisualVM分析heap dump

    文件—>装入,选择heap dump文件
    在这里插入图片描述

    点击“ 导致 OutOfMemoryError 异常错误的线程”,会跳转到异常部分
    在这里插入图片描述
    很清晰直观定位到哪个方法。

    展开全文
  • 用jvisualvm分析dump文件

    万次阅读 2018-06-26 10:30:18
    https://blog.csdn.net/lkforce/article/details/60878295最近有一个java服务的堆内存溢出,然后僵死了,在重启服务之前用jmap命令生成了一份dump文件便于后面分析。生成dump文件的命令:jmap -dump:format=b,file=...

    https://blog.csdn.net/lkforce/article/details/60878295

    最近有一个java服务的堆内存溢出,然后僵死了,在重启服务之前用jmap命令生成了一份dump文件便于后面分析。

    生成dump文件的命令:

    jmap -dump:format=b,file=20170307.dump 16048

    file后面的是自定义的文件名,最后的数字是进程的pid。


    使用jvisualvm来分析dump文件:

    jvisualvm是JDK自带的Java性能分析工具,在JDK的bin目录下,文件名就叫jvisualvm.exe。

    jvisualvm可以监控本地、远程的java进程,实时查看进程的cpu、堆、线程等参数,对java进程生成dump文件,并对dump文件进行分析。

    像我这种从服务器上dump下来文件也可以直接扔给jvisualvm来分析。

    使用方式:直接双击打开jvisualvm.exe,点击文件->装入,在文件类型那一栏选择堆,选择要分析的dump文件,打开。





    装入之后在界面右侧的概要、类等选项卡可以看到生成dump文件当时的堆信息:




    可以看到,dump文件里记录的堆中的实例,总大小大概300M左右,(用第一行的实例大小除以百分比就能算出来),和JVM默认的新生代的大小差不多,远小于JVM中设置的最大堆内存,也就是说,dump文件里记录的并不是实例大小达到最大堆内存时的状态。


    为了验证一下,我自己在本地模拟了一下堆内存溢出的情形,并用jvisualvm监控

    我本地设置的最大堆内存是800M左右,代码里面是往一个List里面疯狂加数据,直到撑爆堆内存,得到的监控内容是这样的:


    分析:红框框出的部分是发生堆内存溢出时的情形,已使用的堆大小(蓝色部分)并没有增长特别明显,但是申请的堆的大小(黄色部分)从默认的400多兆急速上涨,涨到800M,然后内存溢出,然而使用的堆大小依然没怎么增长。

    所以,dump文件中的实例列表其实是反映了使用的堆的情况,而使用的堆内存并没有达到预先设置的最大堆内存,只是在申请堆内存的过程中超出了预先设置的最大堆内存,然后内存溢出。


    最后,jvisualvm确实挺好用的。


    展开全文
  • 使用VisualVM查看Java Heap Dump

    千次阅读 2018-11-17 19:06:36
    使用了jmap工具实现,手工触发fullGC,运维常备   jmap -histo:live &lt;pid&gt;...可以使用VisualVM浏览heap dump文件的内容,从而快速查看在堆中分配的对象。Heap dumps在主窗口的...
    • 使用了jmap工具实现,手工触发fullGC,运维常备

     

    jmap -histo:live <pid>

    或者

    jmap -dump:live,file=dump_001.bin PID 

    会生成dump_001.bin文件

    浏览Heap Dump

    可以使用VisualVM浏览heap dump文件的内容,从而快速查看在堆中分配的对象。Heap dumps在主窗口的heap dump子标签页中显示。你可以打开保存在本地的heap dump文件(.hprof)或者使用VisualVM捕获正在运行的程序的heap dumps。

    一个heap dump是Java虚拟机(JVM)在某一时刻所有对象的快照。JVM从堆中为所有的类实例和数组分配内存。当一个对象不再被使用并且没有对它的引用时,垃圾回收器回收其堆内存。通过查看堆,你可以找到对象创建的位置,发现对象的引用。如果JVM试图从堆中移除不再需要的对象时失败了,VisualVM可以定位到离该对象最近的垃圾回收根(garbage collecting root)。

    打开Heap Dump文件

    如果你有一个保存在本地的heap dump文件,在VisualVM中通过File > Load菜单项加载该文件。VisualVM能打开.hprof格式的heap dumps文件。打开后,heap dump作为主窗口的一个子标签页。

    捕获Heap Dump

    可以使用VisualVM捕获一个本地运行的应用程序的heap dump。捕获的heap dump文件是一个临时文件,关闭VisualVM后自动删除,若要保留,需要将其另存为文件。

    可通过以下两种方法捕获heap dump:

     

    • 在左侧“Application”(应用程序)子窗口中右击相应的应用程序,选择Heap Dump(堆Dump)。
    • 在Monitor(监视)子标签页中点击Heap Dump(堆Dump)按钮。

     

    本地应用程序的Heap dumps作为应用程序标签页的一个子标签页打开。同时,heap dump在左侧的Application(应用程序)栏中对应一个含有时间戳的节点。右击这个节点选择save as(另存为)即可将heap dump保存到本地。

    浏览Heap Dump

    VisualVM提供了一下可视化视图来浏览heap dumps:

    Summary View(概述)

    打开一个heap dump时,VisualVM默认显示“概述”标签页。概述视图显示了该heap dump的捕获环境和其他系统属性。

     

    Classes View(类)

    类视图显示了类列表和其对应的实例数量、所占比例。右击类名选择“Show in Instances View(在实例视图中显示)”即可查看指定类的实例列表。

    点击列头可按指定列排序。可以使用类列表下方的“类名过滤器(Class Name Filter)”来过滤类,也可以通过右击一个类名选择“Show Only Subclasses(只显示子类)”来将显示结果限制为指定类的子类。

    类视图

    Instances View(实例数)

    实例数视图显示了选中类的对象实例。在“实例(Instance)”栏中选中一个实例,右侧的“字段(Fields)”和“引用(References)”栏将显示该实例对应的字段和对它的引用。在引用栏中,右击一条并选择“显示最近的垃圾回收根节点(Show Nearest GC Root)”就会显示最近的垃圾回收根节点。

     

    展开全文
  • JVisualVM简介与内存泄漏实战分析,如何分析内存溢出,定位内存溢出问题
  • 当我们遇到一些java运行期间的疑难问题时,比如占用内存过大或假死等现象,往往想到的是dump一个快照出来分析一下。今天用一个最简单的例子来分享一下我分析java快照的方法。 代码实例 我喜欢用最简单的分析问题,太...
  • 最近有一个java服务的堆内存溢出,然后僵死了,在重启服务之前用jmap命令生成了一份dump文件便于后面分析。 生成dump文件的命令: jmap -dump:format=b,file=20170307.dump 16048 file后面的是自定义的文件名,...
  • 通过VisualVM导入dump时提示“不是有效的核心dump”: 导致错误的原因是:尝试打开的文件是Head Dump,而不是Core Dump。 解决方法 依次选择文件、装入: 在装入页面选择文件格式为:“堆Dump(*.hprof,*.*)” ...
  • VisualVM分析内存泄漏情况

    千次阅读 2020-04-07 20:20:27
    首先,导出jvm内存信息文件(.dump),通过命令:jmap -dump:format=b,file=文件名 [pid]...点击"装入",然后选择你的dump文件,就可以分析了,如下图: 参考: https://blog.csdn.net/lzwglory/article/details/795...
  • 使用 以下命令 创建 进程PID = 16231的 dump文件,命名为 order.hprof jmap -dump:format=b,file=order.hprof 16231  将文件下载到本地。 2.使用jdk bin目录下的jvisualvm.exe 装入 order.hprof ...
  • SSH登陆远程Linux服务器是普遍的方式,下面讲述如何使用Putty,Xming工具在Windows机器上SSH登陆到Linux服务器,并运行VisualVM可视化界面程序,进行Java性能分析。 1: 配置Linux服务器上sshd_config文件, 允许X11...
  • VisualVM分析一次OOM

    千次阅读 2019-09-25 11:26:31
    1、VisualVM VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。...2、模拟一次OOM 并生成dump文件 JVM参数设置 -Xms64M -Xmx64M ...
  • 概述开发大型 Java 应用程序的过程...为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。VisualVM 是一款免费的性能分析工具。它通过 jvmstat、JMX、SA(Servic...
  • 掌握jamp命令的使用以及通过MAT工具进行分析 掌握定位分析内存溢出的方法 掌握jstack命令的使用 掌握VisualJVM工具的使用 资料: 链接:https://pan.baidu.com/s/1GVj1G97naeVItuVmW1pR8A 提取码:p...
  • JVM dumpjava内存dump是jvm运行时内存的一份快照,利用它...我们一步一步来获取JVM dump文件获取dump文件的方式分为主动和被动i.主动方式:1.利用jmap,也是最常用的方式:jmap -dump:[live],format=b,file=2.利用jc...
  • [Java基础] 使用JMAP dump及分析dump文件

    千次阅读 2019-04-17 15:24:36
    Eclipse 提供的一个用于分析JVM 堆Dump文件的插件。借助这个插件可查看对象的内存占用状况,引用关系,分析内存泄露等。 http://www.eclipse.org/mat/ kill -3 [pid] 在Linux 上找到Java所在的进程号,然后执行...
  • JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m" cygwin=false 使用jvisualvm打开分析dump文件 1先写个堆内存溢出的简单程序 package com.example.demo.javaTest.OOM; import ...
  • 使用JMAP dump及分析dump文件

    万次阅读 2018-11-09 11:48:01
    其中jmap是java自带的工具 查看整个JVM内存状态  ...要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起 查看JVM堆中对象详细占用情况 jmap -histo [pid] 导出整个JVM ...
  • 一 代码 package chaper02; /** * @className: ThreadDeadLock * @description: 线程死锁 * @... } } 二 生成线程 dump 文件 生成后的样子,可在此进行分析。 三 保存线程 dump 文件 四 读取线程 dump 文件
  • 可以使用VisualVM浏览heap dump文件的内容,从而快速查看在堆中分配的对象。Heap dumps在主窗口的heap dump子标签页中显示。你可以打开保存在本地的heap dump文件(.hprof)或者使用VisualVM捕获正在运行的程序的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,986
精华内容 1,994
关键字:

使用visualvm分析dump文件