• 系统OOM复位定位


    定位OOM的工具:

    1.多次收集Thread Dump信息
    kill -3  PID
    通过对比分析heap 对象信息和Thread信息来定位

    2.通过 -Xloggc:D:/gc.log  -XX:+HeapDumpOnOutOfMemoryError   -XX:HeapDumpPath=d:/test.hprof
    来收集heap dump 信息
    .通过MAT来查看堆里比较大块的对象是些啥。如果有些很明显的业务对象占了很大空间,并且创建它们的点很少且都已知,就可以很快缩小追查范围。

    3.通过google-perftools工具分析
    http://code.google.com/p/google-perftools/

    4.通过Btrace来定位
    http://kenai.com/projects/btrace

    OOM问题定位

     

        一:堆内存溢出

        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等技术,则可以检查是否直接内存溢出了。

  • 相关阅读:
    第36课 经典问题解析三
    第35课 函数对象分析
    67. Add Binary
    66. Plus One
    58. Length of Last Word
    53. Maximum Subarray
    38. Count and Say
    35. Search Insert Position
    28. Implement strStr()
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/klb561/p/9179655.html
Copyright © 2020-2023  润新知