• 实战JAVA虚拟机 JVM故障诊断与性能优化(七)


    分析Java堆

    1.对症下药:找到内存溢出的原因

      内存溢出(OutofMemory,简称OOM),主要讨论最常见的集中内存溢出问题,包括堆溢出、直接内存溢出、永久区溢出等。

    堆溢出

      当对象大小之和大于由Xmx参数指定的堆空间大小时,会造成溢出。

    直接内存溢出

      在java的NIO(new IO)中,支持直接内存的使用,获取堆外的内存,这块内存是直接向操作系统申请的。

    过多线程导致OOM

      由于线程的栈空间也是堆外的分配的。

    永久区溢出

      存放类元数据的区域,如果一个系统定义太多的类,那么永久区会溢出。但在jdk1.8中,永久区被一块称为元数据区域取代,但是功能是类似的,都是为了保存类的元信息。

    虚拟机内窥镜:使用MAT分析Java堆

    1、MAT是什么?

        MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

    2.为什么使用MAT?
        当服务器应用占用了过多内存的时候,会遇到OutOfMemoryError。如何快速定位问题呢?Eclipse MAT的出现使这个问题变得非常简单。它能够离线分析dump的文件数据。
        Eclipse MAT是SAP公司贡献的一个工具,可以在Eclipse网站下载到它,完全免费的。它可比Sun提供的内存镜像分析工具jhat要强太多了。
    3.地址
    首页:http://www.eclipse.org/mat/
    插件更新地址:
    http://download.eclipse.org/mat/1.0/update-site/

    注意:可以使用jmap命令,生成堆的快照,使用发放:http://www.cnblogs.com/kaishi/p/7515216.html

    File ---> acquire Heap Dump  打开正在运行的程序,或者打开dump文件

    查看内存使用情况:

     

    查看类柱状图

    查看引用关系:

      通过MAT可以找到引用当前对象的对象,即入引用 with incoming references,找到当前对象引用的对象,即出引用with outgoing references。

     

    浅堆和深堆 

      浅堆(Shallow Heap)和深堆(Retained Heap)是两个非常重要的概念,分别表示一个对象结构占内存的大小和一个对象被GC回收后,可以真实释放的内存大小。

    Tomcat堆溢出分析

      思想:分析Dump文件,选择占堆内存较大的区块,进行引用跟踪,找到频繁出现的堆内存中的对象

      

  • 相关阅读:
    华为精益敏捷专家:DevOps转型中的那些坑
    极致进化-敏捷进化型企业的未来畅想
    DevOps的工程化
    京东精益敏捷教练分享:敏捷助力产品创新!
    敏捷开发进度管理之燃尽图
    手把手教你进行Scrapy中item类的实例化操作
    手把手教你使用ADB卸载手机内置App软件
    手把手教你使用Python生成图灵智能小伙伴,实现工作助手/闲聊功能
    手把手教你利用Pyecharts库对IP代理数据进行数据可视化分析
    手把手教你使用Python爬取西刺代理数据(下篇)
  • 原文地址:https://www.cnblogs.com/kaishi/p/7517349.html
Copyright © 2020-2023  润新知