如何回答解决OOM类问题

这期内容当中小编将会给大家带来有关如何回答解决OOM类问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

站在用户的角度思考问题,与客户深入沟通,找到福贡网站设计与福贡网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、成都网站制作、企业官网、英文网站、手机端网站、网站推广、域名注册、网络空间、企业邮箱。业务覆盖福贡地区。

上次出去划水被问道如何快速解决线上OOM问题,由于本人菜鸡一个答不是很好,因此回来查阅资料和咨询了一下其它大佬总结了一下。

一、为什么会OOM

主要是以下两点:

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

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

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

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

 

二、OOM的类型有哪些

按照JVM规范,除了程序计数器不会抛出OOM外,其他各个内存区域都可能会抛出OOM。

JAVA虚拟机在运行时会管理以下的内存区域:

1、程序计数器:当前线程执行的字节码的行号指示器,线程私有。

2、JAVA虚拟机栈:Java方法执行的内存模型,每个Java方法的执行对应着一个栈帧的进栈和出栈的操作。

3、本地方法栈:类似“ JAVA虚拟机栈 ”,但是为native方法的运行提供内存环境。

4、JAVA堆:对象内存分配的地方,内存垃圾回收的主要区域,所有线程共享。可分为新生代,老生代。

5、方法区:用于存储已经被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Hotspot中的“永久代”。

6、运行时常量池:方法区的一部分,存储常量信息,如各种字面量、符号引用等。

7、直接内存:并不是JVM运行时数据区的一部分, 可直接访问的内存, 比如NIO会用到这部分。

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

1、java.lang.OutOfMemoryError: Java heap spacejava

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

2、java.lang.OutOfMemoryError: PermGen spacejava

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

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

 

三、如何分析OOM问题

分析OOM我们必须获取dump堆的内存镜像。

可以采用如下两种方式:

1、设置JVM参数

-XX:+HeapDumpOnOutOfMemoryError,设定当发生OOM时自动dump出堆信息。不过该方法需要JDK5以上版本。

2、使用JDK自带的jmap命令。"jmap -dump:format=b,file=heap.bin"其中pid可以通过jps获取。dump堆内存信息后,需要对dump出的文件进行分析,从而找到OOM的原因。常用的工具有:

① mat:eclipse memory analyzer, 基于eclipse RCP的内存分析工具。详细信息参见:http://www.eclipse.org/mat/,推荐使用。

②jhat:JDK自带的java heap analyze tool,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言OQL,分析相关的应用后,可以通过http://localhost:7000来访问分析结果。不推荐使用,因为在实际的排查过程中,一般是先在生产环境 dump出文件来,然后拉到自己的开发机器上分析,所以,不如采用高级的分析工具,如前面的mat来的高效。

网上这个链接:https://0x9.me/c9jS1中提供了一个采用mat分析的例子 。

注意:因为JVM规范没有对dump出的文件的格式进行定义,所以不同的虚拟机产生的dump文件并不是一样的。在分析时,需要针对不同的虚拟机的输出采用不同的分析工具(当然,有的工具可以兼容多个虚拟机的格式)。IBM HeapAnalyzer也是分析heap的一个常用的工具。

上述就是小编为大家分享的如何回答解决OOM类问题了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


网站名称:如何回答解决OOM类问题
标题网址:http://hbruida.cn/article/ihihos.html