首页
学习
活动
专区
工具
TVP
发布

OOM内存溢出原因分析

场景 线上解析上传PDF的定时任务一直在执行状态,没有结束掉,查看服务日志没有抛出异常,在服务器上发现生成了hpvof文件(VM配置参数-XX:+HeapDumpOnOutOfMemoryError)。...需要的工具 这里借助一下JProfiler这个工具,我使用的编辑器是idea,可以在里面安装JProfiler插件,如下图所示, 然后去下载一个JProfiler工具,安装到本地。...接着在插件里面配置一下这样方便以后运行程序的时候实时运营JProfiler,如下图所示: 分析文件 打开JProfiler软件>>点击session>>选open Snapshot,加载hpvof...这里是通过pdfbox的jar读取pdf文件,并进行加密等操作,猜测可能是pdf文件过大导致,通过实际测试发现170M的文件在解析过程中内存持续增长,该jar包的内存回收可能存在一定的问题。

87220
您找到你想要的搜索结果了吗?
是的
没有找到

jmap及内存溢出分析

前面通过jstat可以对jvm堆的内存进行统计分析,而 jmap 可以获取到更加详细的内容,如:内存使用情况的汇总、对内存溢出的定位与分析。...通过MAT工具对dump文件进行 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗...查看可能存在内存泄露的分析: ? 内存溢出的定位与分析 内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文 件等等,都可能会造成内存溢出。...首先,我们得先学会如何定位问题,然后再进行分析。如何定位问题呢,我们需要借助于jmap与MAT工具进行定位分析。 接下来,我们模拟内存溢出的场景。...可以看到,当发生内存溢出时,会dump文件到java_pid5348.hprof。 导入到MAT工具中进行分析 ? 可以看到,有91.03%的内存由Object[]数组占有,所以比较可疑。

1.7K20

从main方法分析内存溢出

内存溢出OutOfMemoryError不常遇到,起码没有姨妈空指针异常(NullPointerException)来的那么频繁。 现在就用最简单的main方法复现堆内存溢出并做分析。...eden)和两个幸存区(from、to)) 当java对象在年轻代存活一段时间经历过N次回收没有被回收掉后(N还可以自己设置),就会进入老年代,在老年代中又经历回收后积累的没有被回收的对象超负荷后就会抛出内存溢出的异常...GC日志的网站上,这个可视化工具可以帮我们更直观的欣赏GC的情况。...分析内存快照 想要更详细的分析还得生成内存快照,同样添加启动参数 参数 说明 -XX:+HeapDumpOnOutOfMemoryError 开启内存快照 -XX:HeapDumpPath=./ 存储路径...当然仅限于代码需要优化的情况,如果没有需要优化的还出现这种异常,就需要增大堆内存的空间-Xms-Xmx两个参数。 如果还不行就需要结合上面两个工具分析,做出更细化的调整。

76420

jvm内存溢出分析内存溢出是什么?内存溢出内存泄漏有什么区别?用到的jvm参数分析解决方法分析

概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么?...,并提示发生在Java heap space 分析解决方法 思路 用visualVM工具分析堆快照 如果发生内存泄漏: step1:找出泄漏的对象 step2:找到泄漏对象的GC Root step3...分析内存快照我建议用jdk自带的可视化监视工具visualVM,位置在jdk安装目录下的bin,如果是在linux环境的话,可以把快照传到window。...因为分析工具会占用很大的内存,不建议在服务端进行分析。 实战 下面对刚才程序产生的堆内存快照进行分析。 打开visualVM,装入刚刚生成的快照,打开类标签页 ?...解决方案: 在应用服务器中建立一个共享lib库,把项目中常用重复的jar包存放在这里,项目从这里加载jar包,这样就会大大减少类加载的数量,方法区也“瘦身”了 如果实在不能瘦身类的话,那可以扩大方法区的容量

1.6K61

Java常见内存溢出异常分析

