登陆

高并发编程系列:4大JVM功能剖析东西详解,及内存走漏剖析

admin 2019-05-14 246人围观 ,发现0个评论

谈到功用优化剖析一般会触及到:

  • Java代码层面的,典型的循环嵌套等
  • 还会触及到Java JVM:内存走漏溢出等
  • MySQL数据库优化:分库分表、慢SQL查询,长事务等功用优化

今日首要共享JVM功用调优东西,文末有具体的JVM调优办法和过程。

01

什么场景需求JVM调优

  1. OutOfMemoryError,内存不足
  2. 内存走漏
  3. 线程死锁
  4. 锁争用(Lock Contention)
  5. Java进程耗费CPU过高

这些问题呈现的时分常常经过重启服务器或许高并发编程系列:4大JVM功能剖析东西详解,及内存走漏剖析调大内存来暂时处理,实践状况,还需求尽量复原其时的事务场景,并剖析内存、线程等数据,经过剖析找到终究的处理方案,这就会触及到功用剖析东西。

02

JVM功用监控剖析东西

JDK自身供给了很丰厚的功用监控东西,除了集成式的visualVM和jConsole外,还有jstat,jstack,jps,jmap,jhat小东西,这些都是功用调优的常用东西。

  1. Jconsole : jdk自带,功用简略,可是能够在体系有必定负荷的状况下运用。对废物收回算法有很具体的盯梢。
  2. JProfiler:商业软件,功用强壮。
  3. VisualVM:JDK自带,功用强壮,与JProfiler相似。
  4. MAT:MAT(Memory Analyzer Tool),一个依据Eclipse的内存剖析东西。

下面介绍这些JVM东西的运用

03

JVM功用调优东西

VisualVM

VisualVM 是javajdk自带的牛逼的调优东西,也是平常运用最多调优东西,简直触及了jvm调优的方方面面。发动起来后和jconsole 相同相同能够挑选本地和长途,假如需求监控长途相同需求装备相关参数。

1 翻开VisualVM

这个东西放在JDK装置目录的bin目录下,双击jvisualvm.exe即可翻开,高并发编程系列:4大JVM功能剖析东西详解,及内存走漏剖析如下图所示

2. 监督页面首要展现 体系资源占用状况

  • CPU :展现java程序运转的时分占用的cpu资源
  • :这儿要阐明下堆内存的组成部分,堆是由老时代和新生代组成,其间新生代有由"伊甸园"和"两个幸存区组成"三部分组成,堆视图看到的资源占用实践是"老时代"、"伊甸园(Eden)"、"两个幸存者(Survivor )"的一个归纳状况。
  • PermGen :Perm 区用来寄存java类以及其他虚拟机自己的静态数据,(常被称为耐久代或许办法区)
  • :此视图 首要展现 当时程序加载了多少个类
  • 线程: 当时程序的线程发动状况
  • 堆Dump : 出产当时程序的内存快照hprof文件,关于剖析内存溢出问题比较有协助。

3. 线程页面(首要展现程序中一切的线程运转状况)

  • 线程dump : 一切线程的快照(对剖析线程死锁,比较有协助
  • 时刻线 : 展现每个线程的实时运转状况(不同色彩代表不同的状况)

VisualVM能够依据需求装置不同的插件,每个插件的关注点都不同,有的首要监控GC,有的首要监控内存,有的监控线程等。


Jconsole

JConsole是一个JMX(Java Management Extensions,即Java办理扩展)的JVM监控与办理东西,监控首要表现在:仓库内存、线程、CPU、类、VM信息这几个方面,而办理首要是对JMX MBean(managed beans,被办理的beans,是一系列资源,包括目标、接口、设备等)的办理,不仅能检查bean的特点和办法信息,还能够在运转时修正特点或调用办法。

1.翻开Jconsole

直接在jdk/bin目录下点击jconsole.exe即可发动,界面如下:

1、内存

在内存页咱们能够看到程序运转期间JVM各个部分的内存状况,右下角是对应各个分区的内存运用柱状图,点击对应柱可检查概况,看图:

2、线程

该页面能够检查当时JVM进程发动了多少个线程,并能检查每个线程的状况及仓库信息,此外还有一个功用便是能够主动检测死锁,见图:

3、类

该页面其实和线程页有些相似,不过显现的是JVM加载类的信息,见图:

4、VM概述

这个其实没必要细说,看图就理解,显现了当时JVM的各方面信息:

5、MBean办理

MAT

MAT(Memory Analyzer Tool),一个依据Eclipse的内存剖析东西,是一个快速、功高并发编程系列:4大JVM功能剖析东西详解,及内存走漏剖析用丰厚的Java heap剖析东西,它能够协助咱们查找内存走漏和削减内存耗费。

能够运用visualvm或许是 jmap指令出产堆文件在进行内存剖析。

1. 用jmap生成堆信息

这样在E盘的jmap文件夹里会有一个map.bin的堆信息文件

2. 将堆信息导入到mat中剖析

3. 生成剖析陈述

能够运用visualvm或许是 jmap指令出产堆文件,导入eclipse mat中生成剖析陈述:

1)Histogram(直方图)视图

  • Class Name : 类称号,java类名
  • Objects : 类的目标的数量,这个目标被创建了多少个
  • Shallow Heap :一个目标内存的耗费巨细,不包括对其他目标的引证
  • Retained Heap :是shallow Heap的总和,也便是该目标被GC之后所能收回到内存的总和

经过直方图视图能够很简单找到占用内存最多的姜育恒几个类(经过Retained Heap排序),还能够经过其他方法进行分组(见下图)。

假如存在内存溢出,时刻久了溢出类的实例数量或许内存占比会越来越多,排名也越来越靠前。

图标进行比照,经过屡次比照不一起刻点下的直方图比照就很简单把溢出的类找出来。

2)分配树(Dominator Tree)

MAT供给了一个称为分配树(Dominator Tree)的目标图。分配树表现了目标实例间的分配联系,在此视图中列出了每个目标(Object Instance)与其引证联系的树状结构,一起包括了占用内存的巨细和百分比。

经过Dominator Tree视图能够很简单的找出占用内存最多的几个目标(依据Retained Heap或Percentage排序),和Histogram相似,能够经过不同的方法进行分组显现:

Histogram视图和Dominator Tree视图的视点不同,前者是依据类的视点,后者是依据目标实例的视点,而且能够更便利的看出其引证联系。

以上仅仅一个开始的介绍,mat还有更强壮的运用,比方比照堆内存,在出产环境中往往为了定位问题,每隔几分钟dump出一下内存快照,随后在比照不一起刻的堆内存的改变来发现问题。

04

JVM内存走漏剖析

形成OutOfMemoryError内存走漏典型原因:目标现已死了,无法经过废物收集器进行主动收回,需求经过找出走漏的代码方位和原因,才好确认处理方案。

剖析过程:

1. 用东西生成java应用程序的heap dump(如jmap)

2. 运用Jav高并发编程系列:4大JVM功能剖析东西详解,及内存走漏剖析a heap剖析东西(如MAT),找出内存占用超出预期的嫌疑目标

3. 依据状况,剖析嫌疑目标和其他目标的引证联系。

4. 剖析程序的源代码,找出嫌疑目标数量过多的原因。

  • 华夏银行南阳分行:支撑当地经济发展
  • 请关注微信公众号
    微信二维码
    不容错过
    Powered By Z-BlogPHP