内存溢出分类

Java 里面内存溢出主要分以下几种:

堆溢出

1、内存溢出(无法申请到内存) jstat 查看内存使用情况,检查堆参数,一般是申请的内存太大,比如一个特别大的 byte 数组

2、内存泄漏(对象无法回收) 可以使用 MAT 工具里面的 Path to GC Roots 定位,一般是一个特大不能回收的对象

栈溢出

  1. StackOverflowError 方法调用层次太深,内存不够新建栈帧,比如一个没有结束条件的递归
  2. 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 内存溢出的排查方法相关推荐

  1. Java内存溢出问题排查分析

    目录 前言 一.MAT(Memory Analyzer Tool) 二.软件初识 三.捕获dump文件 1.主动方式 2.被动方式 四.分析dump文件 总结 前言 项目运行过程中,我们可能会遇到Ja ...

  2. jvm 内存溢出问题排查方法

    如果你做TCP通讯或者map集合操作,并发处理等功能时,很容易出现 Java 内存溢出的问题.本篇文章,带领大家深入jvm,分析并找出jvm内存溢出的代码. jvm中除了程序计数器,其他的区域都有可能 ...

  3. java内存溢出怎么排查_【转】Java学习---内存溢出的排查经历

    前言 OutOfMemoryError 问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界.空指针等)来说这类问题是很难定位和解决的. 本文以最近碰到的一次线上内存溢出的定位.解决问题的方式展开 ...

  4. 基于Java内存溢出的解决方法详解

    一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建:非堆 ...

  5. java内存溢出怎么排查_java线上内存溢出问题排查步骤

    一般线上遇到比较头疼的就是OOM内存溢出问题,我们都会先看错误日志,如果错误日志能够定位出哪个类对象导致内存溢出,那么我们只需要针对问题修改bug就好.但是很多时候我们单凭日志无法定位出内存溢出问题, ...

  6. Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

    导致OutOfMemoryError异常的常见原因有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码 ...

  7. Java内存泄漏的排查

    1.内存溢出 一种通俗的说法. 1.内存溢出:你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,出现溢出. 2.内存泄漏:你用new申请了一块内存,后来很长时间都不再使用了(按理应该 ...

  8. java代码耗尽内存_有关Java内存溢出及内存消耗的小知识

    内存溢出原理: 我们知道,Java程序本身是不能直接在计算机上运行的,它需要依赖于硬件基础之上的操作系统和JVM(Java虚拟机). Java程序启动时JVM都会分配一个初始内存和最大内存给这个应用程 ...

  9. C程序员必须知道的内存知识【英】

    C程序员必须知道的内存知识[英] 时间 2015-03-08 14:16:11 极客头条原文  http://marek.vavrusa.com/c/memory/2015/02/20/memory/ ...

最新文章

  1. static_cast, dynamic_cast, const_cast
  2. C++二叉树的建立与遍历
  3. bzoj 3218: a + b Problem
  4. BeanPostProcessor 源码
  5. C#学习笔记——25个经典问题
  6. oracle 主键删除,联合主键的创建
  7. linux 优先级必须为整数,进程友好性(优先级)设置对Linux没有影响
  8. 华为的鸿蒙系统和苹果的操作系统有什么区别?
  9. leftjoin多表联合查询_结合mybatis-plus 实现无XML多表联合查询
  10. Ant十五大最佳实践
  11. Eclipse下载与安装
  12. 妙啊!巧用 SSH 突破限制穿透内网
  13. [洛谷]P2298 Mzc和男家丁的游戏 题解
  14. wegame饥荒一直登录中_LOL登录遇到预期之外的错误(用wegame登录出现错误而用客户端登录可以的解决方法)!亲测有效!...
  15. 许奔创新社-第56问:创意洞见的基础是什么?
  16. 【深度学习】语义分割:论文阅读:(2021-12)Mask2Former
  17. Stack Overflow技术报告给开发者哪些启示
  18. Java ArrayList中retainAll()方法具有什么功能呢?
  19. bat文件中,mvn和ant命令后面的命令不执行
  20. 通过meta代码强制浏览器使用WebKit内核极速模式(解决 meta name=renderer content=webkit 不起作用)

热门文章

  1. PHP基础——相册管理系统的实现
  2. IDEA 查看所有断点/跳过所有断点/删除所有断点
  3. Python 网络爬虫实战:采集《电影天堂》上万部动作片电影
  4. 开源溯源防伪、一物一码系统助力大中小微企业低成本数字化转型
  5. macOS pyinstaller 打包之后运行报 Error loading Python lib
  6. 1天设计500+作品,Midjourney ai绘画将改变包装设计
  7. R语言logistic回归交互项(交互作用)的可视化分析2
  8. 互联网行业的鄙视链之装逼与反装逼
  9. 房地产营销19讲之读书笔记
  10. 用Python处理文件的实用姿势