,我们需要根据内存溢出的时候产生的dump文件来具体分析(需要增加-XX:+HeapDumpOnOutOfMemoryErrorjvm启动参数)。...出现此种问题的时候有可能是内存泄露,也有可能是内存溢出了。 如果内存泄露,我们要找出泄露的对象是怎么被GC ROOT引用起来,然后通过引用链来具体分析泄露的原因。...如果出现了内存溢出问题,这往往是程序本生需要的内存大于了我们给虚拟机配置的内存,这种情况下,我们可以采用调大-Xmx来解决这种问题。...通过上面的实验其实也从侧面验证了一个结论:当对象大于新生代剩余内存的时候,将直接放入老年代,当老年代剩余内存还是无法放下的时候,出发垃圾收集,收集后还是不能放下就会抛出内存溢出异常了 持久带溢出(OutOfMemoryError...使用一些应用服务器的热部署的时候,我们就会遇到热部署几次以后发现内存溢出了,这种情况就是因为每次热部署的后,原来的class没有被卸载掉。

1.1K70

Jvm中各种内存溢出情况分析

上图中每个区域都可能出现oom,除此之外还有直接内存(direct memory)溢出。...堆溢出 java堆用于存储对象实例,只要不断地产生对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量达到最大堆的容量限制后就会产生内存溢出异常。...可达性分析算法 判断对象是否可以回收采用的是可达性分析算法,只要被gc roots引用的对象就不会被回收。那么gc root有那几种?...通过mat内存分析工具打开dump出来的文件,如果是内存泄漏,查看泄漏对象到gc roots的引用链,找到泄漏对象是通过怎样的路径与gc roots相关联并导致垃圾收集器无法自动回收它们的,就能比较准确定位出泄漏代码的位置...关于虚拟机栈和本地方法栈的溢出,在Java虚拟机规范中描述了两种异常: 线程执行深度大于虚拟机所允许的深度时,将抛出StackOverflowError 如果虚拟机在扩展栈时无法申请到足够的内存空间,将抛出

91330

Java内存溢出OOM使用Mat分析

20m,程序不停的创建对象,而对象又是在堆上分配内存,一直不停的向List中添加对象,没有垃圾回收,导致堆内存溢出(OutOfMemoryError)....Mat工具分析堆 1.下载Mat分析软件:https://www.eclipse.org/mat/downloads.php 2.VM参数加上: -XX:+HeapDumpOnOutOfMemoryError...开启堆内存溢出导出堆内存到文件,默认在项目的根目录下.如果需要指定其它路径用-XX:HeapDumpPath=/tmp,会生成一个名字类似的java_pid28790.hprof文件. 3.使用Mat打开...List res=new ArrayList(); res是局部变量,在栈上分配内存,res中存放的是UserTest实例对象的堆内存地址(引用),JDK1.8中打开指针压缩(-...Retained Heap=112424+224848=337296和Mat分析的结果一致. 相关文章 JVM,JRE,JDK之间的区别和联系

53510

生产环境JVM内存溢出案例分析

本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法。 案例:架构组接到某项目组反馈,Zabbix监控上显示JMX不可用,请求协助处理。...分析思路: JMX不可用,往往是由于垃圾回收时间停顿时间过长、内存溢出等问题引起的。 线上故障分析的原则是首先要采取措施快速恢复故障对业务的影响,然后才是采集信息、分析定位问题,并最终给出解决办法。...分析解决问题 首先可以通过查看日志,确定是哪种内存溢出,堆内存溢出可发生的地方:Java heap space(堆空间)、perm space(持久代)。 ?...分析Dump文件 在获取Dump文件后,可以使用工具MAT(MemoryAnalyzer)进行分析,该工具大家可以通过百度自行下载。 使用MAT打开Dump文件后,首页截图如下: ?...工具按钮介绍: 内存直方图:将堆中所有的内存消耗情况统计出来,其如图所示: ? 内存使用树状结构:以线程为维度,树状形式展开,如图所示: ? 线程栈:其截图如下: ? ?

2.5K20

Java内存溢出

Java内存溢出溢出 大量对象占据了堆空间,而且这些对象是强引用,导致无法回收 直接内存溢出 Java的NIO支持直接内存使用,从堆外获得内存空间,由于直接内存没有被Java虚拟机完全托管,若使用不当...,容易触发直接内存溢出。...多线程导致内存溢出 线程的栈空间也是在堆外分配的,和直接内存相似,线程过多,会导致内存溢出。 永久区溢出 永久区是存放元数据的区域。如果定义了太多类型,那么永久区有可能溢出。...GC效率低下引起内存溢出 内存回收时,如果GC效率低下,那么系统的性能会收到严重的影响。...如果系统堆空间太小,那么GC所占的时间就会较多,并且回收所释放的内存就会较少, 根据GC所占用的系统时间,以及释放的内存大小,虚拟机会评估GC的效率,一旦认为GC的效率过低,就会抛出内存溢出异常。

2.5K20

内存溢出内存泄露

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。...内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。...内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。...这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出....但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

3.9K10

JVM实战:内存溢出的定位与分析

文章目录 模拟内存溢出 运行测试 导入到MAT工具中进行分析 内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文件等等,都可能会造成内存溢出。...如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并且进行分析,是正常还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需求,那么就要对代码进行修改,修复这个bug。...首先,我们得先学会如何定位问题,然后再进行分析。如何定位问题呢,我们需要借助于jmap与MAT工具进行定位分析。 接下来,我们模拟内存溢出的场景。...模拟内存溢出 编写代码,向List集合中添加100万个字符串,每个字符串由1000个UUID组成。如果程序能够正常执行,最后打印ok。...导入到MAT工具中进行分析 可以看到,有88.22%的内存由Object[]数组占有,所以比较可疑。 分析:这个可疑是正确的,因为已经有88%的内存都被它占有,这是非常有可能出现内存溢出的。

35820

深入理解Java中的内存溢出内存溢出内存溢出的几种情况(OOM 异常)导致内存溢出的原因内存溢出的解决方法

内存溢出 程序运行过程中无法申请到足够的内存而导致的一种错误。...出现这种异常, 一般手段是先通过内存映像分析工具(如 Eclipse Memory Analyzer)对 dump 出来的堆转存快照进行分析, 重点是确认内存中的对象是否是必要的, 先分清是因为内存泄漏...如果是内存泄漏, 可进一步通过工具查看泄漏对象到 GC Roots 的引用链。于是就能找到泄漏对象是通过怎样的路径与 GC Roots 相关联并导致垃圾收集器无法自动回收。...第三步, 对代码进行走查和分析, 找出可能发生内存溢出的位置。...第四步, 使用内存查看工具动态查看内存使用情况(Jconsole) 基本上如果抛出 OutOfMemory 有两种原因: 1.内存泄露。 2.应用程序本身 就是需要这么多的内存

2.7K10

内存溢出排查

继续...... 3、 内存调优,减小xss值、JVM内存,仍然解决不了。      ...TestNativeOutOfMemoryError.java:20)   问题重现,在反复运行几次后发现,生产系统最大只能创建980多个线程,生产系统操作系统64位centeros,jdk1.7,64G内存...$ su Bst118   $ ulimit -u   $ 1024   生产上所有程序都是在Bst118账户下运行,于是查看该账户下所有的线程数总和为950,也即是说,随时都可能会超过1024,导致内存溢出...于是增加一条:Bst118     soft    nproc     20000   为什么设置为20000,因为测试后发现,在运行到35000左右,系统就报内存溢出了,操作系统所有命令都不能使用,因此将程序最大线程数限制在...修改后再没出现内存溢出错误。问题解决。 三、思考   1、经过总结,在遇到问题后,不能盲目的到处修改,首先要做的就是重现问题,顺藤摸瓜,逐步的找出根本原因。

17040
领券