精华内容
下载资源
问答
  • OOM问题定位

    2019-09-24 07:34:31
    OOM问题定位 一:堆内存溢出 Java创建的对象一般都是分配在堆中,如果是由于过期对象没能回收(内存泄漏)或者对象过多导致放不下(内存溢出),一般报错: Exception in thread \"main\...

     

     

        一:堆内存溢出

        Java创建的对象一般都是分配在堆中,如果是由于过期对象没能回收(内存泄漏)或者对象过多导致放不下(内存溢出),一般报错:

        Exception in thread \"main\" java.lang.OutOfMemoryError: Java heap space
            at java.util.Arrays.copyOf(Arrays.java:2760)
            at java.util.Arrays.copyOf(Arrays.java:2734)
            at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
            at java.util.ArrayList.add(ArrayList.java:351)
            at test.java.VM.OOM.HeapOOM.main(HeapOOM.java:19)

         解决这部分的异常,重点是通过内存映像分析工具分析堆的转储快照确定异常是由于内存泄漏还是内存溢出导致的。

         如果是内存泄漏导致的,则进一步查看泄漏对象到GCRoots的引用链,观察泄漏对象是通过怎样的路径与GCRoots相关联并导致垃圾回收器无法回收的;

         如果是内存溢出导致的,则检测堆的大小参数(Xmx、Xms)看看能否再调大,检测是否有某些对象生命周期过长。

     

        二:方法区溢出

        方法区主要存放类的信息、静态变量、常量池等,当常量池溢出或者不停地有类动态创建并加载时,方法区也能产生OOM。

        报错信息: 

    Exception in thread \"main\" java.lang.OutOfMemoryError: PermGen space

          拓展:String.intern():如果字符串常量池已经包含一个等于此string对象的字符串,则返回该字符串;否则,将次string对象的内容加入到常量池中,并返回该对象的引用。

     

       三:栈溢出(虚拟机栈、本地方法栈)

       栈的异常有两种:

       JVM在执行方法时就会创建方法栈,方法的递归、调用等使得其他方法不停地入栈,其他方法执行完毕就会弹出栈帧。

    当一个方法栈的深度大于JVM所允许的深度时就会报StackOverFlow;

    一般,出现StackOverFlow时就要检查代码是否有无穷递归的情况出现了。

        stack length:1007Exception in thread \"main\" java.lang.StackOverflowError
    
            at test.java.VM.OOM.JavaVMStackOF.stackLeak(JavaVMStackOF.java:13)
            at test.java.VM.OOM.JavaVMStackOF.stackLeak(JavaVMStackOF.java:14)

       栈空间扩展时没有足够的内存则报OutOfMemory。

     

       四:本地直接内存溢出

       直接内存可以通过 -XX:MaxDirectMemorySize指定如果本地直接内存溢出,我们可以发现堆转储快照中无明显异常指示,并且快照文件很小,而程序中又使用了NIO等技术,则可以检查是否直接内存溢出了

    posted on 2019-03-04 10:43  shoshana~ 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/shoshana-kong/p/10469353.html

    展开全文
  • OOM问题快速定位

    2020-01-13 14:04:50
    有一个Java服务出现了OOM(Out Of Memory)问题定位了好久不得其法,请问有什么好的思路么? OOM问题,印象中之前写过,这里再总结一些相对通用的方案,希望能帮助到Java技术栈的同学。 某Java服务(假设PID=...

    有一个Java服务出现了OOM(Out Of Memory)问题,定位了好久不得其法,请问有什么好的思路么?

    OOM的问题,印象中之前写过,这里再总结一些相对通用的方案,希望能帮助到Java技术栈的同学。

    某Java服务(假设PID=10765)出现了OOM,最常见的原因为:

        有可能是内存分配确实过小,而正常业务使用了大量内存

        某一个对象被频繁申请,却没有释放,内存不断泄漏,导致内存耗尽

        某一个资源被频繁申请,系统资源耗尽,例如:不断创建线程,不断发起网络连接

    画外音:无非“本身资源不够”“申请资源太多”“资源耗尽”几个原因。

     

    更具体的,可以使用以下工具逐一排查。

    一、确认是不是内存本身就分配过小

    方法:jmap -heap 10765

    如上图,可以查看新生代,老生代堆内存的分配大小以及使用情况,看是否本身分配过小。

     

    二、找到最耗内存的对象

    方法:jmap -histo:live 10765 | more

    如上图,输入命令后,会以表格的形式显示存活对象的信息,并按照所占内存大小排序:

        实例数

        所占内存大小

        类名

    是不是很直观?对于实例数较多,占用内存大小较多的实例/类,相关的代码就要针对性review了。

     

    上图中占内存最多的对象是RingBufferLogEvent,共占用内存18M,属于正常使用范围。

    如果发现某类对象占用内存很大(例如几个G),很可能是类对象创建太多,且一直未释放。例如:

        申请完资源后,未调用close()或dispose()释放资源

        消费者消费速度慢(或停止消费了),而生产者不断往队列中投递任务,导致队列中任务累积过多

    画外音:线上执行该命令会强制执行一次fgc。另外还可以dump内存进行分析。

    三、确认是否是资源耗尽

    工具:

        pstree

        netstat

    查看进程创建的线程数,以及网络连接数,如果资源耗尽,也可能出现OOM。

     

    这里介绍另一种方法,通过

        /proc/${PID}/fd

        /proc/${PID}/task

    可以分别查看句柄详情和线程数。

     

    例如,某一台线上服务器的sshd进程PID是9339,查看

        ll /proc/9339/fd

        ll /proc/9339/task

    如上图,sshd共占用了四个句柄

        0 -> 标准输入

        1 -> 标准输出

        2 -> 标准错误输出

        3 -> socket(容易想到是监听端口)

     

    sshd只有一个主线程PID为9339,并没有多线程。

    所以,只要

        ll /proc/${PID}/fd | wc -l

        ll /proc/${PID}/task | wc -l (效果等同pstree -p | wc -l)

    就能知道进程打开的句柄数和线程数。

    希望这1分钟能帮到这位星球水友。

    展开全文
  • oom问题定位

    2018-06-13 17:45:00
    产生oom时,可以通过查看快照的方式来分析原因,如何生成快照以及怎样查看分析该快照是本篇要讨论的内容。 1.工具:eclipse(安装Memory Analyzer 插件) 2.java参数: -XX:+PrintGCDetails -Xloggc:/data/logs/...

    产生oom时,可以通过查看快照的方式来分析原因,如何生成快照以及怎样查看分析该快照是本篇要讨论的内容。

    1.工具:eclipse(安装Memory Analyzer 插件)

    2.java参数:

    -XX:+PrintGCDetails -Xloggc:/data/logs/JavaDemo/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/JavaDemo -Xms1m -Xmx1m、
    其中:
    -XX:+PrintGCDetails 打印gc日志
    -Xloggc:/data/logs/JavaDemo/gc.log gc日志的地址
    -XX:+HeapDumpOnOutOfMemoryError 出现内存溢出异常时dump出当前的内存转储快照
    -XX:HeapDumpPath=/data/logs/JavaDemo 指定快照的存放位置
    -Xms1m jvm初始内存
    -Xmx1m jvm最大内存
    此处设置jvm内存较小是为了之后模拟oom时更快报错。平时项目里不用这么设置。

    3.oom现场
    1)产生oom的测试代码
    package common;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by zuzhaoyue on 18/6/12.
     */
    public class OOMTest {
        //java堆溢出
        // -XX:+PrintGCDateStamps -Xloggc:/data/logs/JavaDemo/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/JavaDemo -Xms1m -Xmx1m
        public void  headSpaceOOM(){
            List list = new ArrayList<>();
            while(true)
            {
                list.add(new OOMTest());
            }
        }
       
        public static void main(String args[]) {
            new OOMTest().headSpaceOOM();
    
    }
    }

     

    执行上段代码结果如下

    java.lang.OutOfMemoryError: Java heap space
    Dumping heap to /data/logs/JavaDemo/java_pid42294.hprof ...
    Heap dump file created [2758120 bytes in 0.029 secs]
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3210)
    at java.util.Arrays.copyOf(Arrays.java:3181)
    at java.util.ArrayList.grow(ArrayList.java:261)

    ...

    2)用hprof快照文件定位

    使用eclipse,File->OpenFile->选择/data/logs/JavaDemo/java_pid42294.hprof,界面如下

     

    可以看到有一个占了927.4kb的对象,往下拉可以看到工具猜测的问题点,

     

    点击,Details基本上就能定位到问题了:

    显示有一个对象占用了78.35%的jvm内存,再看stacktrace

    哪一行都指出来了,太明显了。

    当然通过观察里面的对象的大小也可以看出来,点击左数第三个按钮:

    可以看到所有对象的大小,如下:

    第一个占了大部分内存的对象,点开:

    可以看到占了很多内存的对象是一个OOMTest数组,这样也能基本定位到问题~

    
    

    转载于:https://www.cnblogs.com/zuxiaoyuan/p/9179019.html

    展开全文
  • OOM问题定位方法

    千次阅读 2018-09-15 14:46:00
    线上内存OOM问题是最难定位问题,最常见的原因: (1)本身资源不够 (2)申请的太多 (3)资源耗尽 某服务器上部署了Java服务,出现OutOfMemoryError,请问有可能是什么原因,问题应该如何定位? 解决思路:...

    1. 背景

    线上内存OOM问题是最难定位的问题,最常见的原因:

    (1)本身资源不够

    (2)申请的太多

    (3)资源耗尽

    某服务器上部署了Java服务,出现OutOfMemoryError,请问有可能是什么原因,问题应该如何定位?

    解决思路:

    Java服务OOM,最常见的原因为:

    (1)有可能是内存分配确实过小,而正常业务需要使用更大的内存;

    (2)某一个对象被频繁申请,却没有释放,内存不断泄露,导致内存耗尽;

    (3)某一个资源被不断申请,系统资源耗尽,例如:不断创建线程,不断发起网络连接

    2. 排查过程

    2.1 确认是不是内存本身就分配过小

    jmap -heap pid

    如图,可以查看新生代,老年代堆内存的分配大小以及使用情况,看是否本身分配过小。

    2.2 找到最耗内存的对象

    jmap -histo:live pid | more

    如图,结果以表格的形式显示存活对象的信息,并按照所占内存大小排序:

    实例数,所占内存大小,类名

    如果发现某类对象占用内存很大,很可能是类对象创建太多,且一直未释放。例如:

    (1)申请完资源后,未调用close释放资源

    (2)消费者消费速度慢,生产者不断往队列中投递任务,导致队列中任务累积过多

    2.3 确认释放是资源耗尽

    pstree:查看进程创建的线程数

    netstat:网络连接数

    还有另一种方法,通过

    ll /proc/pid/fd 查看占用句柄

    ll /proc/pid/task 查看线程数

    例如,某一台显示服务器的sshd进程是1041,查看:

    sshd共占用了5个句柄。

    sshd只有一个主线程为1041,并没有多线程。

    转载于:https://www.cnblogs.com/lujiango/p/9650927.html

    展开全文
  • 相信大家都有感触,线上服务内存OOM问题,是最难定位问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存...
  • JAVA出现OOM问题的原因 1. 分配的内存空间小,正常的业务需要较大的内存空间 2. 对象频繁被申请,没有释放掉 3. 资源不断的申请,导致资源耗尽,如线程不断创建,不断的发起网络连接 定位OOM 1. 确定JVM的内存...
  • OOM问题定位与修复

    2019-04-11 23:22:27
    OOM进程信息 查看OOM的进程 top -d 1 -c 大写M: 内存使用排序 查看内存是否分配过小 jmap -heap pid 找到最消耗内存的对象 jmap -histo:live pid | more 确认是否资源耗尽 (1)ps -efL pid (2)netstat -apn | ...
  • 相信大家都有感触,线上服务内存OOM问题,是最难定位问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务...
  • OOM问题分析定位

    2020-02-21 15:54:30
    一 、问题描述 二、MAT分析 三、代码问题 四、问题解决
  • Java OOM问题定位简版

    2020-11-02 16:52:04
    OOM问题定位简版 Java模仿内存溢出并分析问题: 1.首先需要下载MAT工具 独立MAT下载地址: http://www.eclipse.org/mat/downloads.php 以下地址为eclipse安装MAT使用: ...2.在eclipse配置VM参数:-XX:+...
  • JVM发生OOM问题定位与分析

    千次阅读 2020-08-10 11:01:57
    什么是OOM
  • 线上服务内存OOM问题定位三板斧

    千次阅读 2017-09-01 15:34:02
    线上服务内存OOM问题,是最难定位问题,不过归根结底,最常见的原因:本身资源不够申请的太多资源耗尽58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问题排查实战演练,将内存OOM问题定位三...
  • 文件服务OOM问题定位

    2016-12-28 20:08:56
    最近在开发一个文件管理服务,实际文件存储在阿里的OSS上,服务本身只管理文件映射,需要调用阿里的API生成授权访问链接。...测试结果非常糟糕,平均响应时长30s,而且OOM了。     看了一下服务器,
  • 一次真实的线上OOM问题定位 尊重原创:王政依码平川 原文链接 概述 近日,负责的一系统生产环境上出现了OutOfMemoryError,伴随着这个问题随之而来的是一堆FullGC,CPU百分之百,频繁宕机重启等问题,严重影响...
  • 定位一个oom问题

    2021-02-01 10:49:51
    当系统出现oom问题时,我们一般的定位思路是怎样的? 系统OOM常见的原因有: 1、用户态内存需求过多,资源不足; 2、大页配置不正确; 3、水位线值异常; 4、slab内存过多; 5、rcu异常; OOM问题定位步骤如下: 1、...
  • 场景:项目在使用springcloud的zuul时,在uat环境下发生oom,并且设置堆内存(-Xmx3072M)大小为3gb任然占满任然oom 定位过程: 第一步获取堆内存dump文件: 这里的内存是缓慢上升的所以可以通过以下方法获取堆内存dump...
  • 记一次OOM问题排查途径 本次一个模块对接的一个业务方,在业务方三个任务同时到达时出现OOM的情况。 首先是 jps 获取当前正在运行的java程序 查看堆内存信息:jmap -heap 138254 当时三个任务同时到达时 老年代...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,304
精华内容 8,521
关键字:

oom如何定位问题