精华内容
下载资源
问答
  • Java OOM问题如何排查

    2021-03-13 23:20:36
    @OOM 问题什么是OOMOOM为out of memory的简称,来源于java.lang.OutOfMemoryError,指程序需要的内存空间大于系统分配的内存空间,OOM后果就是程序crash;可以通俗理解:程序申请内存过大,虚拟机无法满足,然后自杀...

    @

    OOM 问题

    什么是OOM

    OOM为out of memory的简称,来源于java.lang.OutOfMemoryError,指程序需要的内存空间大于系统分配的内存空间,OOM后果就是程序crash;可以通俗理解:程序申请内存过大,虚拟机无法满足,然后自杀了。

    导致OOM问题的原因

    为什么会没有内存了呢?原因不外乎有两点:

    1)分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。

    2)应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。

    内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。

    内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。

    最常见的OOM情况有以下三种:

    java.lang.OutOfMemoryError: Java heap space ------>java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。

    java.lang.OutOfMemoryError: PermGen space 或 java.lang.OutOfMemoryError:MetaSpace ------>java方法区,(java8 元空间)溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。

    java.lang.StackOverflowError ------> 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。

    排查手段

    一般手段是:先通过内存映像工具对Dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏还是内存溢出。

    如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。这样就能够找到泄漏的对象是通过怎么样的路径与GC Roots相关联的导致垃圾回收机制无法将其回收。掌握了泄漏对象的类信息和GC Roots引用链的信息,就可以比较准确地定位泄漏代码的位置。

    如果不存在泄漏,那么就是内存中的对象确实必须存活着,那么此时就需要通过虚拟机的堆参数( -Xmx和-Xms)来适当调大参数;从代码上检查是否存在某些对象存活时间过长、持有时间过长的情况,尝试减少运行时内存的消耗。

    实战

    接下来用一个简单的案例,展示OOM问题排查过程

    public class OomDemo {

    public static void main(String[] args) {

    StringBuilder stringBuilder = new StringBuilder();

    while(true){

    stringBuilder.append(System.currentTimeMillis());

    }

    }

    }

    执行代码时,通过设置JVM参数达到OOM的目的

    java -Xmx10m -Xms10m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=oom.hprof OomDemo

    -XX:+HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath参数分别用于指定发生OOM是否要导出堆以及导出堆的文件路径

    这个方法也可以通过jmap实时生成

    jmap -dump:format=b,file=$java_pid.hprof #java_pid为java进程ID

    以上命令执行后,程序会出现如下错误:

    java.lang.OutOfMemoryError: Java heap space

    Dumping heap to oom.out ...

    Heap dump file created [3196858 bytes in 0.016 secs]

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    at java.util.Arrays.copyOf(Arrays.java:3332)

    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)

    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:700)

    at java.lang.StringBuilder.append(StringBuilder.java:214)

    at jvm.OomDemo.main(OomDemo.java:13)

    MAT分析

    首先使用MAT打开刚刚导出的hprof文件,选择报告里的泄露嫌疑分析 Leak Suspects Report

    可以看到有一个本地变量,站了总存储的92%,实际占用的是char[],See stacktrace,可看到该对象所在线程的堆栈信息:

    通过这儿,可以定位到发生OOM的代码段,至此,可根据具体代码具体分析。

    展开全文
  • Java OOM 分析和线程Dump分析Java OOM 分析Java堆内存溢出MetaSpace(元数据)内存溢出Java线程Dump分析什么是Thread DumpThread Dump特点Thread Dump抓取Thread Dump信息Thread状态分析关键状态分析案例分析JVM重要...

    Java OOM 分析

    Java堆内存溢出

    在Java堆中只要不断的创建对象,并且GC-Roots到对象之间存在引用链,这样JVM就不会回收对象。
    只要将-Xms(最小堆),-Xmx(最大堆)设置为一样禁止自动扩展堆内存。
    当使用一个while(true)循环来不断创建对象就会发生OutOfMemory,还可以是用-XX:+HeapDumpOutofMemoryError当发生OOM时会自动dump堆栈到文件中。
    伪代码:
    在这里插入图片描述
    当出现OOM时可以通过工具来分析GC-Roots引用链,查看对象和GC-Roots是如何进行关联的,是否存在对象的生命周期过长,或者是这些对象确实该存在的,那就要考虑将堆内内存调大了。
    在这里插入图片描述
    java.lang.OutOfMemoryError:Java heap space表示堆内存溢出。

    MetaSpace(元数据)内存溢出

    JDK8中将永久代溢出,是用MateSpace来保存类加载之后的类信息,字符串常量池也被移动到Java堆。
    PermSize和MaxPermSize已经不能是用了,在JDK8中配置这两个参数会发出警告。
    JDK8中将类信息移到了本地堆内存(Native Heap)中,将原来的永久代移动到了本地堆中成为了MetaSpace,如果不指定该区域的大小,JVM将会动态的调整。
    可以是用-XX:MaxMetaspaceSize=10M来限制最大元数据。这样当不停的创建类时将会占用该区域并出现OOM。
    在这里插入图片描述
    是用cglib不停的创建新类,最终会抛出:
    在这里插入图片描述
    TIP:
    这里的OOM伴随的是java.langOutOfMemoryError:MetaSpace也就是元数据溢出。

    Java线程Dump分析

    什么是Thread Dump

    Thread Dump是非常有用的诊断Java应用问题的工具。每个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个Java虚拟机打印的thread-dump略有不同。但是大多都提供了当前活动线程的快照,及JVM中所有线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及执行的方法,如果可能的话还有源代码的行数。

    Thread Dump特点

    • 能在各钟操作系统下使用;
    • 能在各种Java应用服务器下使用;
    • 能在生成环境下使用而不影响系统的性能;
    • 能将问题直接定位到应用程序的代码行上;

    Thread Dump抓取

    一般当服务器挂起,崩溃或者性能低下时,就需要抓取服务器的线程堆栈(Thread Dump)用于后续的分析。在实际运行中,往往一次dumo的信息,还不足以确认问题。为了反映线程状态的动态变化,需要接连多次做thread dump,每次间隔10-20s,建议至少产生三次dump信息,如果每次dump都指向同一个问题,我们才能确定问题的典型性。

    • 操作系统命令获取ThreadDump
      ps -ef | grep java
      kiull -3 < pid>
      tip:一定要谨慎,一步不慎就可能让服务器进程被杀死。kill -9命令会杀死进程。
    • JVM自带的工具获取线程堆栈
      jps 或 ps -ef | grep java (这行命令是为了获取PID)
      jstack[ -1 ] < pid> | tee -a jstack.log(获取ThreadDump)

    Thread Dump信息

    • 头部信息:时间,JVM信息
      在这里插入图片描述
    • 线程INFO信息块:
      在这里插入图片描述
    • Java thread statck trace详解:
      堆栈信息应该逆向解读:程序先执行的是第7行,然后是第六行,以此类推。
      在这里插入图片描述
      也就是说对象先上锁,锁住对象0xb3885f60,然后释放对象锁,进入waiting状态。为啥会这样呢?

    在这里插入图片描述
    如上,线程的执行过程,先用synchronized获得这个对象的Monitor(对应于locked)。当执行到obj.wait(),线程即放弃了Monitor的所有权,进入”wait.set“队列。
    在堆栈的第一行信息中,进一步标明了线程在代码级的状态
    例:
    在这里插入图片描述

    Thread状态分析

    线程的状态是一个很重要的东西,因此thread dump中会显示这些状态,通过对这些状态的分析,能够得出线程的运行状态,进而发现可能存在的问题。
    线程的状态在Thread State这个枚举类型中定义:

    • NEW:
      每一个线程,在堆内存中都有一个对应的Thread对象。Thread t = new Thread();当刚刚在堆内存中创建Thread对象,还没有调用t.start方法之前,线程就处在NEW状态,在这个状态上与普通的java对象没什么区别,就仅仅是一个堆内存的对象。
    • RUNNABLE:
      该状态表示线程具备所有运行条件,在运行队列中准备操作系统的调度,或者正在运行。这个状态的线程比较正常,但如果线程长时间停留在这个状态就不正常了,这说明线程运行的时间很长(存在性能问题),或者是线程一直不得执行的机会(存在线程饥饿问题)。
    • BLOCKED:
      线程正在等待获取java对象的监视器(也叫内置锁),即线程正在等待进入由synchronized保护的方法或代码块中。sychronized用来保证原子性,任意时刻最多只能由一个线程进入临界区域,其他线程只能排队等待。
    • WAITING:
      处在该线程阶段,正在等待某个事件的发生,只用特定的条件发生满足了,才能获得执行机会。而产生这个特定的事件,通常都是另一个线程,也就是说。如果不发生特定事件,那么处在该状态的线程一直等待,不能获取执行的机会。
      比如:
      A线程调用了obj对象的obj.wait()方法,如果没有线程调用obj.notify()或obj.notifyall()方法,那么A线程就没有办法恢复运行;
      如果线程A调用LockSupport.park(),没有别的线程调用LockSupport.unpark(A),那么A没有办法回复运行。
      TIMED_WAITING:J.U.C中很多于线程相关类,都提供了限时版本和不限时版本的API。TIMED_WAITING意味着线程调用了限时版本的API,正在等待时间流逝。当等待时间过去后,线程一样恢复运行,如果线程进入了WAITING状态,一定要特定的事件发生才能恢复运行;而处在TIMED_WAITING的线程,如果特定的事件发生或者时间流逝完毕,都会恢复运行。
    • TERMINATED:
      线程执行完毕,执行完run方法正常返回,或者抛出了运行时异常而结束,线程都会停留在这个状态。这个时候线程只剩下Thread对象,没什么用了。

    关键状态分析

    • Wait on condition:Thread is either sleeping or waiting to be notified by another thread
      该状态说明它正在等待另一个条件的发生来把自己唤醒,或者干脆它是调用了sleep(n)。
      此时线程状态大致为以下几种:
      在这里插入图片描述
    • Waiting for Monitor Entry和 in Object.wait()
      The thread is waiting to get the lock an object (some other thread may be holding the lock).This happens if two or more threads try to execute synchronized code.Note that the lock is always for an object and not for individual methods.
      在多线程的JAVA程序中,实现线程之间的同步,就要说说Monitor。Monitor是Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者Class的锁。每一个对象都有,也仅有一个Monitor。下面这个图,描述了线程和Monitor之间关系,以及线程的状态转换图:
      在这里插入图片描述
      如上图,每个Monitor在某个时刻,只能被一个线程拥有,该线程就是”Active Thread“,而其他线程都是”Waiting Thread“,分别在两个队列”Entry Set“和”Wait Set“里等待,在”Entry Set“中等待的线程状态是“Waiting for monitor entry”,而在“Wait Set”中等待的线程状态时“in Object.wait()”。

    先说“Entry Set”里面的线程。我们称被synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了“Entry Set 队列”。
    这时有两种可能:

    • 该monitor不被其他线程拥有,Entry Set里面也没有其他等待线程。本线程即成为相应类或者对象的Monitor的Owner,执行临界区代码。
    • 该monitor被其他线程拥有,本线程在Entry Set队列中等待。

    再说说“Wait Set”里面的线程。当线程获得了Monitor,进入了临界区之后,如果发现线程继续运行的条件没有满足,它调用对象(一般就是被synchronized的对象)的wait方法,放弃Monitor,进入“Wait Set”队列。只有当别的线程在该对象上调用notify()或者notifyAll(),“Wait Set”队列中的线程才有机会去竞争,但是只有一个线程获得对象的Monitor,恢复运行态。在“Wait Set”中线程,DUMP中表现为:in Object.wait()。如下:
    在这里插入图片描述

    案例分析

    问题场景:

    • CPU飙高,load高,响应很慢
      1.一个请求过程中多次dump;
      2.对比多次dump文件的runnable线程,如果执行的方法有比较大的变化,说明比较征程。如果在执行同一个方法,就有一些问题了。
    • 查找占用CPU最多的线程
      1.使用命令:top -H -p pid(pid 为被测系统的进程号),找到导致CPU高的线程ID,对应thread dump信息中线程的nid,只不过是一个十进制,一个是十六进制;
      2.在thread dump中,根据top命令查找的线程id,查找对应的线程堆栈信息;
    • CPU使用率不高但是响应很慢
      进行dump,查看是否有很多thread struck在i/o,数据库等地方,定位瓶颈原因;
    • 请求无法响应
      多次dump,对比是否所有的runnable线程都是一直在执行相同的方法,如果是的,恭喜你,锁住了!
    • 死锁
      死锁经常表现为程序的停顿,或者不再响应用户的请求。从操作系统上观察,对应的进程的CPU占用率为0,很快会从top或prstat的输出中消失。
    • 热锁
      热锁,往往也会是导致系统性能瓶颈的主要因素,其主要表现特征为:由于多个线程对临界区,或者锁的竞争,可能出现:
      (1)频繁的线程的上下文切换:从操作系统对线程的调度来看,当线程在等待资源而阻塞的时候,操作系统会将指切换出来,放到等待的队列,当线程获得资源之后,调度算法会将这个线程切换进去,放到执行队列中。
      (2)大量的系统调度:因为线程的上下文切换,以及热锁的竞争,或者临界区的频繁的进出,都可能导致大量的系统调用。
      (3)大部分CPU开销用在“系统态”:线程上下文切换,和系统调用,都会导致CPU在“系统态”运行,换而言之,虽然系统很忙碌,但是CPU用在“用户态”的比例较小,应用程序得不到充分的CPU资源。
      (4)随着CPU数目的增多,系统的性能反而下降。因为CPU数目多,同时运行的线程越多,可能就会造成更频繁的线程上下问切换和系统态的CPU开销,从而导致更糟糕的性能。

    JVM重要线程

    JVM运行过程中产生的一些比较重要的线程如下:
    在这里插入图片描述

    展开全文
  • 主要介绍了java OOM内存泄漏原因及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 超详细的Java OOM处理

    2020-10-15 14:46:05
    使用工具 jvisualvm.exe ... 1.查看当前出问题得类 ... ... ...可以看见每个数组占用10mb ...已经来就看见了一个东西,至于怎么确定是这个东西的我也是面向百度老师问了无数遍的 ...因为我是springboot打包成war项目的所以我又去看了...

    异常类型
    out Of memory :heap space

    使用工具

    jvisualvm.exe 
    

    直接上dump图,按步骤点击 1-2-3;
    1.查看当前出问题得类
    2.点击大小排序 可以看见 byte[] 占用95.1内存。
    3.点击byte[]进入实例
    在这里插入图片描述
    点击3以后进入
    在这里插入图片描述
    可以看见每个数组占用10mb
    在这里插入图片描述
    1.左边随便点一个
    2.只有这个长的不一样先进去看
    已经来就看见了一个东西,至于怎么确定是这个东西的我也是面向百度老师问了无数遍的
    在这里插入图片描述最终确定就是这个。
    因为我是springboot打包成war项目的所以我又去看了这个文章
    https://www.cnblogs.com/jet-angle/p/11973351.html
    最终找到解决的方法就是改配置
    server.max-http-header-size=102400
    我是tomcat
    也改成这个值问题解决
    1.下面是我们项目的错误配置在这里插入图片描述

    展开全文
  • Java服务OOM,最常见的原因为: (1)有可能是内存分配确实过小,而正常业务需要使用更大的内存; (2)某一个对象被频繁申请,却没有释放,内存不断泄露,导致内存耗尽; (3)某一个资源被不断申请,系统资源...

     

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

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

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

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

     

    排查过程

    如果知道具体服务和接口,可以ps -ef|grep java查看pid

    1.   jmap -heap pid 确认内存本身是否分配过小,可以看到新生代老生代的参数配置

    [root@bird74 ~]# jmap -heap 6598
    Attaching to process ID 6598, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.161-b12
    
    using thread-local object allocation.
    Parallel GC with 18 thread(s)
    
    Heap Configuration:
       MinHeapFreeRatio         = 0
       MaxHeapFreeRatio         = 100
       MaxHeapSize              = 32210157568 (30718.0MB)
       NewSize                  = 715653120 (682.5MB)
       MaxNewSize               = 10736369664 (10239.0MB)
       OldSize                  = 1431830528 (1365.5MB)
       NewRatio                 = 2
       SurvivorRatio            = 8
       MetaspaceSize            = 21807104 (20.796875MB)
       CompressedClassSpaceSize = 1073741824 (1024.0MB)
       MaxMetaspaceSize         = 17592186044415 MB
       G1HeapRegionSize         = 0 (0.0MB)
    
    Heap Usage:
    PS Young Generation
    Eden Space:
       capacity = 3437756416 (3278.5MB)
       used     = 442139392 (421.656982421875MB)
       free     = 2995617024 (2856.843017578125MB)
       12.861277487322708% used
    From Space:
       capacity = 81788928 (78.0MB)
       used     = 19657352 (18.74671173095703MB)
       free     = 62131576 (59.25328826904297MB)
       24.03424580891927% used
    To Space:
       capacity = 117440512 (112.0MB)
       used     = 0 (0.0MB)
       free     = 117440512 (112.0MB)
       0.0% used
    PS Old Generation
       capacity = 2432696320 (2320.0MB)
       used     = 131810152 (125.7039566040039MB)
       free     = 2300886168 (2194.296043395996MB)
       5.418273991551892% used
    
    51800 interned Strings occupying 5721192 bytes.

    2.   查看该pid下 线程对应的系统占用情况

    top -Hp pid

    3.   找到最耗内存的对象

    jmap -histo:live pid | more

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

    字段分别代表实例数;所占内存大小;类名 

    4.    测试堆栈溢出:jstat -gcutil <pid> 时间间隔毫秒 ;看下是否正常

    • S0:幸存1区当前使用比例
    • S1:幸存2区当前使用比例
    • E:伊甸园区使用比例
    • O:老年代使用比例
    • M:元数据区使用比例
    • CCS:压缩使用比例
    • YGC:年轻代垃圾回收次数
    • YGCT:年轻代垃圾回收时间
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间
    • GCT:垃圾回收消耗总时间 

    5.    生成对应pid的dump文件     

    jmap -dump:format=b,file=heap.hprof <pid>

    注意:pid对应的项目是哪个用户启动的,就用哪个用户权限生成文件,否则会报错   Unable to open socket file: target process not responding or HotSpot VM not loaded

    6.   heap.hprof文件 导出用MAT分析,可以用sz导出

    • Histogram可以列出内存中的对象,对象的个数以及大小。
    • Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
    • Top consumers通过图形列出最大的object。
    • Leak Suspects通过MA自动分析泄漏的原因

    更多MAT使用教程还是查一下吧

    主要的流程在这里,大家可以根据自己情况选择

    问题出来了要最快定位问题,紧急解决眼前问题让业务正常,然后再优化

    展开全文
  • Java OOM异常定位思路 文章目录Java OOM异常定位思路1.概述2.发生OOM的内存区域有哪些?3.OOM可能的区域以及原因Java堆虚拟机栈、本地方法栈 1.概述 OOM:OutOfMemory(内存溢出),一般是内存不足导致。JVM规范规定...
  • JAVA OOM问题排查记录

    千次阅读 2021-06-15 17:06:37
    JAVA OOM问题排查记录 问题描述 实际开发中有个定时任务的应用,运行一段时间后就会OOM,通过jvm的各种监控来排查OOM的原因,特此记录在这里。 内容引用 JVM 调优-给你的java应用看看病 Java程序内存分析:使用mat...
  • Java OOM异常原因及解决方案

    千次阅读 2020-10-11 17:34:53
    Java堆溢出 现象 java.lang.OutOfMemoryError: Java heap space 原因 大量对象没有释放,无法回收 解决方案 使用内存映像分析工具分析 Dump 出来的堆转储快照,分析对象是是否合理存在,可以排查是内存泄露还是...
  • 主要给大家介绍了关于JAVA各种OOM代码示例与解决方法的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 应用程序出现OOM异常,你是否仍然通过看日志的方式去排查问题(该方式定位解决问题是大概率的巧合而已)?正确的排查方案是进行dump文件分析,你知道为什么吗? [TOC] ###OOM异常--intsmaze 首先说一下,本人在开发中...
  • JAVA OOM分析dump 日志

    2019-09-18 12:51:02
    安装 2 查看dump 文件 测试代码;...import java.util.ArrayList; import java.util.List; import java.util.Random; public class Test01 { byte[] byteSS = new byte[1024*1024]; ...
  • 下面小编就为大家带来一篇Java内存各部分OOM出现原因及解决方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 最近查找了很多关于OOM,甚至于Java内存管理以及JVM的相关资料,发现这方面的东西太多了,竟有一种眼花缭乱的感觉,要想了解全面的话,恐非一篇文章能说清的,因此按照自己的理解整理了一篇,剩下的还需要继续学习。...
  • 字节(byte) 字节来自英文Byte,...应用程序出现OOM异常,你是否仍然通过看日志的方式去排查问题(该方式定位解决问题是大概率的巧合而已)?正确的排查方案是进行dump文件分析,你知道为什么吗? OOM异常–intsmaz
  • OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。 看下关于的官方说明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of ...
  • 针对这个问题,Client Infra 和头条抖音等业务方合作,通过一系列技术调研,自研了一套基于 Hprof 内存快照的线上 JavaOOM归因方案,在内部广泛应用并取得了极佳的效果。曾帮助Helo在一个双月内优化了80%的 Java OOM...
  • 目录应用程序出现OOM异常,你是否仍然通过看日志的方式去排查问题(该方式定位解决问题是大概率的巧合而已)?正确的排查方案是进行dump文件分析,你知道为什么吗?OOM异常--intsmaze首先说一下,本人在开发中遇到的...
  • Java OOM 类型

    2020-03-05 14:48:26
    1、java.lang.OutOfMemoryError: PermGen space 说明 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。用于存放Class和Meta的信息,GC(Garbage Collection)不会在主程序运行期对PermGen ...
  • JAVA OOM的概述

    2019-07-05 15:06:30
    JAVA OOM的概述 OOM概念 全称“Out Of Memory”,通常叫做“内存溢出”,来源于java.lang.OutOfMemoryError。 官方说明: Thrown when the Java Virtual Machine cannot allocate an object because it is out ...
  • java.lang.OutOfMemoryError共有8种类型,其中java.lang.OutOfMemoryError: unable to create new native thread是很常见的一种,这类错误通常发生在应用试图创建新线程时。   可能原因 1. 系统内存耗尽,无法为...
  • java OOM问题排查

    万次阅读 2014-11-14 18:05:36
    例如/proc/8398/oom_score,如果不希望杀死这个进程,就将oom_adj内容改为-17。 3、在这种情况下首先需要调整JVM的heap大小,在运行参数中设置   -Xms20m -Xmx20m   将heap变小,使得JVM的OOM优先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,249
精华内容 34,499
关键字:

javaoom

java 订阅
友情链接: Cat_Lab.rar