JVM优化之jmap的使用以及内存溢出分析

什么是jmap?

jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节

可以使用jmap生成Heap Dump。

在Java命令Java Dump和Java命令:Jstack中分别有关于Java Dump以及线程 Dump的介绍。

查看内存使用情况

首先使用idea启动一个Tomcat

在使用 jps 查看该进程 pid

jmap -heap  pid

查看内存中对象数量及大小

#查看所有对象,包括活跃以及非活跃的
jmap -histo <pid> | more

#查看活跃对象
jmap -histo:live <pid> | more

对象说明

B: byte
C:char
D:double
F: float
I: int
J :long
Z :boolean
‘[‘ :数组,如:‘[I‘:表示int[]
‘[L+‘:类名 其他对象

将内存使用情况dump到文件中

有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析,jmap也
是支持dump到文件中的。

#用法:
jmap ‐dump:format=b,file=dumpFileName <pid>

  

通过jhat对dump文件进行分析

将jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,这时我们可以借助于jhat工具进行查看

#用法:
jhat ‐port <port> <file>

  

在浏览器中进行查看

在最下面有一个查询功能

输入: select s from java.lang.String s where s.value.length >= 1000 (查询长度大于等于1000的字符串)

结果会在左下角显示出来

通过MAT工具对dump文件进行分析

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,

它可以帮助我们查找内存泄漏和减少内存消耗。

使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,

并可以通过报表直观的查看到可能造成这种结果的对象。

官网地址:https://www.eclipse.org/mat/

下载与解压完成之后

使用

actions下面的

Histogram:列出内存中的对象,对象的个数以及大小

Dominator Tree:列出最大的对象以其依赖存活的对象

点击Histogram进入查看内存中的对象,对象的个数以及大小

点击Dominator Tree查看最大的对象以其依赖存活的对象

点击default_report进行查看查看可能存在内存泄露的分析

原文地址:https://www.cnblogs.com/wishsaber/p/12409056.html

时间: 2024-10-12 06:01:59

JVM优化之jmap的使用以及内存溢出分析的相关文章

java内存溢出分析工具

http://www.cnblogs.com/preftest/archive/2011/12/08/2281322.html java内存溢出分析工具:jmap使用实战 在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap. 1 使用命令 在环境是linux+jdk1.5以上,这个工具是自带的,路径在JDK_HOME/bin/下 jmap -histo pid>a.log 2 输出结果摘要 Size Count Class description -----------

JVM内存溢出分析-实战JVM(二)

JVM规范规定,除了程序计数器,虚拟机其他内存区域均会发生内存溢出的可能,OutOfMemoryError(OOM) 原文地址:http://www.begincode.net/blog/62  我的网站,欢迎大家多提意见 本文目的: 1.通过代码人为造成OOM,让大家跟了解JVM运行时各区存储的内容. 2.通过demo让大家实际开发过程中,能够根据异常判断是那个内存区域发生的溢出, 3.让大家了解到什么样的代码会产生OOM,开发中能够尽量规避. 前提: 先和大家介绍一下eclipse如何设置J

BAT面试必问题系列:深入详解JVM 内存区域及内存溢出分析

前言 在JVM的管控下,Java程序员不再需要管理内存的分配与释放,这和在C和C++的世界是完全不一样的.所以,在JVM的帮助下,Java程序员很少会关注内存泄露和内存溢出的问题.但是,一旦JVM发生这些情况的时候,如果你不清楚JVM内存的内存管理机制是很难定位与解决问题的. 一.JVM 内存区域 Java虚拟机在运行时,会把内存空间分为若干个区域,根据<Java虚拟机规范(Java SE 7 版)>的规定,Java虚拟机所管理的内存区域分为如下部分:方法区.堆内存.虚拟机栈.本地方法栈.程序

Java 内存溢出分析

相关内存知识描述 方法区 保存装载的类信息 类的常量池 字段.方法信息 方法字节码 通常和永久(Perm)关联在一起 Java堆 和程序开发密切相关 应用系统对象都保存在Java堆中 所有线程共享Java堆 对分代GC来说,堆也是分代的 GC的主要工作区间 Java栈 线程私有 栈由一系列帧组成(因此Java栈也叫做帧栈) 帧保存一个方法的局部变量.操作数栈.常量池指针 每一次方法调用创建一个帧,并压栈 用代码描述下,虚拟机执行过程中内存分配 public class App //运行时, jv

android内存溢出分析

Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M.但是Android采用的是Java语言编写,所以在很大程度上,Android的内存机制等同于Java的内存机制,在刚开始开发的时候,内存的限制问题会给我们带来内存溢出等严重问题.在我们不使用一些内存的时候,我们要尽量在Android或者其他平台上避免在运行其他程序时,保存必要的状态,使得一些死进程所带来的内存问题,应该尽量在关闭程序或者保存状态的时候释放掉,这样能提高系统在运行方面的流畅性. Android的内存主要表

jvm(二)------各个运行时数据库常见内存溢出分析与模拟

一.堆溢出 jvm参数  -Xms11m -Xmx40m 运行代码 public static void main(String[] args) { List<byte[]> list = new ArrayList<>(); int i=0; while(true){ list.add(new byte[5*1024*1024]); System.out.println("分配次数:"+(++i)); } } 运行结果 分配次数:1 分配次数:2 分配次数:3

android图片加载内存优化方法,有效解决大图片内存溢出(oom)

低内存的手机如果直接加载大图片,往往会出现OOM的情况.即便是主流手机,也不能无限制的加载大图片.所以在显示图片之前,需要对图片处理,把图片缩放为最合适的尺寸再显示. 网上很大方法都是不管三七二十一,直接压缩图片.这样可能会导致图片失真,显示模糊.我采用的方式是,显示尺寸有多大,就等比例压缩成多大尺寸的图片,关键关于在于如何寻找最合适的尺寸,下面分享两个关键方法,提取至google开源框架volley private static int getResizedDimension(int maxP

高并发下Netty4底层bug导致直接内存溢出分析

事故记录: 10点游戏开服,迅速冲破2300+单区同时在线 18点15分,运营反应玩家进不了,准备吃饭的人被抓回来排查故障 发现,由于直接内存被占满,一直在Full GC ,并且回收不掉,所以完全不处理玩家请求,通知运维重启服务器,临时解决. 2.考虑了下是不是把RPC连接数量改成了8条,超时改长了了导致,试着把数量减少,超时改成2个小时,发现直接内存随着时间推移还在增加. 3.把内存数据dump了一份下来,发现是netty底层占用比例大大超出了正常水平. 输出缓冲区ChannelOutboun

Metaspace 内存溢出分析

class Metaspace extends ClassLoader { public static List<Class<?>> createClasses() throws InterruptedException { // 类持有 List<Class<?>> classes = new ArrayList<Class<?>>(); // 循环1000w次生成1000w个不同的类. for (int i = 0; i <