精华内容
下载资源
问答
  • Java内存溢出排查过程

    2020-04-08 22:52:54
    今天看到了敖丙的一篇关于排查内存溢出的博文,是自己没有接触过的知识,所以仿照过程自己也实验了一遍学习这部分的一些知识! 首先我使用的是Windows电脑,所以查看堆空间的插件在这里! 1、先看自己电脑的堆...

    前言:

    今天看到了敖丙的一篇关于排查堆内存溢出的博文,是自己没有接触过的知识,所以仿照过程自己也实验了一遍学习这部分的一些知识!

    首先我使用的是Windows电脑,所以查看堆空间的插件在这里!
    在这里插入图片描述

    1、先看自己电脑的堆空间

    在这里插入图片描述

    2、下载Visual GC插件

    在这里插入图片描述

    3、执行相应的代码测试堆空间

    public class jvmController {
        private static final Integer K = 1024;
        public static void main(String[] args) {
            int size = K*K*8;
            List<byte[]> list = new ArrayList<>();
            for (int i = 0; i < K; i++) {
                System.out.println("写入数据"+(i+1)+"M");
                try {
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                list.add(new byte[size]);
    
            }
        }
    }
    

    4、通过Visual GC查看堆空间中的各个区域的占用情况(Eden区、Survivor区、老年代区)

    在这里插入图片描述

    5、程序执行一段时间可以看到堆空间的占用明显上升

    在这里插入图片描述

    6、查看dump文件的位置,然后通过mat工具查看dump文件

    下载mat
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    最后分析dump文件中出现的问题,已经定位到问题的所在。

    通过执行代码可以看到,执行到一定的次数就会出现OOM问题,此时程序也相应停止。
    在这里插入图片描述

    展开全文
  • java 内存溢出排查

    千次阅读 2018-05-26 20:28:16
    1,Java内存溢出包括:堆内存溢出和栈内存溢出 首先说下:内存溢出和内存泄露 内存溢出:out of memory 是指程序申请内存时没有足够的空间了 内存泄露: memroy leak,是指程序申请内存后,无法释放已申请的内存...

    1,Java内存溢出包括:堆内存溢出和栈内存溢出

    首先说下:内存溢出和内存泄露

    内存溢出:out of memory 是指程序申请内存时没有足够的空间了

    内存泄露: memroy leak,是指程序申请内存后,无法释放已申请的内存空间。

    内存泄露-》内存溢出

    堆内存溢出:

    排查方法:mat(memory analyzer tool)

    -vmargs:后面跟VM参数

    -Xms20M     -Xmx20M 堆内存的设置

    -XX:PermSize = 40M 非堆内存

    -XX:HeapDumpOnOutOfMemoryError :让虚拟机出现内存溢出时dump出此时的堆内存转储快照。

    -XX:HeapDumpOnCtrBreak

    -xss 设置栈内存

    获取转存储文件的方法:

    1.任务管理器

    2.jvisiualVM工具

    3.jmp,jconsole,jhat工具

    mat 查看内存使用情况

    (1)整体内存的消耗情况(overview)

    (2)分析可以对象

     

    优化从两个层面上来优化:

    (1)非代码层面:-Xms  -Xmx

    (2)代码层面

    内存溢出的几种方式:

    一. java堆溢出

    创建对象没有及时回收,

    1. dump出来堆转储快照 2. 使用MAT工具对dump出来的堆转储快照进行分析,重点是确认内存中得对象是否必要的,这样可以分清楚到底是出现了内存泄露(Memory Leak)还是内存溢出(Memory Overflow) 

    3. 如果是内存泄露,进一步通过MAT工具分析泄露对象到GC Roots的引用链。找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收的。 4. 如果不存在泄露,那么就是内存中得对象却是都还必须活着,就应当检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否可以调大

    二. 虚拟机和本地方法栈溢出

     

    在单线程下,无论是由于栈帧太小还是虚拟机栈容量太小,当内存无法分配的时候,虚拟机抛出的都是StackOverflowError异常。 在多线程下,通过不断的建立线程的方式可以产生内存溢出OutOfMemoryError异常。

    在多线程情况下,给每个线程分配的内存越大,越容易产生内存溢出异常。由于操作系统分配给每个进程的内存是有限的,32位的Windows限制为2GB。虚拟机提供了参数来控制Java堆和方法区的这两部分内存的最大值。剩余的2GB减去Xmx,再减去MaxPermSize,忽略掉很小的程序计数器内存。如果虚拟机进程本身耗费的内存不计算,剩下的内存就是有虚拟机栈和本地方法栈瓜分了。此时如果每个线程分配到的虚拟机栈容量越大,可以建立的线程数量自然就越少,建立线程时就越容易把剩下的内存耗尽。 如果建立过多线程导致的内存溢出,在不能减少线程数或者更换64位虚拟机的情况下,就只能通过减少最大堆或者减少栈容量来获取更多的线程。

    出现StackOverflowError的时候有错误堆栈可以读,即时加入+HeapDumpOnOutOfMemoryError也不会dump异常堆内存。

     

    三.   运行时常量池溢出(PermGen space)

     

     

    如果要项运行时常量池中添加内容,最简单的方法就是使用String.intern()这个Native方法。

    异常信息:

    四. 方法区溢出

     

    方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。当大量的类产生时填满方法区,会造成方法去溢出。

    方法区溢出也是一种常见内存溢出异常,一个类如果要被垃圾收集器回收,判断条件非常苛刻。

      

     

    展开全文
  • Java 内存溢出排查

    2018-10-23 20:24:17
    因此,OOM 的排查及定位是每个 Java 工程师都必备的技能。 所遇到的问题 在使用 scala 开发的一个 web 服务,在用户使用中,经常出现: java.lang.OutOfMemoryError: Java heap space 。而且还束手无策,每次都只能...

    Java OOM 毫无疑问是开发人员常见并且及其痛恨的问题,但是任何服务的开发都没法避免 OOM。 因此,OOM 的排查及定位是每个 Java 工程师都必备的技能。

    所遇到的问题

    在使用 scala 开发的一个 web 服务,在用户使用中,经常出现: java.lang.OutOfMemoryError: Java heap space 。而且还束手无策,每次都只能重启服务解决。

    准备

    服务使用 jetty 发布的,先来看一下我这个服务的启动参数:

    /opt/soft/jdk/jdk1.7.0_40/bin/java
    -server -Xmx4G -XX:MaxPermSize=1024M -XX:PermSize=256M
    -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:-CMSConcurrentMTEnabled -XX:CMSInitiatingOccupancyFraction=65 -XX:+CMSParallelRemarkEnabled
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=/opt/soft/heapdump/
    -Dscala.concurrent.context.numThreads=500
    -Dscala.concurrent.context.maxThreads=500
    -Dfile.encoding=UTF-8 -jar start.jar >> log 2>&1 &

    排查

    通过增加了参数 -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath 当在 OOM 的时候,服务会生成一个 java_pid$pid.hprof 二进制文件。

    下面就是使用工具分析这个 .hprof 文件来定位问题了。使用 Memory Analyzer (MAT) 来分析该文件,效果如下:
    在这里插入图片描述
    打开 Leak Suspects» Leaks» Problem Suspect 1 看到如下详情:
    在这里插入图片描述
    一开始可能没那么快找到问题,但是这个图已经很明显说明了问题,是 ArrayList 的内容太大,沾满了内存。但是你可能还不清楚具体那块代码导致,这个时候你可以点击那个 ArrayList 在左侧栏看 Attribute。

    然后一直鼠标右键 into 进去看里面的详情,最终是可以看内容的。

    问题原因

    问题排查到最后,看到的是 ArrayList 里面存的全是 ResponseBodyPart, 然后就想到了项目使用到 Dispatch 请求下载结果文件,
    于是乎去找到问题代码,错误代码如下:

    val outputReq = dispatch.url(url) / “task” / “output” / id
    val outputFuture = Http(outputReq > { res =>
    val out = new FileOutputStream(outputFile(taskId), true)
    IOUtils.copy(res.getResponseBodyAsStream(), out)
    out.close
    })

    看不出问题,感觉一切正常。翻源码会发现,res.getResponseBodyAsStream() 之前,已经将所有内容都存入一个 ArrayList 当中了。哎,没用对啊。

    解决办法

    问题已经定位到,于是去了解了一下这个项目,该如何使用 stream 的方式来读取并写入文件流。然后发现,人家有一个 read line by line 的实现。但是切割上其实是有问题的,因为拿到一批 bytes 之后,直接转成了 string 并用分隔符分割,奈何内容里面有中文,出现乱码了。

    最终,参考项目本身的 as.stream.Lines 写了一个 as.stream.Bytes 来通过 bytes 边读边写,如下:

    val bos = new BufferedOutputStream(new FileOutputStream("/tmp/file.txt", true))
    val outputFuture = Http(outputReq > as.stream.Bytes(bytes => {
    bos.write(bytes)
    }))

    总结

    主要描述了分析问题的思路和方向,问题都大同小异,OOM 总会有原因的,有原因肯定可以找到并解决。MAT 这个分析工具很实用,内容很详细。以前遇到 OOM 问题都是重启服务,治标不治本,还是要多分析问题并解决。

    展开全文
  • linux下Java内存溢出排查

    千次阅读 2019-03-07 12:19:27
    1、查询gc情况(每1秒钟打印一次gc情况) ...M:元数据区(java8,相当于java7及之前的永久代的概念)使用大小 ccs:压缩后使用率 YGC:young gc 次数, YGCT:young gc耗时 FGC:full gc次数 FGCT:f...

    1、查询gc情况(每1秒钟打印一次gc情况)

    jstat -gcutil pid 1000:1
    

    查询结果含义:
    S0:幸存区1占用率
    S1:幸存区2占用率
    E:Eden区占用率
    O:老年区占用率
    M:元数据区(java8,相当于java7及之前的永久代的概念)使用大小
    ccs:压缩后使用率
    YGC:young gc 次数,
    YGCT:young gc耗时
    FGC:full gc次数
    FGCT:full gc耗时
    GCt:GC共耗时

    2、查询进程信息

    #查询占用内存的进程(shift+m排序)
    top
    #存活的对象占用内存前100排序
    jmap -histo:live 41843 | head -n 100
    

    3、查询进程里面详细信息

    jmap -heap 41843
    

    如果Jave类的内存异常则检查代码
    如果发现频繁的gc是因为新生代、老年代、永久代分配的大小有问题,则可以通过修改设置解决

    eg:

    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:PermSize=64M  -XX:MaxPermSize=128M -XX:MaxTenuringThreshold=0
    

    参数含义:

    • -Xmx3550m 堆最大容量(heap max size)
    • -Xms3550m 堆最小容量(heap min size)
    • -Xmn2g 年轻代大小
    • -Xss256k 每个线程栈容量大小(stack size)
    • -XX:NewRatio=4 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代),设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5;
    • -XX:SurvivorRatio=4 年轻代中Eden区与Survivor区的大小比值,设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
    • -XX:PermSize=64M 初始分配的永生代容量
    • -XX:MaxPermSize=128M 永生代最大容量
    • -XX:MaxTenuringThreshold=0 设置垃圾最大年龄

    -Xmn对系统性能影响较大,Sun官方推荐配置为整个堆的3/8;JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。

    JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右;

    -XX:MaxTenuringThreshold如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

    展开全文
  • Java内存溢出排查(必看)

    千次阅读 2019-05-17 10:58:44
    因此,OOM的排查及定位是每个Java工程师都必备的技能。 所遇到的问题 在使用scala开发的一个web服务,在用户使用中,经常出现:java.lang.OutOfMemoryError: Java heap space。而且还束手无策,每次都只能重启服务...
  • 文档:【Java内存溢出排查】测试环境服务器挂... 链接:http://note.youdao.com/noteshare?id=783e7ec89950f4167867ef3ef33470b6&sub=48AEFC6FDECB4C60869FAA5FABF57AB0 通过以下命令信息可以确定是内存溢出...
  • java内存溢出 原因与排查方法 1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,导致剩余的内存不够用,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用...
  • java线上内存溢出问题排查步骤

    千次阅读 2019-02-15 11:24:17
    一般线上遇到比较头疼的就是OOM内存溢出问题,我们都会先看错误日志,如果错误日志能够定位出哪个类对象导致内存溢出,那么我们只需要针对问题修改bug就好。但是很多时候我们单凭日志无法定位出内存溢出问题,那么...
  • 性能测试-java内存溢出问题排查

    千次阅读 2018-10-31 12:06:05
    关于内存溢出 网上的资料全是坑,都没有一篇写到点上的,我就发现了个问题,要查一个难点,你得至少结合30篇博客的知识点加上自己的悟性才能搞定一个问题。 首先,你windows本机得安装好java,我这里用的是...
  • 这两天公司的一个程序出现问题,频繁出现内存溢出错误OutOfMemory:GC overhead limit exceeded. 虽然知道这个错误的原因是因为Java虚拟机在频繁进行垃圾回收,使用了98%的时间进行垃圾回收,但是实际回收了不到2%的...
  • 关于Java Tomcat 内存溢出排查

    千次阅读 2018-07-17 11:14:20
    网站不知道什么时候,开始内存飙升,从 Tomcat 启动后,初始内存占用4%~5% ...一、定位造成内存溢出可能存在的问题 io流操作文档没关闭流。 往一个静态集合变量里一直压栈。 连接没释放。 Java队列没消耗。 ...
  • java内存溢出排查

    2021-04-24 23:41:38
    获取dump 文件 jmap -dump:live,format=b,file=/home/srs/tmp/heap.hprof 6328
  • Java内存溢出和泄漏的排查

    千次阅读 2019-06-19 10:04:53
    一定是有一个项目在跑着,然后突然变慢了,你才会想到排查内存泄露的问题的。作为小白,写写逻辑,我觉得基本上接触不到这个问题。自己写程序报错OOM,那需要很大的代码错误。 我接触到这个问题是上次项目经理面试...
  • java排查内存溢出

    2019-12-30 19:21:42
    1.1:什么是内存溢出,为什么会内存溢出? 2排查问题: Overview视图 histogram视图(重要) Dominator Tree(重要) 3问题复现: 4解决问题: 5总结: 1背景: 最近公司线上项目出现了java.lang....
  • java内存泄露、溢出检查方法和工具

    热门讨论 2011-11-11 11:50:10
    本作者项目原创经历,内容关于java的一个web项目内存溢出的分析和解决,其中详细介绍了诊断的方法和一些工具的使用,重点写了利用Eclipse Memory Analyzer 分析工具来分析jvm的堆快照。很有实用价值。
  • Java内存溢出(OOM)异常排查指南

    万次阅读 2018-04-08 10:27:36
    Java应用程序在启动时会指定所需要的内存大小,它被分割成两个不同的区域:Heap space(堆空间)和Permgen(永久代): JVM内存模型示意图 这两个区域的大小可以在JVM(Java虚拟机)启动时通过参数-Xmx和-XX:.....
  • 记一次Java线上内存溢出问题排查

    千次阅读 2019-05-07 23:44:45
    1、top下对当前服务器内存有个大致了解 top后 shift+M按照内存占用由大到小排序,RES是...[root@speedyao java]# ps -aux|grep java 3、利用jstat查看虚拟机堆内存情况和gc情况 jstat -gc:util<vmid> [&...
  • 在分析问题之前先给大家讲一讲排查内存溢出问题的方法,内存溢出时JVM虚拟机会退出,那么我们怎么知道JVM运行时的各种信息呢, Dump 机制会帮助我们,可以通过加上VM参数-XX:+HeapDumpOnOutOfMemoryError让虚拟机在...
  • java内存溢出排查正确姿势:

    千次阅读 2016-10-21 18:16:22
    java内存溢出排查正确姿势: 1.jstat -gcutil pid 看gc频次是否正常,看gc是否能回收掉垃圾; 2.jmap -histo:live pid (这个会触发FGC) 3.jstack pid 看线程谁被阻塞 最后重启,重启前,jmap -dump:format=b,...
  • 点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析...
  • Memory Analyzer(MAT)是一款内存分析工具,可以通过该工具打开.hprof文件进行分析内存溢出的原因。 在开始介绍这款工具使用前,先了解一下如何获取.hprof文件,首先我们需要在tomcat.service文件中加入内存溢出的...
  • 面试官:说一下内存溢出排查过程和工具?我... 如何使用MAT进行内存泄露分析 Java线上内存溢出问题排查步骤 1、使用top对当前服务器内存有个大致了解,top后 shift+M俺内存占用由大到小排序 2、利用ps命令查看服务...
  • 其他的排查工具: jconsole java监视和管理控制台 jconsole其实已经包含以下的所有指令,不过如果在没界面的Linux系统上就要用到下面的指令 jps查看当前运行的java程序 jstat -gcutil pid 间隔时间(毫秒) 单位...
  • 记一次堆外内存溢出排查过程

    万次阅读 2018-09-30 12:58:14
    服务器发布/重启后,进程占用内存 21%(3g),观察进程占用内存,以一天4%左右的速度增长,一定时间过后,java 进程内存增长到接近 90%,服务器报警。此时 old 区占用 50%,未达到 CMS GC 阈值,因此不会触发 CMS GC,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,224
精华内容 5,289
关键字:

java内存溢出排查

java 订阅