程序员知识图谱-Java 内存溢出的排查方法
内存溢出分类
Java 里面内存溢出主要分以下几种:
堆溢出
1、内存溢出(无法申请到内存) jstat 查看内存使用情况,检查堆参数,一般是申请的内存太大,比如一个特别大的 byte 数组
2、内存泄漏(对象无法回收) 可以使用 MAT 工具里面的 Path to GC Roots 定位,一般是一个特大不能回收的对象
栈溢出
- StackOverflowError 方法调用层次太深,内存不够新建栈帧,比如一个没有结束条件的递归
- OutOfMemoryError 线程太多,内存不够新建线程
MetaSpace 数据区溢出
动态生成大量 Class
本地直接内存溢出
申请一个大的直接内存
数据超限内存溢出
分配的数据结构在此平台不可寻址
排查方法
JDK 自带命令
jstat -gcutil 33816 250 20 # 监控 jvm 的内存使用情况
jps -ml # 输出虚拟机启动时传递给主类 main() 的参数,输出主类的全名
jmap -F -dump:live,format=b,file=dump.bin 85962 # dump 堆内存
# 分析方法
# 可以使用 VisualVM,主要查看是否存在大对象,然后分析为什么没有被回收
jstack -F -l -m 85962 # 显示虚拟机快照
jstack -l PID >> test.txt
jmap -histo pid # 实时查看JVM对象大小的排序结果,但无法看到对象的具体内容
Arthas
# 找到最耗CPU的方法
thread -n 5
# 观察方法的返回
watch com.test.MyClass query returnObj
# 反编译类
jad com.test.MyClass
# 监控调用情况
monitor -c 5 com.test.MyClass query
# 查看分段的调用时间
trace com.test.MyClass query
# 查看方法完整的调用链
stack com.test.MyClass query
# 记录调用现场
tt -t com.test.MyClass query
参数检查
-Xms 初始堆大小
-Xmx 最大堆大小
-Xmn 新生代大小
XX:MaxMetaSpaceSize 元数据区大小
Survivor Eden与Survivor区的大小比值
本文亦通过 NoOne 的个人博客 发表。
程序员知识图谱-Java 内存溢出的排查方法相关推荐
- Java内存溢出问题排查分析
目录 前言 一.MAT(Memory Analyzer Tool) 二.软件初识 三.捕获dump文件 1.主动方式 2.被动方式 四.分析dump文件 总结 前言 项目运行过程中,我们可能会遇到Ja ...
- jvm 内存溢出问题排查方法
如果你做TCP通讯或者map集合操作,并发处理等功能时,很容易出现 Java 内存溢出的问题.本篇文章,带领大家深入jvm,分析并找出jvm内存溢出的代码. jvm中除了程序计数器,其他的区域都有可能 ...
- java内存溢出怎么排查_【转】Java学习---内存溢出的排查经历
前言 OutOfMemoryError 问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界.空指针等)来说这类问题是很难定位和解决的. 本文以最近碰到的一次线上内存溢出的定位.解决问题的方式展开 ...
- 基于Java内存溢出的解决方法详解
一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建:非堆 ...
- java内存溢出怎么排查_java线上内存溢出问题排查步骤
一般线上遇到比较头疼的就是OOM内存溢出问题,我们都会先看错误日志,如果错误日志能够定位出哪个类对象导致内存溢出,那么我们只需要针对问题修改bug就好.但是很多时候我们单凭日志无法定位出内存溢出问题, ...
- Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
导致OutOfMemoryError异常的常见原因有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码 ...
- Java内存泄漏的排查
1.内存溢出 一种通俗的说法. 1.内存溢出:你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,出现溢出. 2.内存泄漏:你用new申请了一块内存,后来很长时间都不再使用了(按理应该 ...
- java代码耗尽内存_有关Java内存溢出及内存消耗的小知识
内存溢出原理: 我们知道,Java程序本身是不能直接在计算机上运行的,它需要依赖于硬件基础之上的操作系统和JVM(Java虚拟机). Java程序启动时JVM都会分配一个初始内存和最大内存给这个应用程 ...
- C程序员必须知道的内存知识【英】
C程序员必须知道的内存知识[英] 时间 2015-03-08 14:16:11 极客头条原文 http://marek.vavrusa.com/c/memory/2015/02/20/memory/ ...
最新文章
- static_cast, dynamic_cast, const_cast
- C++二叉树的建立与遍历
- bzoj 3218: a + b Problem
- BeanPostProcessor 源码
- C#学习笔记——25个经典问题
- oracle 主键删除,联合主键的创建
- linux 优先级必须为整数,进程友好性(优先级)设置对Linux没有影响
- 华为的鸿蒙系统和苹果的操作系统有什么区别?
- leftjoin多表联合查询_结合mybatis-plus 实现无XML多表联合查询
- Ant十五大最佳实践
- Eclipse下载与安装
- 妙啊!巧用 SSH 突破限制穿透内网
- [洛谷]P2298 Mzc和男家丁的游戏 题解
- wegame饥荒一直登录中_LOL登录遇到预期之外的错误(用wegame登录出现错误而用客户端登录可以的解决方法)!亲测有效!...
- 许奔创新社-第56问:创意洞见的基础是什么?
- 【深度学习】语义分割:论文阅读:(2021-12)Mask2Former
- Stack Overflow技术报告给开发者哪些启示
- Java ArrayList中retainAll()方法具有什么功能呢?
- bat文件中,mvn和ant命令后面的命令不执行
- 通过meta代码强制浏览器使用WebKit内核极速模式(解决 meta name=renderer content=webkit 不起作用)