通过jhat分析内存泄漏

dump堆信息

jcmd

jmap

jconsole

jvisualVM等等工具

虚拟机添加-XX: HeapDumpOnOutOfMemoryError 选项, 在抛出 OutOfMemoryError 时, 会自动执行堆转储。

分析dump文件

jhat -J-Xmx512M dump.hprof

说明:有时dump出来的堆很大,在启动时会报堆空间不足的错误,可加参数:jhat -J-Xmx512m 。这个内存大小可根据自己电脑进行设置。

image-20200103102032963

在浏览器中输入ip端口(端口在上面的日志中已经给出)

image-20200103102129564

这个页面包含了各种功能
下面执行几个

All classes including platform

把堆所有类信息显示出来(默认是不包括Java平台的类)

image-20200103102634853

All Members of the Rootset

从根集能引用到的对象

image-20200103102859428</div></body></html>

【java】jmap -histo pid 输出的[B 占用很高,请问问题会在哪里?

04-26

公司目前的程序是解析excel表格内容,使用到了poi sax方式解析,但是在监控的过程中发现堆内存B的占用非常高,使用mat工具也告诉B可能存在内存泄漏问题。 代码中那些操作会导致这个问题呢?代码中只使用了一个inputstream来保存文件,而且使用后也关闭了 是在找不到,但是B占了相当多的空间 b就是byte数据(下面这个不是我的图,是我找的一个例图,就是B那个地方,我这里显示的是占用最高的,我不知道我的程序哪里写错了会导致这种情况) ``` num #instances #bytes class name ---------------------------------------------- 1: 1169837 131659368 [C 2: 25945 38337824 [I 3: 31548 29407968 [B 4: 1164546 27949104 java.lang.String 6: 91313 12829072 <constMethodKlass> 7: 12395 12404880 [S 8: 91313 11700288 <methodKlass> 9: 7525 9303112 <constantPoolKlass> 10: 7525 5606808 <instanceKlassKlass> 11: 6043 5028288 <constantPoolCacheKlass> 12: 10048 2007888 [Ljava.lang.Object; 14: 3507 1707048 <methodDataKlass> 15: 8132 980616 java.lang.Class 16: 26854 859328 java.util.HashMap$Entry 17: 12368 699296 [[I 18: 14135 452320 java.util.concurrent.ConcurrentHashMap$HashEntry 19: 20883 334128 java.lang.Object 20: 590 316240 <objArrayKlassKlass> 21: 1757 305904 [Ljava.util.HashMap$Entry; 22: 2809 224720 net.sf.ehcache.Element 23: 1992 223104 java.net.SocksSocketImpl 24: 2668 213440 java.lang.reflect.Method 26: 5932 183928 [Ljava.lang.String; 27: 7588 182112 java.util.concurrent.ConcurrentSkipListMap$Node 28: 7317 175608 java.lang.Long 29: 5303 169696 java.util.Hashtable$Entry 30: 6778 162672 java.util.ArrayList 31: 3931 157240 java.lang.ref.SoftReference 32: 2972 118880 java.util.LinkedHashMap$Entry 33: 1565 112680 org.apache.commons.pool2.impl.DefaultPooledObject 34: 2817 112680 net.sf.ehcache.store.chm.SelectableConcurrentHashMap$HashEntry 35: 2243 107664 java.util.HashMap 36: 2592 103680 java.util.TreeMap$Entry 37: 3214 102848 java.lang.ref.WeakReference 38: 1565 100160 redis.clients.jedis.Client 39: 4155 99720 java.util.LinkedList$Node 40: 1986 95328 java.net.SocketInputStream 41: 414 92952 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry; 42: 2275 91000 java.lang.ref.Finalizer 43: 1161 83592 java.lang.reflect.Constructor 44: 757 78728 java.io.ObjectStreamClass 45: 1587 76176 java.net.SocketOutputStream 46: 1189 66584 java.beans.MethodDescriptor 47: 2770 66480 org.apache.commons.pool2.impl.LinkedBlockingDeque$Node 48: 388 66368 [Ljava.util.Hashtable$Entry; 49: 1989 63648 java.net.Socket 50: 749 53928 java.lang.reflect.Field ... ... 2947: 1 16 sun.misc.Launcher 2948: 1 16 org.codehaus.jackson.map.ser.std.DateSerializer 2949: 1 16 org.apache.phoenix.schema.types.PDataType$2 2950: 1 16 org.springframework.data.redis.connection.convert.StringToRedisClientInfoConverter Total 3090439 316004152 ``` 问答

为什么调用方法2,3没反应?

05-09

import java.util.ArrayList; import java.util.Scanner; public class L9 { public static void main(String[]args)throws Exception{ Guanli G=new Guanli(); Scanner in=new Scanner(System.in); while(true){ System.out.println("请按提示选择以下功能"); System.out.println("添加食品请按:1"); System.out.println("查找食品信息请按:2"); System.out.println("修改食品价格请按:3"); System.out.println("删除食品请按;4"); System.out.println("退出系统请按;0"); int C=in.nextInt(); if(C==1){ System.out.println("请输入食品编号"); int bian=in.nextInt(); System.out.println("请输入食品名称"); String n=in.next(); System.out.println("请输入食品价格"); double P=in.nextDouble(); Food F=new Food(bian,n,P); G.add(F); }else if(C==2){ System.out.println("请输入食品编号"); int bian=in.nextInt(); G.find(bian); }else if(C==3){ System.out.println("请输入食品编号"); int bian=in.nextInt(); System.out.println("请输入食品价格"); double P=in.nextDouble(); G.change(bian, P); } } } } class Guanli { int i; ArrayList A; Guanli(){ A=new ArrayList(); } public void add(Food F){ A.add(F); System.out.println("添加新食品成功"); } public void find(int bian){ for(int i=0;i<A.size();i++){ Food s=(Food)A.get(i); if(s.getBian()==bian){ System.out.println("食品编号为"+bian); System.out.println("食品编号为"+s.getName()); System.out.println("食品编号为"+s.getPrice()); break; } if(i==A.size()){ System.out.println("没有该食品"); } } } public void change(int bian,double price){ for(int i=0;i<A.size();i++){ Food s=(Food)A.get(i); if(bian==s.getBian()){ s.setPrice(price); System.out.println("修改食品价格成功"); break; }if(i==A.size()){ System.out.println("没有该食品"); } } } } class Food { String name; int bian; double price; Food(int bian,String name,double price){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getBian() { return bian; } public void setBian(int bian) { this.bian = bian; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } } 菜鸡自学的,希望各位大神帮我下,谢谢了 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览

应支付9.90元
点击重新获取
扫码支付

支付成功即可阅读