添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

异常导致-Xms或-Xmx配置不足

  • 使用了大量的递归或无限递归对象
  • 使用了大量循环或死循环(循环中用到了大量的新建的对象)
  • 使用了向数据库查询过多,可能会造成内存溢出。
  • 有数组,List,Map中存放的是对象的引用而不是对象,这些引用会让对应的对象不能被释放。会大量存储在内存中。

2.Java栈内存异常

Exception in thread "main" java.lang.StackOverflowError

对象过大或过多异常,导致-Xss配置的内存不足

  • 是否有递归调用
  • 是否有大量循环或死循环
  • 全局变量是否过多
  • 数组、List、map数据是否过大

3.方法区内存异常

Exception in thread "main" java.lang.OutOfMemoryError: Metaspace

异常导致-XX:MetaspaceSize或-XX:MaxMetaspaceSize配置不足

1、当不通过日志文件主观来判断出问题代码时,通过分析dump文件来分析

2、Arthas工具分析-见下篇分析

生成dump文件三种方式

1.jvisualvm控制台,监控时主动生成dump文件

2.使用jmap命令生成dump文件

  • windows环境:jmap -dump:live,format=b,file=heap.hprof <pid>
  • linux环境:./jmap -dump:live,format=b,file=heap.hprof <pid>

3.在应用启动时配置添加 -XX:+HeapDumpOnOutOfMemoryError 参数,

当应用抛出OutOfMemoryError 时自动生成dump文件;目录指定:XX:HeapDumpPath

[zoms@ocs ~]$ jmap -dump:live,format=b,file=heap-vm.hprof 15463
Dumping heap to /home/zoms/heap-vm.hprof ...
Heap dump file created

dump生成

jvisualvm本地方式

1.启动jvisualvm

在jdk1.8安装目录下,${JDK_HOME}\bin\jvisualvm.exe,双击启动Java VisualVM控制台

2.应用程序启动

模拟OOM代码

