java内存溢出定位
一、内存溢出问题分类
- 瞬时流量过大造成的创建大量对象
- 内存泄漏导致的内存溢出,一般就是程序编码的BUG引起的
二、内存泄漏问题分析
- step1: 收集内存泄漏的堆内存异常日志
> 添加HeapDumpOnOutOfMemoryError 和 HeapDumpPath两个参数开启堆内存异常日志:java -jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -Xms4g -Xmx4g -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/tmp/heapTest.log sinaif-XX .jar
- step2: 采用系统Linux命令top 查看Java进程内存使用情况;看下这个内存占用情况;举例:系统内存为8G,启动堆内存分配4G, 通过top命令看下Java进程内存占用是否超过50%
- step3:再通过 top -Hp pid 查看具体线程占用系统资源
- step4: 通过jstack pid 查看具体线程的堆栈信息,排除是否有死锁或者I/O阻塞的问题(检查CPU的使用率和负载情况)
- step5:通过 jmap -heap pid 查看堆内存的使用情况,看下老年代的内存是否没有可分配空间
- step6: 基本定位出内存泄漏后,具体分析看是什么对象引起的;
- step7:jmap -histo:live pid 查看存活对象数量,找出最大的5个对象进行分析
- step8: 把step1 设置的堆内存异常文件:heapdump.hprof 下载本地导入到Eclipse MAT 进行分析
- step9:导入MAT一般会有提示的:

点击进入到 Histogram 页面,可以查看到对象数量排序,我们可以看到 Byte[] 数组排在了第一位,选中对象后右击选择 with incomming reference 功能,可以查看到具体哪个对象引用了这个对象;
- step10:找到代码引用的地方,进行优化
java内存溢出定位的更多相关文章
- Java内存溢出定位和解决方案(new)
引起内存溢出的原因有很多种,列举一下常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据:2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收:3.代码中存在死循环 ...
- 老李案例分享:定位JAVA内存溢出
老李案例分享:定位JAVA内存溢出 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loadrunner的培 ...
- Java内存溢出的详细解决方案
本文介绍了Java内存溢出的详细解决方案.本文总结内存溢出主要有两种情况,而JVM经常调用垃圾回收器解决内存堆不足的问题,但是有时仍会有内存不足的错误.作者分析了JVM内存区域组成及JVM设置虚拟内存 ...
- java内存溢出的解决思路
原文地址:https://www.cnblogs.com/200911/p/3965108.html 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能 ...
- [转]Java内存溢出详解及解决方案
原文地址:http://blog.csdn.net/xianmiao2009/article/details/49254391 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是 ...
- JAVA内存溢出解析(转)
JAVA内存溢出解析(转) 核心提示:原因有很多种,比如: 1.数据量过于庞大:死循环 :静态变量和静态方法过多:递归:无法确定是否被引用的对象: 2.虚拟机不回收内存(内存泄漏): 说白了就是程序运 ...
- 模拟Java内存溢出
本文通过修改虚拟机启动参数,来剖析常见的java内存溢出异常(基于jdk1.8). 修改虚拟机启动参数Java堆溢出虚拟机栈溢出方法区溢出本机直接内存溢出 修改虚拟机启动参数 这里我们使用的是ID ...
- Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都 ...
- java内存溢出分析(二)
我们继续java内存溢出分析(一)的分析,点击Details>按钮,显示如下图,我们发现有一个对象数量达到280370216个,再点击其中的List objects 点击后,显示下图 至此,我们 ...
随机推荐
- Mongo Document 校验
Mongo Datamodel Validation mongo insert,update document时候的校验规则 指定validation rules new collection db. ...
- git简易指南
目录 工作流 初始化仓库 查看分支 添加和提交 推送改动 分支 重命名分支 更新与合并 替换本地改动 回滚 远程仓库 有用的贴士 GIT vs SVN 工作流 你的本地仓库由 git 维护的三棵&qu ...
- Word 查找替换高级玩法系列之 -- 制表符对齐人工目录
自己在Word中输入目录的时候是不是总也对不齐最右边的页码?这就是人工制作目录的不足之处了,但因着它能让我们更自由的发挥,所以还是得到了一些人的偏爱.那么问题来了,到底要怎么对齐这种人工目录呢? 1. ...
- C++:标准模板库map
一:介绍 map是STL的关联式容器,以key-value的形式存储,以红黑树(平衡二叉查找树)作为底层数据结构,对数据有自动排序的功能. 命名空间为std,所属头文件<map> 注意:不 ...
- Linux/ubuntu 心得
基本命令 有n个软件未被升级(有强迫症的,不爽的 apt-get dist-upgrade 更改主机名字 git 不要免密输入的话,可在当前工作目录执行 git config credential.h ...
- ndarray笔记
Numpy的介绍 1. Ndarray:N-dimensional array, N维数组 2. 一种由相同类型的元素组成的多维数组,元素数量是事先指定好的 例:建立Ndarray多维数组 nd ...
- 利用jwt生成token,用于http请求身份验证
前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...
- C++ STL 之 常用算法
#include <iostream> #include <vector> #include <algorithm> using namespace std; // ...
- C# 中 Linq 操作 DataTable
方法一:更简洁 Console.WriteLine(dt.Rows.OfType<DataRow>().First(x => x.Field<string>(" ...
- Oracle查看表之间的约束
----查看表约束 表格: user_constraints 查询外键约束条件 select ' select count(*) from '||TABLE_NAME||';'from user_co ...