精华内容
下载资源
问答
  • 内存泄露排查

    2020-07-01 13:50:50
    内存泄露(Memory Leak):意思就是你用资源的时候为他开辟了一段空间,当你用完时忘记释放资源了,这时内存还被占用着,一次没关系,但是内存泄漏次数多了就会导致内存溢出 内存溢出(Out Of Memory---OOM):系统已经...

    概念

    内存泄露(Memory Leak):意思就是你用资源的时候为他开辟了一段空间,当你用完时忘记释放资源了,这时内存还被占用着,一次没关系,但是内存泄漏次数多了就会导致内存溢出

    内存溢出(Out Of Memory---OOM):系统已经不能再分配出你所需要的空间,比如你需要100M的空间,系统只剩90M了,这就叫内存溢出

    常见问题现象

    后台系统,经过压力测试之后,或者生产程序运行一段时间后,进程占用的操作系统内存比例一直居高不下。怀疑系统可能存在内存泄漏。

    常用工具及命令:visualVM, MAT, jmap, top

    排查思路:

    使用top命令查看问题进程,查看cpu,内存消耗情况   top -p 12121212

    查看该进程的启动参数等相关情况,判断参数设置是否合理  ps -aux |grep -v grep|grep 28990

    查看内存使用情况    jmap -heap 12121212

    查看内存实时使用情况,用visualVM远程连接程序(visualVM远程连接进程),查看使用趋势……

    经过以上几步如果已经确定是内存泄露,则需要导出heap dump进一步分析,导出方式有visualVM,jmap

    jmap -dump:file=/data/server/test_ops/a.hprof 22678

    jmap -dump:live,format=b,file=/data/server/test_ops/a.hprof 5889

    jmap -histo:live 5889

    heap dump分析,用MAT, visualVM结合起来分析

    不健壮代码的特征及解决办法 

    1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该 对象,防止发生内存泄露。对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率; 

    2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域;例如 

    3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的; 

    4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。 

    5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。 

    6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃 

    7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值


    展开全文
  • java内存泄露排查

    2021-02-23 09:37:54
    java内存泄露排查 https://blog.csdn.net/fishinhouse/article/details/80781673
    展开全文
  • Android内存泄露排查

    2016-05-15 17:57:44
    Android内存泄露排查:使用conv-hprof转化生成的mat,然后在histogrm页面中过滤,选择incomming reference,然后去掉非强引用项目。

    Android内存泄露排查

    内存泄露是指有个引用指向一个不再被使用的对象,导致该对象不会被垃圾回收器回收。在JAVA中是通过可达性(Reachability Analysis)来判断对象是否可以被回收。这个算法的基本思想是:通过一系列的称谓”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走的路径称为引用链,当不存在一条从GC Roots到该对象的引用链时,则该对象被判定为可以被回收的对象,反之不能被回收

    4种Java引用浅解(http://blog.csdn.net/kimylrong/article/details/24634383)

    Java引用和GC

    按照一个对象的引用可达(Reachable)强度,由强到弱分为5类,如下:

    1,强可达(Strong Reachable):在一个线程内,无需引用直接可达,新创建的对象是强可达的。
    2,软可达(Soft Reachable):不是强可达的,但是通过一个软引用(SoftReference)可达。
    3,弱可达(weak Reachable):既不是强可达也不是软可达,但是通过一个弱引用(WeakReference)可达。
    4,虚可达(Phantom Reachable):既不是强可达,不是软可达,也不是弱可达,但是通过一个虚引用(PhantomReference)可达。
    5,不可达(Unreachable):没有任何引用指向对象。

    当Java虚拟机(JVM)觉得内存不够用的时候,会触发垃圾回收操作(GC),清除无用的对象,释放内存。

    Java垃圾回收器会优先清理可达强度低的对象。另外有两个重要的点:
    强可达的一定不会被清理
    JVM保证抛出out of memory之前,清理所有的软引用对象

    下面分别介绍4种引用类型:

    1,强引用(StrongReference)
    我们平时申明变量使用的就是强引用,普通系统99%以上都是强引用。比如,String s = “Hello World”

    2,弱引用(WeakReference)
    垃圾回收器某个时刻决定回收软可达的对象的时候,会清理软引用,并可选的把引用存放到一个引用队列(ReferenceQueue)。

    3,软引用(SoftReference)
    类似弱引用,只不过Java虚拟机会尽量让软引用的存活时间长一些,迫不得已才清理。

    4,虚引用(PhantomReference)
    仅用来处理资源的清理问题,比Object里面的finalize机制更灵活。get方法返回的永远是null,Java虚拟机不负责清理虚引用,但是它会把虚引用放到引用队列里面。

    内存排查时,只检查强引用,其他在gc的时候会被回收掉。

    Android内存泄露排查

    1,安装debug包进行操作,然后退出需要检查内存的页面,或者退出app

    2, 打开exlipse 或者 Android Studio, 选择DDMS插件
    这里写图片描述

    3,在DDMS插件界面左侧能看到应用主进程,如com.tmall.wireless
    这里写图片描述

    4,选择UpdateHeap,然后点击右侧的GC,然后点击dump Hprof File
    这里写图片描述

    5,将生成的hprof使用hprof-conv工具进行转换
    hprof-conv oldPathAndName.hprof newPathAndName.hprof

    6,使用Mat工具打开文件
    这里写图片描述

    7,在classname中输入activity,查找对应activity dump出来的内存。
    这里写图片描述

    8,在可疑对象上右键,选择 “show objects by class” -> “by incoming references”,查看所有的引用这个实例的对象
    这里写图片描述

    9,过滤掉非强引用,打开后的tab显示了所有引用这个Object的对象,继续右键过滤掉所有无效的引用:”exclude all phantom/weak/sof etc. references”
    这里写图片描述

    10,最后剩下的那个就是引起泄漏的问题
    这里写图片描述

    展开全文
  • JVM内存泄露排查指令

    2019-11-28 09:37:11
    JVM内存泄露排查指令 查看系统中各个进程状态 top 题外话记录下:使用特定端口查找进程的PID ss -ltnup 'sport = :22' l – show only listening sockets t – show TCP connections n – show addresses in a ...

    JVM内存泄露排查指令

    查看系统中各个进程状态

    top
    

    题外话记录下:使用特定端口查找进程的PID

    ss -ltnup 'sport = :22'
    

    l – show only listening sockets
    t – show TCP connections
    n – show addresses in a numerical form
    u – show UDP connections
    p – show process id/program name

    例如:展示所有端口

    ss -lnt
    

    查看该进程下的线程cpu使用情况

    top -Hp PID
    

    查看当前java进程的堆栈状态

    jstack -l PID
    

    可参考:jstack命令

    命令查看jvm的GC回收统计情况

    jstat -gcutil PID
    

    可参考:jstat命令大全

    显示堆中对象的统计信息

    jmap -histo PID
    

    注意可以只显示前20行:jmap -histo PID | head -20

    生成堆转储快照dump文件

    jmap -dump:format=b,file=mydump.hprof PID
    

    可参考:jmap命令大全 注意这个大全中

    有了dump就可以分析了,仅作为记录,不适用于每个人。

    查看系统java程序使用的默认JVM参数

    -XX:+PrintCommandLineFlags 
    
    
    展开全文
  • 基础内存泄露(Memory Leak)java中内存都是由jvm管理,垃圾回收由gc负责,所以一般情况下不会出现内存泄露问题,所以容易被大家忽略。内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时...
  • Netty堆外内存泄露排查 来源于美团 一、导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程。Netty 底层...
  • [Java教程]一次艰难的内存泄露排查,BeanUtils 的锅0 2020-10-29 18:24:42现象通过jstat -gcutil pid 5000 ,发现fgc次数很多而且频繁,此时老年代占比已经大约70%左右,且已经回收不了内存,我们这边设置的fgc阈值是...
  • 最近线上某台虚拟机隔三差五就会挂掉,通过业务日志基本上排查到每次出错都源于某一个请求。于是对该请求展开排查。1,先确认罪魁祸首:执行该...而VIRT,RES,内存占比却有显著提升,且执行完成后并未下降。多次...
  • 基础 内存泄露(Memory Leak) java中内存都是由jvm管理,垃圾回收由gc负责,所以...内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,需要自主观察,比较严重的时候,没有内存可以分配,直接oom。 ...
  • JVM如果出现内存泄露,典型的现象就是系统FullGC比较频繁。到最后干脆OOM(Out of Memory)了。当发现应用内存溢出或长时间使用内存很高的情况下,通过内存dump进行分析可找到原因。当发现cpu使用率很高时,通过线程...
  • 阅读文本大概需要3分钟。基础内存泄露(Memory Leak)java中内存都是由jvm管理,垃圾回收由gc负责,所以一般情况下不会出现内存泄露问题,所以容易被大家忽略。...
  • 基础内存泄露(Memory Leak)java中内存都是由jvm管理,垃圾回收由gc负责,所以一般情况下不会出现内存泄露问题,所以容易被大家忽略。内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时...
  • 最近线上某台虚拟机隔三差五就会挂掉,通过业务日志基本上排查到每次出错都源于某一个请求。于是对该请求展开排查。1,先确认罪魁祸首:执行该...而VIRT,RES,内存占比却有显著提升,且执行完成后并未下降。多次...
  • 生产环境,我们使用rancher k8s部署我们的服务,有个服务(具体我这里就不说了),在晚上8点左右,因为这个服务的内存溢出导致了其他服务出现了异常,在8点的时候,客户频繁投诉,后面排查发现是有个服务内存泄露。...
  • java内存泄露排查总结

    2021-01-18 11:14:24
    1.内存溢出和内存泄露 一种通俗的说法: 内存溢出:你申请了10个字节的空间,但是你在这个空间写入了11个或者以上字节的数据,则出现溢出 内存泄露:你用new申请了一块内存,后来很长时间都不使用了,但是因为...
  • java项目内存泄露排查

    2021-02-23 15:07:53
    考虑程序逻辑导致的内存泄露 jmap -histo:live $pid 查看前后程序的各个对象数量和大小,发现没有明显增加 使用jmap -heap $pid 查看前后使用量,也没有发现明显增加 所以考虑其他原因造成的进程内存占用量在增加 2....
  • 线上内存泄露排查

    2021-03-25 21:09:17
    背景: 上周网关上线后,隔了几小时突然服务不可用,重启后恢复,隔几小时后依然如此;由于此次网关改动的代码较多,一时不好定位。...从系统监控图可以看出,自从服务上线后已用内存就一直在申请、上升,没有释放,那
  • 基础内存泄露(Memory Leak)java中内存都是由jvm管理,垃圾回收由gc负责,所以一般情况下不会出现内存泄露问题,所以容易被大家忽略。内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时...
  • 基础内存泄露(Memory Leak)java中内存都是由jvm管理,垃圾回收由gc负责,所以一般情况下不会出现内存泄露问题,所以容易被大家忽略。内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时...
  • 1,什么叫内存泄露 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果...
  • [Android]内存泄露排查实战手记

    千次阅读 2013-12-23 20:42:16
    内存泄露排查实战手记 Time:2013.09.02 Author:sodino 问题现象: 这里内存泄露是指已实例化的对象长期被hold住且无法释放或不能按照对象正常的生命周期进行释放。 问题期望: 进行多次重复操作后,能够正常回收该...
  • android的开发中内存泄露的情况一直让不少开发人员头疼,一些不规范的代码在不经意间就...今天介绍一个android上的内存泄露排查工具,不同其他工具的是,这个工具是嵌入的app中的成为app的一部分,运行过程中如果发生内
  • jvm排查内存泄露(visualvm)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 940
精华内容 376
关键字:

内存泄露排查