排查Java应用内存泄漏问题的步骤
什么是内存泄漏
内存泄漏是指java应用的堆内存使用率持续升高,直至内存溢出。
内存泄漏的的原因可能有多种
- 分配给应用程序的内存本身过小。而应用的业务代码,确实需要生成大量的对象
- 代码bug,某些需要被回收的对象,由于代码bug,却持续的被引用,导致java虚拟机无法回收这些对象。从而撑爆内存
无论哪种内存泄露,我们的解决方法都是要定位到具体是什么对象,占用了大量内存,从而方便我们基于此进行代码分析,debug,找出代码问题。
而能够帮助我们实现这一目的的方式就是获取java应用的内存 dump
如何获取内存dump
使用命令获取jcmd
首先需要获取java 进程id,获取到java进程后
使用命令
jcmd <pid> GC.heap_dump <file-path>
如果执行报错
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
一般是由于执行jcmd的用户同java应用本身不是同一个用户。解决办法是切换到应用对应的用户下再执行上述命令
sudo -u [userid] /jcmd <pid> GC.heap_dump <file-path>
如果应用在本地
如果应用是在本地,除了用上述方法外,还可以用JVisualVM 、JConsole
程序异常退出时自动dump
但更为重要的,为了准确还原应用故障的现场,最好通过指定java 执行参数,在程序出错时,自动dump
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<file-or-dir-path>
如何分析内存dump
获取到dump文件后,需要使用eclipse.org 出品的 Memory Analyzer 工具。使用其中的Dominator Tree,查看各对象的内存占用情况
找出占用内存最多的对象及其类信息
以上就是排查Java应用内存泄漏问题的步骤的详细内容,更多关于Java应用内存泄漏的资料请关注我们其它相关文章!
相关推荐
-
Java中由substring方法引发的内存泄漏详解
内存溢出(out of memory ) :通俗的说就是内存不够用了,比如在一个无限循环中不断创建一个大的对象,很快就会引发内存溢出. 内存泄漏(leak of memory) :是指为一个对象分配内存之后,在对象已经不在使用时未及时的释放,导致一直占据内存单元,使实际可用内存减少,就好像内存泄漏了一样. 由substring方法引发的内存泄漏 substring(int beginIndex, int endndex )是String类的一个方法,但是这个方法在JDK6和JDK7中的实现是完全
-
java OOM内存泄漏原因及解决方法
前言 这篇文章主要介绍了java OOM内存泄漏原因及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.什么是OOM OOM,全称"Out Of Memory",翻译成中文就是"内存用完了",当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error 二.为什么会OOM.出现的原因是什么 为什么会没有内存了呢?原因不外乎有两点: ① 分配的少了:比如虚拟机本身可
-
解析Java的JNI编程中的对象引用与内存泄漏问题
JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互--在 Java 程序中调用 native code:在 native code 中嵌入 Java 虚拟机调用 Java 的代码. JNI 编程在软件开发中运用广泛,其优势可以归结为以下几点: 利用 native code 的平台相关性,在平台相关的编程中彰显优势. 对 native code 的代码重用. native code 底层操作
-
Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解
前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学习一下如何解决RxJava引起的内存泄漏,就查到了利用Rxlifecycle开源框架可以解决,今天周末就来学习一下如何使用Rxlifecycle. 引用泄漏的背景: RxJava作为一种响应式编程框架,是目前编程界网红,可谓是家喻户晓,其简洁的编码风格.易用易读的链式方法调用.强大的异步支持等使得R
-
一次 Java 内存泄漏的排查解决过程详解
由来 前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理.Bug 排查.运营 issue 处理的事.工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了. 不知道是公司网络广了就这样还是网络运维组不给力,网络总有问题,不是这边交换机脱网了就是那边路由器坏了,还偶发地各种超时,而我们灵敏地服务探测服务总能准确地抓住偶现的小问题,给美好的工作加点料.好几次值班组的小伙伴们一起吐槽,商量着怎么避过服务保活机制,偷偷停了探测服务而不让人发现(虽然也并不敢). 前些天我就在周末
-
Java虚拟机内存溢出与内存泄漏
一.基本概念 内存溢出:简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,于是就发生了内存溢出. 内存泄漏:内存泄漏指程序运行过程中分配内存给临时变量,用完之后却没有被GC回收,始终占用着内存,既不能被使用也不能分配给其他程序,于是就发生了内存泄漏. 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory: 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间
-
Java DWR内存泄漏问题解决方案
机器跑了一晚上,发现有崩溃现象,由于页面内有动态绘图功能,我怀疑是绘图原因,但是今天上午有人提醒我才想到,是不是间隔调用时DWR产生了内存泄漏问题? 网上查了一下貌似大家都在讨论这个问题,之前我也挺老手说过DWR有内存问题,可是没有遇到过.原来DWR在间隔调用这种情况下会有问题! 按照大家的说法,修改engine.js配置文件来解决问题,目前我也修改了一下,修改方法如下: 在 dwr.engine._sendData = function(batch) {} 内有,这样几行代码: // Get
-
macOS上使用gperftools定位Java内存泄漏问题及解决方案
这几天在排查一个堆外内存泄漏的问题时看到很多人都提到了gperftools这个神器,想要尝试一下结果发现它对macOS的支持不太友好.而且大多数教程是针对C++的,里面的一通编译链接的操作看得我个Java仔眼花缭乱的.所以我在这里整理一份mac和Java版的使用教程,免得大家再来踩坑了. 一.简介 gperftools是google提供的一套分析工具,包括堆内存检测heap-profiler,内存泄漏分析工具heap-checker和CPU性能监测工具cpu-profiler.众所周知堆外内存的
-
深入理解Java垃圾回收机制以及内存泄漏
前言 在segmentfault上看到一个问题:java有完善的GC机制,那么在java中是否会出现内存泄漏的问题,以及能否给出一个内存泄漏的案例.本问题视图给出此问题的完整答案. 垃圾回收机制简介 在程序运行过程中,每创建一个对象都会被分配一定的内存用以存储对象数据.如果只是不停的分配内存,那么程序迟早面临内存不足的问题.所以在任何语言中,都会有一个内存回收机制来释放过期对象的内存,以保证内存能够被重复利用. 内存回收机制按照实现角色的不同可以分为两种,一种是程序员手动实现内存的释放(比如C语
-
Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)
Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收.最近自己阅读了大量相关的文档资料,打算做个 总结 沉淀下来跟大家一起分享和学习,也给自己一个警示,以后 coding 时怎么避免这些情况,提高应用的体验和质量. 我会从 java 内存泄漏的基础知识开始,并通过具体例子来说明 Android 引起内存泄漏的各种原因,以
-
Java内存泄漏问题处理方法经验总结
JVM问题,一般会有三种情况,目前遇到了两种,线程溢出和JVM不够用 1.线程溢出:unable to create new native thread 1.1问题描述: 系统在1月4号左右,突然发现会产生内存溢出问题,从日志上看,错误信息为: 导致系统不能使用,对外不能相应,但是观察gc等又处于正常情况,free 系统内存也正常.开始重启机器进行解决,真正的原因查找,过程比较坎坷,经历也比较痛苦. 1.2 问题解决 pstree查看线程数,发现系统线程数不断增长,直到OOM. 命令:pstre
随机推荐
- Spring依赖注入的三种方式实例详解
- IOS React Native FlexBox详解及实例
- 灵活实用的VBS入门教程基础篇
- jQuery使用zTree插件实现树形菜单和异步加载
- PHP多线程类及用法实例
- PHP Socket网络操作类定义与用法示例
- C#基于正则表达式实现获取网页中所有信息的网页抓取类实例
- php实现文件下载功能的几个代码分享
- 用JSP实现的一个日历程序
- Javascript中click与blur事件的顺序详析
- Linux命令搜索命令whereis与which的区别
- sqlserver数据库优化解析(图文剖析)
- Jq通过td获取同行其它列td的方法
- 利用Bootstrap实现表格复选框checkbox全选
- 了解Android OpenGLES2.0(一)
- 不使用myeclipse注册机得到myeclipse注册码的方法(myeclipse序列号)
- SQL中一些小巧但常用的关键字小结
- 新手简单了解vue
- python 计算一个字符串中所有数字的和实例
- 浅谈目前可以使用ES10的5个新特性