什么是java OOM?若何阐发及处理oom问题?

更新时间:2019-08-07

  而正在Java言语中,因为存正在了垃圾从动收受接管机制,所以,我们一般不消去自动不消的对象所占的内存,也就是理论上来说,是不会存正在“内存泄露”的。可是,若是编码不妥,好比,将某个对象的援用放到了全局的Map中,虽然方式竣事了,可是因为垃圾收受接管器会按照对象的援用环境来收受接管内存,导致该对象不克不及被及时的收受接管。若是该种环境呈现次数多了,就会导致内存溢出,好比系统中经常利用的缓存机制。Java中的内存泄露,分歧于C++中的忘了delete,往往是逻辑上的缘由泄露。

  涉及到的虚拟机的手艺或者东西,往往需要考虑到虚拟机规范以及分歧的虚拟机实现。特别是针对虚拟机调优时,往往需要针对虚拟机正在某些方面的实现策略来考虑,好比,分歧的虚拟机的垃圾收受接管算法是纷歧样的,而这间接影响了虚拟机某些参数的设置,以达到虚拟机的最佳机能。

  而针对JVM运转时的阐发取诊断,则需要控制阐发根基方式,针对具体环境,使用虚拟机的道理,具体阐发。一句话,水很深啊。

  JAVA虚拟机栈:Java方式施行的内存模子,每个Java方式的施行对应着一个栈帧的进栈和出栈的操做。

  :申请利用完的内存没有,导致虚拟机不克不及再次利用该内存,此时这段内存就泄露了,由于申请者不消了,而又不克不及被虚拟机分派给别人用。

  设置JVM参数-:+HeapDumpOnOutOfMemoryError,设定当发生OOM时从动dump出堆消息。不外该方式需要JDK5以上版本。

  方式区:用于存储曾经被JVM加载的类消息、常量、静态变量、立即编译器编译后的代码等数据。Hotspot中的“永世代”。

  jhat:JDK自带的java heap analyze tool,能够将堆中的对象以html的形式显示出来,包罗对象的数量,大小等等,并支撑对象查询言语OQL,阐发相关的使用后,能够通过来拜候阐发成果。不保举利用,由于正在现实的排查过程中,一般是先正在出产 dump出文件来,然后拉到本人的开辟机械上阐发,所以,不如采用高级的阐发东西好比前面的mat来的高效。

  mat: eclipse memory analyzer, 基于eclipse RCP的内存阐发东西。细致消息拜见:,保举利用。

  JAVA堆:对象内存分派的处所,内存垃圾收受接管的次要区域,所程共享。可分为重生代,老生代。

  正在之前没有垃圾从动收受接管的日子里,好比C言语和C++言语,我们必需亲身傲责内存的申请取操做,若是申请了内存,用完后又健忘了,好比C++中的new了可是没有delete,那么就可能形成内存泄露。偶尔的内存泄露可能不会形成问题,而大量的内存泄露可能会导致内存溢出。

  java.lang.OutOfMemoryError: Java heap space ------java堆内存溢出,此种环境最常见,一般因为内存泄露或者堆的大小设置不妥惹起。对于内存泄露,需要通过内存软件查找法式中的泄露代码,而堆大小能够通过虚拟机参数-Xms,-Xmx等点窜。

  java.lang.OutOfMemoryError: PermGen space ------java永世代溢出,即方式区溢出了,一般呈现于大量Class或者jsp页面,或者采用cglib等反射机制的环境,由于上述环境会发生大量的Class消息存储于方式区。此种环境能够通过更改方式区的大小来处理,利用雷同-:PermSize=64m -:MaxPermSize=256m的形式点窜。别的,过多的常量特别是字符串也会导致方式区溢出。

  java.lang.StackOverflowError ------不会抛OOM error,但也是比力常见的Java内存溢出。JAVA虚拟机栈溢出,一般是因为法式中存正在死轮回或者深度递归挪用形成的,栈大小设置太小也会呈现此种溢出。能够通过虚拟机参数-Xss来设置栈的大小。

  利用JDK自带的jmap号令。jmap -dump:format=b,file=heap.bin pid 此中pid能够通过jps获取。

  比来查找了良多关于OOM,以至于Java内存办理以及JVM的相关材料,发觉这方面的工具太多了,竟有一种目炫狼籍的感受,要想领会全面的话,恐非一篇文章能说清的,因而按照本人的理解拾掇了一篇,剩下的还需要继续进修。

  dump堆内存消息后,需要对dump出的文件进行阐发,从而找到OOM的缘由。常用的东西有:

  留意:由于JVM规范没有对dump出的文件的格局进行定义,所以分歧的虚拟机发生的dump文件并不是一样的。正在阐发时,需要针对分歧的虚拟机的输出采用分歧的阐发东西(当然,有的东西能够兼容多个虚拟机的格局)。IBM HeapAnalyzer也是阐发heap的一个常用的东西。