* @Description * @Auther: huhua * @Date: 2021/3/4 @Slf4j public class TestDump { public static void main(String[] args) throws Exception { Integer size = 1024 * 1024 * 8 ; List<byte[]> list = new ArrayList<byte[]>(); for(int a=1; a<1000; a++){ Thread.sleep(1000); list.add(new byte[size]); log.info("JMV测试:list写入{}M", a*8);

3.从jvisualvm控制台,进入监控应用程序面板

可查看到本地运行java应用,选择应用进入

4.模拟OOM

  • 点击“堆Dump”或在应用上右击选择生成快照文件。
  • 可用MAT工具去分析dump文件

1.查找到进程相关:top -c

也可jps 或ps -ef|grep java 或 ll /proc/<pid> 找到相关java进程

2.查看堆gc每秒相关信息

调优YGC的次数非常少,FGC更少:jstat -gc <pid> 1000(每隔ms数)

3.查找栈相当问题

使用命令 jstack -l 1346 查看线程栈信息,锁问题

4.有必要时,使用命令生成jmap文件

jmap -dump:live,format=b,file=/xx/xxx/xxx.hprof <pid>

ps:该命令对正在运行应用会产生影响,要谨慎使用,生产环境考虑arthas,具体可参见arthas分析。

5.下载dump文件,使用MAT工具/jhat分析。

其它辅助命令

  • 查看gc回收统计情况:jstat -gc pid 1000(每隔ms数) 5(输出次数)
  • 查看内存使用情况:jmap -heap pid
  • 查看内存中对象数据:jmap -histo:live <pid> | more

dump分析

MAT工具分析dump文件

下载:http://www.eclipse.org/mat/downloads.php

解压后,点击MemoryAnalyzer.exe启动

2.加载dump文件

3.加载完成

4.分析结果

从图看有三个problem,依次往下查看各个problem

点击Details查看problem具体描述

点击如下图标可切换到Class Name视图

jhat命令分析dump文件

1.启动jhat

jhat -port <port> <file> [zoms@ocs ~]$ jhat -port 8035 heap-vm.hprof Reading from heap-vm.hprof... Dump file created Fri Mar 05 15:30:57 CST 2021 Snapshot read, resolving... Resolving 239638 objects... Chasing references, expect 47 dots............................................... Eliminating duplicate references............................................... Snapshot resolved. Started HTTP server on port 8035 Server is ready.

2.访问分析

  1. 通过http://ip:port来访问分析控制台,可以查询到所有的目录下类及对象
  1. 在页面最下方也提供其它方式查询
  • 展示堆快照直方图:Show heap histogram

通过对象,可查询到对象的异常,如大小异常

  • 使用OQL查询:Execute Object Query Language (OQL) query

可使用特殊语法查询。可以在OQL help处模仿编写

目录内存泄露内存溢出1.Java堆内存异常报错方式原因2.Java栈内存异常报错方式原因3.方法区内存异常报错方式原因解决思路生成dump文件三种方式dump生成jvisualvm本地方式1.启动jvisualvm2.应用程序启动3.从jvisualvm控制台,进入监控应用程序面板4.模拟OOM线上模式1.查找到进程相关:top -c2.查看堆gc每秒相关信息3.查找栈相当问题4.有必要时,使用命令生成jmap文
在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。 heap d
系统上线后,系统可能会出现一些迟钝、卡死现象,这个时候就需要我们对系统进行性能方面的优化。本文将大概介绍一下,性能问题的解决思路,以及一次应用系统操作缓慢的分析实操。 一、定位问题方向 首先,查看服务器CPU使用率,磁盘IO以及内存使用情况 1.占用内存几乎等于JVM参数中分配的内存大小,而且长时间处于这种状态的话,应该是程序中可能存在内存泄漏的问题,或者JVM参数设置不合适,从这方面入手。这方面...
刚刚做完了一个项目的性能测试,“有幸”也遇到了内存泄露的案例,所以在此和大家分享一下。主要从以下几部分来说明,关于内存和内存泄露、溢出的概念,区分内存泄露和内存溢出;内存的区域划分,了解GC回收机制;重点关注如何去监控和发现内存问题;此外分析出问题还要如何解决内存问题。下面就开始本篇的内容:第一部分概念众所周知,java中的内存java虚拟机自己去管理的,他不想C++需要自己去释放。笼统地去讲,java的内存分配分为两个部分,一个是数据堆,一个是栈。程序在运行的时候一般分配数据堆,把局部的临时的变量都放进去,生命周期和进程有关系。但是如果程序员声明了static的变量,就直接在栈中运行的,进程
OOM全称”Out Of Memory”,即内存溢出内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出内存溢出产生原因多种多样,当内存严重不足时,内核有两种选择: 直接panic 杀掉部分进程,释放一些内核。 大部分情况下,会杀掉导致OOM的进程,然后系统恢复。通常我们会添加对内存的监控报警,例如:当memory或swap使用超过90%时,触发报警通知,需要及时介入排查。 如果已经出现OOM,则可以通过dmesg命令查看,CentOS7版本以上支持 -T选项,能将时间戳转成时
现网环境,难免发生内存溢出(Out Of Memory),那发生内存溢出时,我们想知道当时发生了什么,是什么原因导致了内存溢出。这时候就需要生成dump文件,dump文件是JVM的快照。那要怎么生成dump文件呢? 这时候,就需要在项目的启动命令(或者shell脚本)添加一些启动参数,如果发生OOM,即刻生成dump。接下来讲一下,如何设置的问题。 设置如下2个参数即可: -XX:+He...
Dump 就是对程序运行时内存上的信息进行转储, 让我们可以查看程序当时的运行情况. Dump 对于调优和排错是非常有用的工具. Heap Dump Java 运行时对象分配在堆内存上, Heap dump 就是对堆内存进行转储. 通过命令jmap -dump:live,format=b,file=***.hprof pid eg:jmap -dump:live,format=b,...
1. Spark中JVM内存使用及配置详情: Spark中的JVM内存使用主要包括堆内存和非堆内存。堆内存用于存储对象实例,而非堆内存用于存储类信息、方法信息等。在Spark中,可以通过以下参数来配置JVM内存使用: - spark.driver.memory:用于配置Driver进程的堆内存大小,默认为1g。 - spark.executor.memory:用于配置Executor进程的堆内存大小,默认为1g。 - spark.driver.extraJavaOptions:用于配置Driver进程的非堆内存大小和其他JVM参数。 - spark.executor.extraJavaOptions:用于配置Executor进程的非堆内存大小和其他JVM参数。 2. Spark报错与调优: 在Spark运行过程中,可能会出现各种报错,如内存溢出、任务失败等。针对这些报错,可以采取以下调优措施: - 内存溢出:增加Executor进程的堆内存大小、减少每个任务的数据量、使用缓存等方式来减少内存使用。 - 任务失败:增加Executor进程的数量、减少每个任务的数据量、调整任务的并行度等方式来提高任务的执行效率。 3. Spark内存溢出OOM异常: Spark内存溢出OOM异常是指Executor进程的堆内存不足以存储当前任务所需的数据,导致任务执行失败。可以通过增加Executor进程的堆内存大小、减少每个任务的数据量、使用缓存等方式来减少内存使用,从而避免内存溢出异常的发生。